Jump to content

  • Log In with Google      Sign In   
  • Create Account


Question about D3DXVec3TransformCoord


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
5 replies to this topic

#1 daedalic   Members   -  Reputation: 104

Like
0Likes
Like

Posted 12 April 2011 - 06:16 PM

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?

Sponsor:

#2 MJP   Moderators   -  Reputation: 10268

Like
0Likes
Like

Posted 12 April 2011 - 07:00 PM

If "vec" is the vector your transforming, it transforms (vec.x, vec.y, vec.z, 1.0f) by the transform matrix. It then divides the result by w.

#3 TiagoCosta   Crossbones+   -  Reputation: 1879

Like
0Likes
Like

Posted 12 April 2011 - 07:03 PM

When you multiply a 3D vector and a matrix the result is a 4D vector with w != 1. On the other hand D3DXVec3TransformCoord returns a 3D vector, which is a 4D vector projected back to w = 1.
Tiago Costa
Aqua Engine - my DirectX 11 game "engine" - In development

#4 daedalic   Members   -  Reputation: 104

Like
0Likes
Like

Posted 12 April 2011 - 08:07 PM

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.

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


#5 Buckeye   Crossbones+   -  Reputation: 3818

Like
1Likes
Like

Posted 12 April 2011 - 10:20 PM

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.

Please don't PM me with questions. Post them in the forums for everyone's benefit, and I can embarrass myself publicly.


#6 daedalic   Members   -  Reputation: 104

Like
0Likes
Like

Posted 12 April 2011 - 11:26 PM

The problem was that I had assumed DirectX used column vectors instead of row vectors. So that takes care of that problem. Thanks!




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