Главная » Файлы » Демки

ODE - продолжение + встроенные коллизии Panda3D
[Скачать с сервера (65.7Kb) ] 06.02.2009, 13:36
Категория: Демки | Добавил: ninth
Просмотров: 3142 | Загрузок: 314 | Комментарии: 4 | Рейтинг: 0.0/0
Всего комментариев: 4
1  
Клевый пример biggrin

2  
Отрывок кода из 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]);


3  
Не совсем так. Ваша проблема скорее всего вызвана несовпадением видимой геометрии и физической геометрии + некорректное задание массы. Обе функции никак не влияют на центр масс - они лишь указывают линейные размеры физического тела -> влияют на общую массу (плотность Х объём) и распределение массы относительно центра -> поведение при придании угловой скорости. Центр масс при этом остаётся в 0. Естественно, когда вы передали (0,0,0) в качестве параметров, то получили тело с нулевым объёмом и следовательно нулевой массой, на что программа ответила ошибкой.
Строго говоря, в примере масса действительно задана не совсем корректно - надо было бы M.setBox(150, sx, sy, sz) вместо M.setBox(150, 1, 1, 1), но в данном случае это не оказывает видимого влияния. Возможно, вас ввёл в заблуждение комментарий про установку центра масс - я всего лишь подразумевал что он (центр масс) относится к физическому телу.
А размеры параллелепипеда задаются даже не в двух местах, а в трёх:
boxNP.setScale(sx,sy,sz) - визуальная часть (Panda)
M.setBox(150, 1, 1, 1) - физическая (ODE)
boxGeom = OdeBoxGeom(self.space, sx,sy,sz) - геометрическая (ODE)

4  
Да, именно об этом я и написал. wink

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Онлайн всего: 1
Гостей: 1
Пользователей: 0