Open Dynamics Engine (ODE)

Класс: ??

Phantom3D поддерживает ODE - популярный свободный физический движок.
При помощи ODE вы можете создать объекты, которые ведут себя как в реальности, т.е. подчинены законам физики. Такие объекты называются телами (body). Тела в ODE бывают двух типов - статические и динамические. Динамические тела подчинены различным силам (силе тяжести, трения, линейным и вращающим импульсам и т.д.), которые приводят их в движение. Статические тела неподвижны.

Все тела в ODE представлены геометрическими объектами, определяющими характер их взаимодействий. Эти объекты (геометрии) включают сферу, прямоугольный параллелепипед, плоскость, конус, цилиндр, цилиндр с верхушкой и полигональная сетка. Вы можете использовать сколь угодно сложные полигональные объекты, которые будут представлены в ODE как простые параллелепипеды или цилиндры, и таким образом получите выйгрыш в производительности.

Тела соединяются друг с другом при помощи сочленений (joint). Это невидимые объекты, которые удерживают тела на некотором расстоянии и/или под определенным углом относительно друг от друга, одновременно предоставляя им ограниченную свободу движения или вращения.

Когда сочленение создано, ничто не препятствует его движению в любом направлении. Этот диапазон движений может быть ограничен при помощи остановок (stops) в сочленении. Угол или позиция сочленения будут предохранены от достижения меньше заданного минимального порога или превышения заданного верхнего порога.
Так же как и остановки, многие типы сочленений могут иметь двигатели (motors). Двигатели прикладывают вращающую или линейную силу к сочленениям для достижения желаемой скорости в точке вращения или скольжения. Двигатели имеют два параметра: желаемая скорость и максимальная сила, с помощью которой может быть достигнута эта скорость.

Примечание: для использования ODE необходимо скопировать файлы PhantomODE.dll, libode.dll и libopcode.dll в директорию с проектом.


OdeWorldCreate

real = OdeWorldCreate();
Создает мир ODE.

OdeWorldStep

real = OdeWorldStep( delta as real );
Совершает шаг интегрирования с использованием метода большой матрицы, который требует времени расчета порядка m3 и памяти порядка m2, где m - общее количество строк матрицы. Для больших систем требуется много памяти, скорость работы будет низка, но на текущий момент это самый точный метод.
delta - размер шага.

OdeWorldQuickStep

real = OdeWorldQuickStep( delta as real );
Совершает шаг интегрирования с использованием метода итераций, который требует времени порядка m*N и памяти порядка m, где m - общее количество строк матрицы и N - количество итераций. Для больших систем это работает намного быстрее, чем OdeWorldStep, но менее точно. OdeWorldQuickStep отлично подходит для большого количества объектов, особенно вместе с автовыключением (см. ниже). Тем не менее, метод обладает не очень высокой точностью для неустойчивых систем (near-singular). Система может становиться неустойчивой, когда используются контакты с сильным трением, двигатели и определенные составные структуры. Например, робот с несколькими ногами. Увеличение итераций может немного помочь, но не сильно, если система неустойчива.
delta - размер шага.

OdeWorldSetQuickStepNumIterations

real = OdeWorldSetQuickStepNumIterations( num as real );
Задает количество итераций, которые использует OdeWorldQuickStep на каждом шаге расчета.
num - количество итераций.

OdeWorldSetGravity

real = OdeWorldSetGravity( x,y,z as real );
Задает вектор гравитации мира. Для Земли этот вектор будет соответствовать (0,-0.981,0).
x,y,z - вектор гравитации.

OdeWorldSetCFM

real = OdeWorldSetCFM( cfm as real );
Устанавливает CFM (Сonstraint Force Mixing - cмешивающая сила соединения ) поверхности тел мира - параметр, контролирующий так называемое "мягкое" сочленение тел.
Большинство сочленений по своей природе "жесткие". Это значит, что сочленение находится в определенных условиях, которые никогда не могут быть нарушены. Например, шарик всегда должен быть в разъеме, а сгибание должно происходит вдоль одной линии. На практике сочленения могут быть нарушены непреднамеренным возникновением ошибок в системе, но с помощью параметра уменьшения ошибки можно откорректировать эти ошибки.
Но не все соединения жестки. "Мягкие" соединения разработаны для того, чтобы специально быть нарушенными. Например, контактное соединение, которое предотвращает сталкивающиеся объекты от взаимного проникновения, по умолчанию жестко: это выглядит так, как будто сталкивающиеся поверхности сделаны из стали. Но для симуляции материалов помягче можно сделать мягкое соединение, тем самым позволив при взаимодействии двух объектов иметь место естественному проникновению.
Если CFM установлен в 0, соединение будет жестким. Если в CFM установлено положительное число, то появляется возможность нарушать сочленение смещением. Другими словами, соединение становится мягким, и мягкость будет нарастать с увеличением CFM. Происходит здесь следующее: сочленению позволяется быть нарушенным пропорционально CFM раз, восстанавливая силу, которая нужна для удержания соединения.
Утановка в CFM отрицательного значения может привести к непредсказуемым последствиям, включая снижение стабильности.

cfm - cмешивающая сила соединения.

OdeWorldSetERP

