•      Sign In
• Create Account

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

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

4 replies to this topic

### #1DarkRonin  Members

1077
Like
0Likes
Like

Posted 06 December 2012 - 07:03 PM

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.
Win32 Developer
One Of Them - Martial arts game that is mid development.

### #2stc.5421  Members

119
Like
2Likes
Like

Posted 06 December 2012 - 11:47 PM

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, 07 December 2012 - 12:12 AM.

### #3DarkRonin  Members

1077
Like
0Likes
Like

Posted 07 December 2012 - 03:13 PM

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!
Win32 Developer
One Of Them - Martial arts game that is mid development.

### #4DarkRonin  Members

1077
Like
0Likes
Like

Posted 10 December 2012 - 10:45 PM

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, 10 December 2012 - 10:47 PM.

Win32 Developer
One Of Them - Martial arts game that is mid development.

### #5DarkRonin  Members

1077
Like
0Likes
Like

Posted 10 December 2012 - 11:17 PM

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, 11 December 2012 - 12:17 AM.

Win32 Developer
One Of Them - Martial arts game that is mid development.

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.