ogre世界座標魚螢幕座標相互轉換

小 樓 一 夜 聽 春 雨發表於2014-05-08
bool worldCoordToScreen(Vector3 objPos, Camera* cam, Vector2 screenRect,  Vector2& screenPos)
{
Matrix4 viewMatrix = cam->getViewMatrix();
Matrix4 projMatrix = cam->getProjectionMatrix();
 
Vector4 in = Vector4(objPos.x, objPos.y, objPos.z, 1.0);
Vector4 out = viewMatrix * in;
out = projMatrix * out;
 
if(out.w <= 0.0) return false;    // out.w<0時,objPos 在攝像機背面
 
out.x /= out.w;
out.y /= out.w;
out.z /= out.w;
 
// Map x, y and z to range 0-1
out.x = out.x * 0.5 + 0.5;
out.y = out.y * 0.5 + 0.5;
out.z = out.z * 0.5 + 0.5;
 
// Map x,y to viewport
out.x = out.x * screenRect.x;
out.y = (1-out.y) * screenRect.y;
 
screenPos.x = out.x;
screenPos.y = out.y;
 
return true;
}

 

  virtual void mousePressed(MouseEvent* e)
    {
        // Left mouse button down
        if (e->getButtonID() & MouseEvent::khyJh"@BUTTON0_MASK)
        {
            // Setup the ray scene query
            Ray mouseRay = mCamera->getCameraToViewportRay( e->getX(), e->getY() );
            mRaySceneQuery->setRay( mouseRay );

            // Execute query
            RaySceneQueryResult &result = mRaySceneQuery->execute();
            RaySceneQueryResult::iterator itr = result.begin( );

            // Get results, create a node/entity on the position
            if ( itr != result.end() && itr-&gkhyJh"@t;worldFragment )
            {
                char name[16];
                sprintf( name, "Robot%d", mCount++ );

                Entity *ent = mSceneMgr->createEntity( name, "robot.mesh" );
                mCurrentObject = mSceneMgr->getRootSceneNode( )->createChildSceneNode( String(name) + "Node", itr->worldFragment->singleIntersection );
                mCurrentObject->attachObject( ent );
                mCurrekhyJh"@ntObject->setScale( 0.1f, 0.1f, 0.1f );
            } // if

            mLMouseDown = true;
        } // if

        // Right mouse button down
        else if (e->getButtonID() & MouseEvent::BUTTON1_MASK)
        {
            mRMouseDown = true;
            CEGUI::MouseCursor::getSingleton().hide( );
        } // else if
    } // mousePressed

相關文章