Sign in to follow this  

Question about D3DXVec3TransformCoord

This topic is 2439 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

We are trying to replace this direct x method with our own method. We tried just multiplying a matrix by a vector and got some very different results. What is this method doing that's different from simple multiplication?

Share this post


Link to post
Share on other sites
[font="Arial"][size="2"]When you multiply a 3D vector and a matrix the result is a 4D vector with w != 1. On the other hand [/size][/font][font="Arial"][size="2"]D3DXVec3TransformCoord returns a 3D vector, which is a 4D vector projected back to w = 1.[/size][/font]

Share this post


Link to post
Share on other sites
Here's an example of a transform matrix we are using:

0 0 -1 0
1 0 0 0
0 -1 0 0
0 0 0 1

When we multiply this matrix by the unit vector: (0, 0, 1) using D3DXVecTransformCoord, we get (0, -1, 0) as a result. However, when we use our multiplication method we get (-1, 0, 0) as a result.

Here's our multiplication method: It ignores the 4th dimension since it shouldn't be needed for our purposes... as you can see, the transform matrix is equal to the identity matrix in the 4th dimensional positions.

[code]
INLINE Vector3D
Matrix::operator* (const Vector3D vector)
{
return Vector3D (m11 * vector.x + m12 * vector.y + m13 * vector.z,
m21 * vector.x + m22 * vector.y + m23 * vector.z,
m31 * vector.x + m32 * vector.y + m33 * vector.z);
}
[/code]

Share this post


Link to post
Share on other sites
It appears you should be multiplying the row vector by the matrix columns, rather than the other way 'round. I.e.,

m11*x + m21*y + m31*z = 0

m12*x + m22*y + m32*z = -1

m13*x + m23*y + m33*z = 0

Also, if you're going to "ignore" the 4th elements, then you should be using/comparing-to D3DXTransformNormal.

Share this post


Link to post
Share on other sites

This topic is 2439 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.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this