Отрывок кода из tutorial.py:
#теперь создадим и настроим для наших боксов
#физическое тело. Это что б дать знать ОДЕ как
#применять к ним силы, какая у них масса, где центр масс и т.д.
boxBody = OdeBody(self.world)
M = OdeMass()
M.setBox(150, 1, 1, 1)
boxBody.setMass(M)
Цитата из документации к ODE http://opende.sourceforge.net/wiki/index.php/Manual_%28Support_Functions%29 :
void dMassSetBox (dMass *, dReal density, dReal lx, dReal ly, dReal lz);
void dMassSetBoxTotal (dMass *, dReal total_mass, dReal lx, dReal ly, dReal lz);
Set the mass parameters to represent a box of the given dimensions and density, with the center of mass at (0,0,0) relative to the body. The side lengths of the box along the x, y and z axes are lx, ly and lz. The first function accepts the density of the object, the second accepts its total mass.
Перевод цитаты:
Устанавливает параметр массы для бокса заданных размеров и плотности с центром масс в точке (0,0,0). Длина сторон вдоль осей x, y, и z задается lx, ly и lz соответственно. Первая функция принимает плотность объекта, вторая -- его общую массу.
Дело в том, что следуя Вашему примеру кода я не мог понять, почему куб размером 2х2х2 с "центром масс" в (2,2,2) ведет себя подозрительно правильно, в (1,1,1) - вполне сносно, в (0,0,0) - программа ловит ошибку, а в (-1,-1,-1) - куб пролетает пол. Вот и оказалось, что последние 3 параметра задают размеры объекта. Получается, описывая тело, нужно его размеры указывать два раза: один раз для физической абстракции, второй для геометрической (OdeBoxGeom). Вот кусок примера из дистрибутива ODE:
// chassis body
body[0] = dBodyCreate (world);
dBodySetPosition (body[0],0,0,STARTZ);
dMassSetBox (&m,1,LENGTH,WIDTH,HEIGHT);
dMassAdjust (&m,CMASS);
dBodySetMass (body[0],&m);
box[0] = dCreateBox (0,LENGTH,WIDTH,HEIGHT);
dGeomSetBody (box[0],body[0]);