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