GetPoint() and PointMultiply() new behaviour!!!
David Gobbi
dgobbi at irus.rri.on.ca
Fri Apr 14 13:36:58 EDT 2000
Hi All,
In the current nightlies, VTK will now print a warning whenever you call
vtkMatrix4x4::PointMultiply(), or whenever you call
vtkTransform::GetPoint() when the vtkTransform is in PreMultiply mode.
The reason is this: when you multiply a vector by a matrix in VTK, 99%
of the time you want to treat the coordinate as a column vector, i.e.
(apologies to people using proportional fonts)
/ y[0] \ / A[0][0] A[0][1] A[0][2] A[0][3] \ / x[0] \
| y[1] | = | A[1][0] A[1][1] A[1][2] A[1][3] | * | x[1] |
| y[2] | | A[2][0] A[2][1] A[2][2] A[2][3] | | x[2] |
\ y[3] / \ A[3][0] A[3][1] A[3][2] A[3][3] / \ x[3] /
whereas vtkMatrix4x4::PointMultiply() will treat the coordinate as a
row vector,
( y[0] y[1] y[2] y[3] ) = ( x[0] x[1] x[2] x[3] ) * A
This is mathematically equivalent to multiplying a column vector by
the transpose of the matrix. The times when you really want to do
this are very rare, in both my own code and the VTK code I found
that every time PointMultiply was being called, the multiplication
was _meant_ to be done with a column vector but some mistake had
transposed the matrix! Note that for rotation-only matrices,
iverting the matrix will have the same effect as transposing it.
The frightening part is this: vtkTransform::GetPoint() uses
vtkMatrix4x4::PointMultiply() whenever the transform is in
PreMultiply mode. This means that, the default behaviour of
GetPoint() is to multiply your coordinate by the _transpose_ of
the matrix! Most VTK users will not expect this behaviour,
so I thought it was worthwhile for VTK to print a warning.
I would advocate that people avoid SetPoint(), GetPoint()
altogether -- either use MultiplyPoint or, if you are using
VTK 3.1 or later, use TransformPoint(). Recent nightlies
also have TransformNormal() and TransformVector().
- David
--
David Gobbi, MSc dgobbi at irus.rri.on.ca
Advanced Imaging Research Group
Robarts Research Institute, University of Western Ontario
--------------------------------------------------------------------
This is the private VTK discussion list. Please keep messages on-topic.
Check the FAQ at: <http://public.kitware.com/cgi-bin/vtkfaq>
To UNSUBSCRIBE, send message body containing "unsubscribe vtkusers" to
<majordomo at public.kitware.com>. For help, send message body containing
"info vtkusers" to the same address.
--------------------------------------------------------------------
More information about the vtkusers
mailing list