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-1out.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 viewportout.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