Unterschiede zwischen den Revisionen 1 und 2
Revision 1 vom 2008-09-19 07:37:29
Größe: 3685
Kommentar:
Revision 2 vom 2008-09-19 07:49:48
Größe: 3793
Kommentar: Seite von Udo Freses Homepage importiert
Gelöschter Text ist auf diese Art markiert. Hinzugefügter Text ist auf diese Art markiert.
Zeile 13: Zeile 13:
 * Name your point/vector variables '''p_A''' if they represent the point p in coordinates of coordinate system A! If you know which coordinate system it refers to and you documented the sytems, you can debug, whether the value of such a variable is correct.  * Name your point/vector variables {{{ p_A }}} if they represent the point {{{ p }}} in coordinates of coordinate system {{{ A }}}! If you know which coordinate system it refers to and you documented the sytems, you can debug, whether the value of such a variable is correct.
Zeile 15: Zeile 15:
 * Name your transformation variables '''A2B''' if it converts a point p in A-coordinates '''p_a''' to the same point in '''p_B''' in B coordinates, so p_B = A2B * p_A. If A2B is a matrix, then the colums of A2B are the X/Y/Z/origin of A in B coordinates. If you know that and have documented your coordinate systems, you can debug whether the value of a transformation variable is correct.  * Name your transformation variables {{{ A2B }}} if it converts a point p in A-coordinates {{{ p_a }}} to the same point in {{{ p_B }}} in B coordinates, so {{{p_B = A2B * p_A}}}. If {{{ A2B }}} is a matrix, then the colums of {{{ A2B }}} are the X/Y/Z/origin of {{{ A }}} in {{{ B }}} coordinates. If you know that and have documented your coordinate systems, you can debug whether the value of a transformation variable is correct.
Zeile 17: Zeile 17:
 * If you name your variables according to the above convention, you can see whether an expression is correct just by reading it from right to left. p_Camera = Camera2World^{-1}*Object2``World*p_Object is correct, because Object2``World transforms p_Object into p_World, Camera2``World^{-1} is World2``Camera and transforms p_World into p_Camera. There are 8 ways to write down this equation! 7 are wrong. This problem is the most common reason for bugs in 3D programs and it's trivial with the appropriate naming convention.  * If you name your variables according to the above convention, you can see whether an expression is correct just by reading it from right to left. {{{p_Camera = Camera2World^{-1}*Object2World*p_Object} is correct, because Object2``World transforms p_Object into p_World, {{{ Camera2World^{-1} }}} is World2``Camera and transforms p_World into p_Camera. There are 8 ways to write down this equation! 7 are wrong. This problem is the most common reason for bugs in 3D programs and it's trivial with the appropriate naming convention.
Zeile 21: Zeile 21:
 * If you have a hierarchy of transformations use '''Local2``Global''' not Global2``Local for the same reason as above.  * If you have a hierarchy of transformations use {{{ Local2Global }}} not {{{ Global2Local }}} for the same reason as above.
Zeile 25: Zeile 25:
 * Don't simply try adding ^{-1} or ^T or permuting matrix terms! There are many computations that are wrong but look almost right. And even if they look completely right, the value of internal variable may be incompatible to their documented definition and as a result if you add new correct code the result may be wrong.
 * With 4*4 homogenous matrices you never need ^T only ^{-1}. For 3*3 orthonormal matrices, both are the same.
 * Don't simply try adding {{{ ^{-1} }}} or {{{ ^T }}} or permuting matrix terms! There are many computations that are wrong but look almost right. And even if they look completely right, the value of internal variable may be incompatible to their documented definition and as a result if you add new correct code the result may be wrong.
 * With 4*4 homogenous matrices you never need {{{ ^T }}} only {{{ ^{-1} }}}. For 3*3 orthonormal matrices, both are the same.

Hints for 3D Programming

Programming in 3D is difficult as everyone knows who has tried to do it. It is particularily difficult because it is easy to program something that looks almost but is wrong nevertheless. Here are some hints from my personal experience. The key is to address 3D transformations and coordinate systems in a more formal and rigorous way then just by try and error. I believe sticking to the following procedure greatly helps to find errors.

  • First assign and document coordinate systems! Assign a coordinate system to the world and every body which is moving. You can view everything as a transformation of points between coordinate systems.
  • If a body is moving, there is a coordinate system at each point of time. Motion is described as a transformation of points from the body coordinate system at one time step to the bodies coordinate system at another point of time.
  • My personal recommendation: X-Right, Y-Forward, Z-Up for world and vehicle/body coordinates, because it is easy to visualize with your right hand. X-Right, Y-Down, Z-Front for a camera, because then camera X/Y correspond to image x/y.
  • Represent the scene inside your program by 4*4 homogenous matrices (or quarternions if you want to) that encode the transformation of a point from one coordinate system into another.
  • Name your point/vector variables  p_A  if they represent the point  p  in coordinates of coordinate system  A ! If you know which coordinate system it refers to and you documented the sytems, you can debug, whether the value of such a variable is correct.

  • Name your transformation variables  A2B  if it converts a point p in A-coordinates  p_a  to the same point in  p_B  in B coordinates, so p_B = A2B * p_A. If  A2B  is a matrix, then the colums of  A2B  are the X/Y/Z/origin of  A  in  B  coordinates. If you know that and have documented your coordinate systems, you can debug whether the value of a transformation variable is correct.

  • If you name your variables according to the above convention, you can see whether an expression is correct just by reading it from right to left. p_Camera = Camera2World^{-1}*Object2World*p_Object} is correct, because Object2``World transforms p_Object into p_World, {{{ Camera2World^{-1}  is World2Camera and transforms p_World into p_Camera. There are 8 ways to write down this equation! 7 are wrong. This problem is the most common reason for bugs in 3D programs and it's trivial with the appropriate naming convention.

  • Use A2World rather than World2A because it's easier to imagine the objects X/Y/Z axis or origin in world coordinates than vice versa.

  • If you have a hierarchy of transformations use  Local2Global  not  Global2Local  for the same reason as above.

  • If something doesn't work, go through the sequence of computations and debug whether the value in the variables corresponds to their documented definition.
  • Don't simply try adding  ^{-1}  or  ^T  or permuting matrix terms! There are many computations that are wrong but look almost right. And even if they look completely right, the value of internal variable may be incompatible to their documented definition and as a result if you add new correct code the result may be wrong.

  • With 4*4 homogenous matrices you never need  ^T  only  ^{-1} . For 3*3 orthonormal matrices, both are the same.

  • If you are estimating transformations in a calibration or tracking setting (for instance using Levenberg-Marquardt), represent the current estimate as a matrix / quarternion and parametrize only the change in a single step with tree variable, e.g. using matrix exponential.