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
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
else if (e->getbuttonid()
& mouseevent::button1_mask)
mrmousedown =
true;
cegui::mousecursor::getsingleton().hide(
} // else
} // mousepressed