real = OdeWorldSetERP( erp as real );
Устанавливает ERP (Error Reduction Parameter - параметр уменьшения ошибки) поверхности тел мира - параметр, контролирующий силу возвращения тел на правильные позиции во время каждого шага для компенации ошибок при сочленении двух тел. Это необходимо, чтобы тела занимали определенное положение и ориентацию друг относительно друга.
ERP принимает значение от 0 до 1 и определяет пропорцию, в которой ошибка в сочленении будет исправляться в следующем шаге симуляции. Если ERP=0, то корректирующая сила прилагаться не будет, и тела будут перемещаться в соответствии с ходом симуляции. Если ERP=1, то будет предприниматься попытка исправить все ошибки в сочленениях на следующем шаге симуляции. Тем не менее, устанавливать ERP=1 не рекомендуется, поскольку ошибки в сочленении нельзя полностью устранить из-за различных внутренних округлений. Рекомендуется устанавливать значения от 0.1 до 0.8 (0.2 - значение по умолчанию).
Глобальное значение ERP воздействует на большинство сочленений симуляции. Тем не менее, некоторые сочленения могут иметь локальные значения ERP, которые контролируют определенные аспекты их поведения.

erp - параметр уменьшения ошибки.

OdeWorldSetContactMaxCorrectingVel

real = OdeWorldSetContactMaxCorrectingVel( vel as real );
Сведения отсутствуют.
vel - cведения отсутствуют.

OdeWorldSetContactSurfaceLayer

real = OdeWorldSetContactSurfaceLayer( layer as real );
Сведения отсутствуют.
layer - cведения отсутствуют.

OdeWorldSetAutoDisableFlag

real = OdeWorldSetAutoDisableFlag( flag as real );
Каждое тело может быть включено (enabled) или выключено (disabled). Включенные тела участвуют в симуляции, в то время как выключенные тела деактивированы, и их состояния не обновляются во время шагов симуляции. Новые тела всегда создаются во включенном состоянии. Выключенные тела, которые соединены сочленениями (joint) с включенными телами, автоматически включаются на следующем шаге симуляции.
Выключенные тела не тратят время процессора, поэтому неподвижные тела надо отключать. Это может быть сделано автоматически при помощи возможностей автовыключения (AutoDisable).
Если флаг авто-выключения установлен, то тела будут автоматически выключаться, если:
1) Они будут бездействовать заданное количество шагов симуляции;
2) Они будут бездействовать заданное время симуляции.
Тело считается бездействующим, если величина линейной и угловых скоростей меньше заданного порога. Таким образом, каждое тело имеет пять параметров автовыключения: флаг включения (flag), количество шагов бездействия (steps), время бездействия (time), пороги линейной (linear threshold) и угловой (angular threshold) скорости. Только что созданные тела берут эти параметры из менеджера ODE.

flag - true или false (по умолчанию false).

OdeWorldSetAutoDisableLinearThreshold

real = OdeWorldSetAutoDisableLinearThreshold( velocity as real );
Задает порог линейной скорости автовыключения.
velocity - линейная скорость (по умолчанию 0.01).

OdeWorldSetAutoDisableAngularThreshold

real = OdeWorldSetAutoDisableAngularThreshold( velocity as real );
Задает порог угловой скорости автовыключения.
velocity - угловая скорость (по умолчанию 0.01).

OdeWorldSetAutoDisableSteps

real = OdeWorldSetAutoDisableSteps( steps as real );
Задает количество шагов бездействия автовыключения.
steps - количество шагов (по умолчанию 10).

OdeWorldSetAutoDisableTime

real = OdeWorldSetAutoDisableTime( time as real );
Задает время бездействия автовыключения.
time - время (по умолчанию 0).

OdeWorldDestroy

real = OdeWorldDestroy();
Уничтожает мир ODE.

OdeClose

real = OdeClose();
Высвобождает память из-под ODE.

OdeHashSpaceCreate

real = OdeHashSpaceCreate( space as real );
Сведения отсутствуют.
space - cведения отсутствуют.

OdeSpaceCollide

real = OdeSpaceCollide( space as real );
Сведения отсутствуют.
space - cведения отсутствуют.

OdeBodyCreate

real = OdeBodyCreate();
Высвобождает память из-под ODE.

OdeBodySetMass

real = OdeBodySetMass( body,mass as real );
Сведения отсутствуют.
space - cведения отсутствуют.

OdeBodySetPosition

real = OdeBodySetPosition( body,x,y,z as real );
Сведения отсутствуют.
space - cведения отсутствуют.

OdeMassCreate

real = OdeMassCreate();
Сведения отсутствуют.

OdeCreateSphere

real = OdeCreateSphere( space,radius as real );
Сведения отсутствуют.
space - cведения отсутствуют
radius - cведения отсутствуют.

OdeGeomSetBody

real = OdeGeomSetBody( geom,body as real );
Сведения отсутствуют.
geom - cведения отсутствуют
body - cведения отсутствуют.

OdeGeomGetPosition

real = OdeGeomGetPosition( geom,ind as real );
Сведения отсутствуют.
geom - cведения отсутствуют
ind - cведения отсутствуют.

OdeGeomGetRotation

real = OdeGeomGetRotation( geom,ind as real );
Сведения отсутствуют.
geom - cведения отсутствуют
ind - cведения отсутствуют.

OdeGeomGetMatrix

real = OdeGeomGetMatrix( geom,matrix as real );
Сведения отсутствуют.
geom - cведения отсутствуют
matrix - cведения отсутствуют.