Jump to content

  • Log In with Google      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.

  • You cannot reply to this topic
4 replies to this topic

#1 lonewolff   Members   -  Reputation: 421

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. Posted Image

Sponsor:

#2 stc.5421   Members   -  Reputation: 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.


#3 lonewolff   Members   -  Reputation: 421

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!

#4 lonewolff   Members   -  Reputation: 421

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 Posted Image

Edited by lonewolff, 10 December 2012 - 10:47 PM.


#5 lonewolff   Members   -  Reputation: 421

Like
0Likes
Like

Posted 10 December 2012 - 11:17 PM

I just sorted it out Posted Image

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 Posted Image

Edited by lonewolff, 11 December 2012 - 12:17 AM.





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.



PARTNERS