天天看点

ogre世界坐标鱼屏幕坐标相互转换

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