Hi i found that i got inconsistent reading from Geom.getRotation
it seems that ODE continuosly move matrix structures around so we need an updateReference before every read. (I think we also need to call updateReference also before getPosition while getQuaternion always copy the correct ode quaternion)
I don’t know if this is correct ODE behaviour or is caused by some other bug.
I also found that indices for both body.setRotation and geom.setRotation were wrong and different from the ones from getRotation (as ODE uses always vectors of 4 element even if it needs only 3)
so here’s my cumulative patch for both of this bug.
Index: Geom.java
RCS file: /cvs/odejava/odejava/src/org/odejava/Geom.java,v
retrieving revision 1.4
diff -r1.4 Geom.java
136,141c136,141
< Ode.floatArray_setitem(tmpArray, 3, r.getElement(1, 0));
< Ode.floatArray_setitem(tmpArray, 4, r.getElement(1, 1));
< Ode.floatArray_setitem(tmpArray, 5, r.getElement(1, 2));
< Ode.floatArray_setitem(tmpArray, 6, r.getElement(2, 0));
< Ode.floatArray_setitem(tmpArray, 7, r.getElement(2, 1));
< Ode.floatArray_setitem(tmpArray, 8, r.getElement(2, 2));
Ode.floatArray_setitem(tmpArray, 4, r.getElement(1, 0)); Ode.floatArray_setitem(tmpArray, 5, r.getElement(1, 1)); Ode.floatArray_setitem(tmpArray, 6, r.getElement(1, 2)); Ode.floatArray_setitem(tmpArray, 8, r.getElement(2, 0)); Ode.floatArray_setitem(tmpArray, 9, r.getElement(2, 1)); Ode.floatArray_setitem(tmpArray, 10, r.getElement(2, 2));
172a173
updateReferences();
202a204
updateReferences();
Index: Body.java
RCS file: /cvs/odejava/odejava/src/org/odejava/Body.java,v
retrieving revision 1.27
diff -r1.27 Body.java
296,301c298,303
< Ode.floatArray_setitem(tmpArray, 3, r.getElement(1, 0));
< Ode.floatArray_setitem(tmpArray, 4, r.getElement(1, 1));
< Ode.floatArray_setitem(tmpArray, 5, r.getElement(1, 2));
< Ode.floatArray_setitem(tmpArray, 6, r.getElement(2, 0));
< Ode.floatArray_setitem(tmpArray, 7, r.getElement(2, 1));
< Ode.floatArray_setitem(tmpArray, 8, r.getElement(2, 2));
Ode.floatArray_setitem(tmpArray, 4, r.getElement(1, 0)); Ode.floatArray_setitem(tmpArray, 5, r.getElement(1, 1)); Ode.floatArray_setitem(tmpArray, 6, r.getElement(1, 2)); Ode.floatArray_setitem(tmpArray, 8, r.getElement(2, 0)); Ode.floatArray_setitem(tmpArray, 9, r.getElement(2, 1)); Ode.floatArray_setitem(tmpArray, 10, r.getElement(2, 2));
Would someone with CVS access check in this in HEAD?