Понедельник, 23 Декабря 2024, 07:44

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Пример физики ODE на Panda3D
serg-kkzДата: Среда, 07 Сентября 2011, 17:49 | Сообщение # 1
постоянный участник
Сейчас нет на сайте
Пример создания физики в панде, код на питоне. Здесь кубик, который падает на поверхность, поверхность не видимая. Для того чтоб увидеть как падает кубик нужно зажать правою кнопку мыши и провести мышью вперед.


Code
# -*- coding: utf_8 -*-
import direct.directbase.DirectStart
from pandac.PandaModules import *

world = OdeWorld() # Создадим объект ODE мир - контейнер для физических тел и сочленений
world.setGravity(0, 0, -9.81) # Установим силу гравитации в мире по координате z,  равной земной.     

world.initSurfaceTable(1) # Создадим таблицу поверхностей и добавим значения характеристик поверхностей
world.setSurfaceEntry(0, 0, 150, 0.0, 0, 1, 0.00001, 0.0, 0.002)

# Создание контактных группы для хранения соединений
space = OdeSimpleSpace()
space.setAutoCollideWorld(world)
contactgroup = OdeJointGroup()
space.setAutoCollideJointGroup(contactgroup)

# Настройка модели для визуализации
boxMod = loader.loadModel("box") # Загружаем модель
boxMod.setPos(0, 0, 3) # Устанавливаем координаты расположения модели
boxMod.reparentTo(render) # Прикрепляем к узлу рендера для визуализации

# Добавление в мир ODE физической модели и настройка
boxBody = OdeBody(world) # Создадим тело ODE
M = OdeMass() # Создаем массу ODE
M.setBox(60, 1, 1, 1) #  Устанавливаем массе параметры бокса, вес и соотношение распределение веса
boxBody.setMass(M) #  Устанавливаем настроенною массу телу

# Создание пораметров геометрии
boxGeom = OdeBoxGeom(space, 1, 1, 1) #  Создаем ODE геометрию, бокс и  устанавливаем размеры
boxGeom.setBody(boxBody) #  Устанавливаем геометрии настроенное физическое тело
boxGeom.setPosition(boxMod.getPos()) #  Устанавливаем позицию геометрии равной модели
boxGeom.setQuaternion(boxMod.getQuat()) #  Устанавливаем ориентацию геометрии равной модели

# Добавление поверхности на которую будет падать кубик, она не видима.
groundGeom = OdePlaneGeom(space, Vec4(0, 0, 1, 0)) # Создаем объект ODE, плоскость     

# функция симуляции синхронизации
def simulation(task):     
        space.autoCollide() # Устанавливаем соединения в авто
        world.quickStep(globalClock.getDt()) # Шаг симуляции за время последнего рендеринга
        boxMod.setPosQuat(boxGeom.getPosition(), Quat(boxGeom.getQuaternion())) # Синхронизация модели с геометрией тела
        contactgroup.empty() # Очищаем контакты
        return task.cont #  Возвращаем задачу менеджеру для повторения

taskMgr.doMethodLater(3, simulation, "Physics") #  Менеджер для запуска функции симуляции. Задержка 3 секунды чтоб можно было увидеть начало падения кубика.
run()




Сообщение отредактировал serg-kkz - Среда, 07 Сентября 2011, 23:50
KornivalДата: Среда, 07 Сентября 2011, 18:01 | Сообщение # 2
The Witcher
Сейчас нет на сайте
Спасибо большое. Я уже думал, что ты забыл об уроке biggrin Читая мануал мне показалось, что с PhysX реализовать то же самое намного проще: не нужно создавать физическое тело и геометрию, это так?
serg-kkzДата: Среда, 07 Сентября 2011, 18:08 | Сообщение # 3
постоянный участник
Сейчас нет на сайте
Kornival, ну это минимальный код, есть еще туча нюансов. Не понял значения вопроса на конце, э... я должен что-то ответить.

Quote (Kornival)
не нужно создавать физическое тело и геометрию, это так?


KornivalДата: Среда, 07 Сентября 2011, 18:15 | Сообщение # 4
The Witcher
Сейчас нет на сайте
Quote (serg-kkz)
Не понял значения вопроса на конце

Ну судя по этому примеру, не нужно самому создавать физ. тело(в нашем случае OdeBody) и геометрию тела(в нашем случае OdeGeomBox) wacko
serg-kkzДата: Среда, 07 Сентября 2011, 19:02 | Сообщение # 5
постоянный участник
Сейчас нет на сайте
Kornival, я PhysX даже и не пробовал.

Добавлено (07.09.2011, 19:02)
---------------------------------------------
Kornival, ну я думаю ты знаешь, что есть вариант создать тримеш из данных модели и создать тримеш геометрию оде, можно так. Но я не вижу преобразований в том коде. Ты его проверял, он хоть работает?


KornivalДата: Среда, 07 Сентября 2011, 19:13 | Сообщение # 6
The Witcher
Сейчас нет на сайте
.
Quote (serg-kkz)
Kornival, ну я думаю ты знаешь, что есть вариант создать тримеш из данных модели и создать тримеш геометрию оде, можно так.

Да, тримеш-первое что я начал искать в мануале посмотрев твой урок)
Quote (serg-kkz)
Ты его проверял, он хоть работает?

Нет, не проверял.


Сообщение отредактировал Kornival - Среда, 07 Сентября 2011, 19:14
serg-kkzДата: Среда, 07 Сентября 2011, 19:16 | Сообщение # 7
постоянный участник
Сейчас нет на сайте
Quote (Kornival)
Да, тримеш-первое что я начал искать в мануале посмотрев твой урок)

Kornival, могу показать на этом, если нужно.


KornivalДата: Среда, 07 Сентября 2011, 19:22 | Сообщение # 8
The Witcher
Сейчас нет на сайте
Quote (serg-kkz)
Kornival, могу показать на этом, если нужно.

Ну наверное строчку
Quote (serg-kkz)
boxGeom = OdeBoxGeom(space, 1, 1, 1)

заменить на
Code

boxGeom = OdeTriMeshGeom(OdeTriMeshData(boxMod))

???
Напиши если не так.


Сообщение отредактировал Kornival - Среда, 07 Сентября 2011, 19:23
serg-kkzДата: Среда, 07 Сентября 2011, 19:33 | Сообщение # 9
постоянный участник
Сейчас нет на сайте
Code
boxMod.flattenLight() # Сбрасываем транформацию (обязательно)

Code
boxGeom = OdeTriMeshGeom(space, OdeTriMeshData(boxMod))




Сообщение отредактировал serg-kkz - Четверг, 08 Сентября 2011, 00:23
KornivalДата: Среда, 07 Сентября 2011, 19:44 | Сообщение # 10
The Witcher
Сейчас нет на сайте
Thank
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг