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