Calculate screen co-ords from a point in 3D space

This topic is 1866 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

Recommended Posts

Hi Guys,

I have a function where I can calculate the point in 3D space given x & y screen co-ordinates below;

[code]void Graphics::ScreenToWorld(float mousePosX,float mousePosY,float nDepth)
{
// Get matrices and the viewport.
D3DXMATRIX pm; // projection matrix
D3DXMATRIX vm; // view matrix
D3DXMATRIX wm; // world matrix
D3DVIEWPORT9 vp; // viewport
md3dDevice->GetTransform(D3DTS_PROJECTION,&pm);
md3dDevice->GetTransform(D3DTS_VIEW,&vm);
D3DXMatrixIdentity(&wm); // make the world matrix an identity matrix
md3dDevice->GetViewport(&vp);
// Call the D3DXVec3Unproject function twice to determine two points
// in our world space. Having two points we will be able to find
// a line in the world space. One point is for the z-near plane
// (which is usually z=0.0f) and another point is for z-far plane
// (which is usually z=1.0f). We grab the z-planes from the viewport.
D3DXVECTOR3 p1;
D3DXVec3Unproject(&p1, &D3DXVECTOR3(mousePosX,mousePosY, vp.MinZ), &vp, &pm, &vm, &wm);
D3DXVECTOR3 p2;
D3DXVec3Unproject(&p2, &D3DXVECTOR3(mousePosX,mousePosY, vp.MaxZ), &vp, &pm, &vm, &wm);
// We calculate an intersection of the line found previously
// with a plane z=0.0f. Equations of a line in 3-D space can
// be found on the following websites:
// http://mathforum.org...html#threelines
// http://mathforum.org...view/65721.html
// Here, wx, wy, and wz represent coordinates in the world space.
fWorldZ=nDepth;
fWorldX=((fWorldZ-p1.z)*(p2.x-p1.x))/(p2.z-p1.z)+p1.x;
fWorldY=((fWorldZ-p1.z)*(p2.y-p1.y))/(p2.z-p1.z)+p1.y;

// w is the point in the world space corresponding to the p point
// in the screen coordinates.
//D3DXVECTOR3 w(wx, wy, wz);
}[/code]

How would I do the opposite? If I had a point in the word x,y,z - how would I get the screen co-ordinates for that point?

Any help would be greatly appreciated. [img]http://public.gamedev.net//public/style_emoticons/default/cool.png[/img]

Share on other sites
Simply transform your 3d position by view projection matrix .
[CODE]
md3dDevice->GetTransform(D3DTS_PROJECTION,&pm);
md3dDevice->GetTransform(D3DTS_VIEW,&vm);
D3DXMATRIX vp;
D3DXMatrixMultiply( &vp, &vm, &pm );
D3DXVECTOR4 posBase;
D3DXVec4Transform(&posBase,&D3DXVECTOR4(m_positionVal.x,m_positionVal.y,m_positionVal.z,1.0f),&vp);
posBase.x/=posBase.w; // Screen space X pos
posBase.y/=posBase.w; // Screen space Y pos
posBase.z/=posBase.w;

[/CODE] Edited by stc.5421

Share on other sites
Awesome! I will give that a try when I get back in front of my dev rig tomorrow night.

Matrices are not my strong point. I'll let you know how it goes.

Thanks again!

Share on other sites
Hi stc.5421,

I turned your code snippet into a function as below, but the values for fScreenX and fScreenY remain at zero, no matter what the inputs are for world X,Y, & Z.

[CODE]
void Graphics::WorldToScreen(float fPosX,float fPosY,float fPosZ)
{
D3DXMATRIX pm;
D3DXMATRIX vm;
D3DXMATRIX vp;
md3dDevice->GetTransform(D3DTS_PROJECTION,&pm);
md3dDevice->GetTransform(D3DTS_VIEW,&vm);
D3DXMatrixMultiply(&vp,&vm,&pm);
D3DXVECTOR4 posBase;
//D3DXVec4Transform(&posBase,&D3DXVECTOR4(m_positionVal.x,m_positionVal.y,m_positionVal.z,1.0f),&vp);
D3DXVec4Transform(&posBase,&D3DXVECTOR4(fPosX,fPosY,fPosZ,1.0f),&vp);
fScreenX=(posBase.x/=posBase.w); // Screen space X pos
fScreenY=(posBase.y/=posBase.w); // Screen space Y pos
posBase.z/=posBase.w;
}
[/CODE]

Any help would be awesome [img]http://public.gamedev.net//public/style_emoticons/default/laugh.png[/img] Edited by lonewolff

Share on other sites
I just sorted it out [img]http://public.gamedev.net//public/style_emoticons/default/cool.png[/img]

It turns out the return values were relative. So, I modified the last couple of lines to get it back into pixels

[code]fScreenX=((posBase.x/=posBase.w)*1600+1600)/2; // Screen space X pos
fScreenY=-((posBase.y/=posBase.w)*900-900)/2; // Screen space Y pos[/code]

Thanks again for your help [img]http://public.gamedev.net//public/style_emoticons/default/biggrin.png[/img] Edited by lonewolff