Solved

# Calculate Screen Coordinates (Determine Screen Coordinates from World Coordinates of an object)

Posted on 2004-07-31
Medium Priority
1,681 Views
The Problem is: I can't fully understand this function wich calculates the screen coordinates of an given object in world coordinates:

inline void Calculate_Screen_Coordinates(float* pScreenX, float* pScreenY, D3DXVECTOR3* pVec)
{
tempX = pVec->x;
tempY = pVec->y;
tempZ = pVec->z;

tempX2 = ViewProjectionMatrix._11*tempX + ViewProjectionMatrix._21*tempY + ViewProjectionMatrix._31*tempZ + ViewProjectionMatrix._41;
tempY2 = ViewProjectionMatrix._12*tempX + ViewProjectionMatrix._22*tempY + ViewProjectionMatrix._32*tempZ + ViewProjectionMatrix._42;
tempW2 = ViewProjectionMatrix._14*tempX + ViewProjectionMatrix._24*tempY + ViewProjectionMatrix._34*tempZ + ViewProjectionMatrix._44;

// Here comes part wich i can't understand fully:
tempInvW2 = 1.0f/tempW2;

*pScreenX = (1.0f + (tempX2*tempInvW2))*0.5f*screenwidth;
*pScreenY = (1.0f - (tempY2*tempInvW2))*0.5f*screenheight;
}

In detail:
=============================================================
// Next line i can't understand ->
tempInvW2 = 1.0f/tempW2;
i only know that this is a faktor for the z coord because the screen has only x/y but i don't know
why 1.0f and why the variable name is tempInv like Invers ?

This line is clearly:
*pScreenX = (1.0f + (tempX2*tempInvW2))*0.5f*screenwidth;

This line seems me wrong:
*pScreenY = (1.0f - (tempY2*tempInvW2))*0.5f*screenheight;
==> i would say:
*pScreenY = (1.0f + (tempY2*tempInvW
because the viewport coordinates are from -1/-1 to 1/1 and the screen coords are beginning in the  left top corner at 0/0 therefore transform -1/-1 & 1/1 to 0/0 & 2/2 ?!

Can anybody explain this in detail ?
0
Question by:WolfgangKoenig
1 Comment

LVL 17

Accepted Solution

davebytes earned 500 total points
ID: 11743364
A similar question/explanation at:

W is the scaling factor for the viewport.  Dividing by it will get you into screen-relative space.  1.0/W is pre-calculating the inverse so that a multiply can be used -- it is only used twice, but still faster to calculate the inverseW once and multiply against it, rather than dividing twice (yes, division is THAT BAD).

The - is because the 0,0 in 3D screen coords is usually the BOTTOM left, need to flip Y to get it to the TOP left.

As you say, generated view coordinates will be in the range of [-1,1] so for x:
1 + [-1,1] => [0,2] * 0.5 => [0,1]
and for y:
1 - [-1,1] => [2,0] * 0.5 => [1,0]
thus flipping the Y axis on the screen properly.

Multiplying by height/width then gets into screen pixels.

d
0

## Featured Post

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.