Jump to content
• ### What is your GameDev Story?

• Advertisement

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

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

If you intended to correct an error in the post then please contact us.

## Recommended Posts

Hi Guys,

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

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); }

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.

#### Share this post

##### Share on other sites
Advertisement
Simply transform your 3d position by view projection matrix .
 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;  Edited by stc.5421

#### Share this post

##### 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 this post

##### 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.

 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; } 

Any help would be awesome Edited by lonewolff

#### Share this post

##### Share on other sites
I just sorted it out

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

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

Thanks again for your help Edited by lonewolff

#### Share this post

##### Share on other sites

• Advertisement
• Advertisement
• ### What is your GameDev Story?

In 2019 we are celebrating 20 years of GameDev.net! Share your GameDev Story with us.

(You must login to your GameDev.net account.)

• ### Popular Now

• 15
• 14
• 46
• 22
• 27
• Advertisement
• ### Forum Statistics

• Total Topics
634050
• Total Posts
3015242
×

## Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!