Открытый Динамический Движок

Руководство Пользователя v0.5

 

Russell Smith

Суббота 29 Мая, 2004

 

Авторские права на это документ принадлежат © 2001-2004 Russell Smith

 

Содержание

 

1. Введение

1.1. Возможности

1.2. Лицензия ODE

1.3. ODE сообщество

2. Как инсталлировать и использовать ODE

2.1. Инсталляция ODE

2.1.1. Сборка и запуск ODE тестов на MacOS X

2.2. Использование ODE

3. Понятия

3.1. На заметку

3.2. Жесткие тела

3.2.1. Острова и выключенные тела

3.3. Интегрирование

3.4. Аккумулятор силы

3.5. Сочленения и соединения

3.6. Группы сочленений

3.7. Ошибки в сочленениях и параметр уменьшения ошибки (ERP)

3.8. Мягкое соединение и смешивающая сила соединения (CFM)

3.8.1. Смешивающая сила соединения (CFM)

3.8.2. Как использовать ERP и CFM

3.9. Обработка столкновений

3.10. Типичный код симуляции

3.11. Физическая модель

3.11.1. Упрощение трения

4. Типы данных и соглашения

4.1. Основные типы данных

4.2. Объекты и их ID

4.3. Соглашения об аргументах

4.4. C против C++

4.5. Отладка

5. Мир

5.1. Функции шага

5.2. Параметры контакта

6. Функции жестких тел

6.1. Создание и уничтожение тел

6.2. Позиция и ориентация

6.3. Масса и сила

6.4. Утилиты

6.5. Автоматическое включение и выключение

6.6. Разнообразные функции тела

7. Типы сочленений и функции сочленений

7.1. Создание и уничтожение сочленений

7.2. Разнообразные функции сочленений

7.3. Функции установки параметров сочленения

7.3.1. Шарик-в-разъеме(ball and socket)

7.3.2. Сгибание(hinge)

7.3.3. Скольжение(slider)

7.3.4. Универсал(universal)

7.3.5. Сгибание-2(hinge-2)

7.3.6. Фиксация(fixed)

7.3.7. Контакт(contact)

7.3.8. Угловой двигатель(angular motor)

7.4. Общие

7.5. Параметры движения и остановки

7.5.1. Функции установки параметров

7.6. Установка напрямую силы/вращающего момента сочленения

8. StepFast

8.1. Когда использовать StepFast1

8.2. Когда НЕ стоит использовать StepFast1

8.3. Как это работает

8.4. Экспериментальные утилиты, входящие в состав StepFast1

8.5. API

9. Функции поддержки

9.1. Функции вращения

9.2. Функции массы

9.3. Математические функции

9.4. Функции памяти и ошибок

10. Определение столкновений

10.1. Точки контакта

10.2. Геометрия

10.3. Пространства

10.4. Основные функции геометрии

10.5. Определение столкновений

10.5.1. Битовые поля категории и столкновения

10.5.2. Функции определения столкновения

10.6. Функции пространств

10.7. Классы геометрии

10.7.1. Класс сфера

10.7.2. Класс прямоугольный параллелепипед

10.7.3. Класс плоскость

10.7.4. Класс цилиндр с верхушкой

10.7.5. Класс луч

10.7.6. Класс набор треугольников

10.7.7. Класс трансформации геометрии

10.8. Классы определенные пользователем

10.9. Составные объекты

10.10. Утилитарные функции

10.11. Замечания по реализации

10.11.1. Большие пространства

10.11.2. Использование другой библиотеки определения столкновений

11.Как сделать хорошую симуляцию

11.1. Точность и стабильность интегрирования

11.2. Поведение может зависеть от размера шага

11.3. Как сделать быстрее

11.4. Улучшение стабильности

11.5. Использование смешивающей силы соединения(CFM)

11.6. Избежание странного поведения

11.7. Другие замечания

12. FAQ

12.1. Как я могу присоединить тело к статическому окружению

12.2. Нужна ли для использования ODE графическая библиотека Х ?

12.3. Почему мои жесткие тела то отскакивают то проникают друг в друга при столкновении? Мой параметр восстановления первоначального состояния установлен в ноль!

12.4. Как можно создать неподвижное тело?

12.5. Почему желательно устанавливать ERP значение меньше единицы?

12.6. Лучше задавать скорость тела напрямую вместо прилаживания силы или вращающего момента?

12.7. Почему, когда к телу  присоединены другие тела с помощью сочленений, оно набирает скорость медленнее при заданной напрямую скорости?

12.8. Должен ли я приводить единицы измерения к 1.0 ?

12.9. Я сделал машину, но колеса не хотят оставаться на своих местах!

12.10. Как мне сделать "одностороннее" взаимодействие при столкновении

12.11. Windows версия ODE не работает с большими системами

12.12. Мои простые вращающиеся тела нестабильны!

12.13. Мои катящееся тела (напр. колеса) иногда застревают в геометрии

12.13.1. Проблема

12.13.2. Решение

13. Известный вопрос

14. Внутри ODE

14.1. Соглашение о хранении матриц

14.2. Часто Задаваемые Вопросы по внутреннему устройству

14.2.1. Почему некоторые структуры имеют префикс dx, а некоторые префикс d?

14.2.2. Возвращаемые вектора

 

1. Введение

 

Открытый Динамический Движок(Open Dynamics Engine, или ODE) это бесплатная библиотека промышленного качества, предназначенная для симуляции динамики составных жестких тел. Например она хорошо подходит для транспортных средств, существ с ногами и движущихся объектов в виртуальном пространстве. Она быстра, гибка и проста, имеет встроенное определение столкновений. ODE разрабатывает Rusell Smith(http://www.q12.org) с помощью нескольких помощников(http://opende.sourceforge.net/community.html).

 

Если выражение "симуляция поведения жесткого тела"(rigid body simulation) для вас ничего не значит, то посмотрите Что такое физический SDK(http://opende.sourceforge.net/slides/slides.html).

 

Это руководство пользователя ODE версии 0.5. Несмотря на маленький номер версии, ODE вполне развита и стабильна.

 

1.1. Возможности

 

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

 

ODE разработана для интерактивной симуляции или симуляции в реальном времени. Хорошо подходит для симуляции поведения движущихся объектов в изменяемом окружении виртуальной реальности. Поскольку ODE быстра, проста в использовании и стабильна, пользователь имеет полную свободу в изменении структуры системы даже во время симуляции.

 

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

 

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

 

ODE имеет встроенную систему определения столкновений. Тем не менее вы можете игнорировать ее и использовать свою, если хотите. Текущие примитивы, которые могут участвовать в столкновении, это сфера(sphere), прямоугольный параллелепипед(box), цилиндр с верхушкой (capped cylinder), плоскость (plane), луч (ray) и набор треугольников (triangular mesh) - большее количество объектов должно появиться позже. Система определения столкновений ODE обеспечивает быстрое нахождение потенциально пересекающихся объектов с помощью концепции "пространств"(spaces).

 

Возможности:

 

● Жесткие тела с произвольной массой.

● Типы сочленений(joint): шарик-в-разъеме(ball-and-socket), сгибание(hinge), скольжение(slider), сгибание-2(hinge-2), фиксация(fixed), угловой двигатель(angular motor), универсал(universal).

● Примитивы, участвующие в столкновении: сфера(sphere), прямоугольный параллелепипед(box), цилиндр с верхушкой(capped cylinder), плоскость(plane), луч(ray) и набор треугольников(triangular mesh).

● Пространства, в которых происходят столкновения: quad tree, hash space и simple.

● Методы симуляции: уравнения движения Лагранжа основанные на моделях Trinkle/Stewart и Anitescu/Potra.

● Используется интегрирование первого порядка(first order integrator). Оно быстрое но не достаточно точное для квантовой физики. Более высокая степень интегрирования появится позже.

● Выбор метода шага времени(time step): это или стандартный метод "большая матрица"(big matrix) или новый метод итераций QuickStep.

● Модель контактов и трения: Основана на Dantzig LCP решении Бараффа(Baraff), хотя в ODE реализовано быстрое приближение модели трения Coloumb.

● Имеет C интерфейс (хотя почти вся ODE написана на C++).

● C++ интерфейс лежит в основе C интерфейса.

● Написано много модулей, и много пишутся сейчас.

● Специфические оптимизации для различных платформ.

● Другие вещи которые я забыл упомянуть ...

 

1.2. Лицензия ODE

 

ODE is Copyright 2001-2004 Russell L.Smith. Все права защищены.

 

Эта библиотека является бесплатным программным обеспечением; вы можете ее передавать и/или модифицировать в соответствии со следующими правилами:

 

1. GNU Lesser General Public License(http://www.opensource.org/licenses/lgpl-license.html) опубликованное Free Software Foundation; версия лицензии 2.1, или на ваше усмотрение более поздней версии. Текст GNU Lesser General Public License включен в файл LICENSE.TXT.

2. BSD-style license(http://opende.sourceforge.net/ode-license.html) включена в файл LICENSE-BSD.TXT.

 

Эта библиотека разработана с надеждой на то что она будет полезна, но без каких бы то ни было гарантий. Для более детальной информации смотреть файлы LICENSE.TXT и LICENSE-BSD.TXT.

 

1.3. ODE сообщество

 

У вас есть вопросы или комментарии к ODE? Вы думаете что можете помочь? Пожалуйста  напишите в ODE mailing list(http://q12.org/mailman/listinfo/ode).

 

2. Как инсталлировать и использовать ODE

 

2.1. Инсталляция ODE

 

Шаг 1: Распаковать ODE архив.

 

Шаг 2-4 (альтернативный): Если вы работаете под Windows и используете MSVC, вы можете использовать файлы проекта(project) и рабочего пространства(workspace) в VC6 директории дистрибутива.

 

Шаг 2: Получить GNU make средства. Большинство UNIX платформ поставляются вместе с ним, хотя иногда имеют название gmake. Версия для Windows доступна здесь http://q12.org/ode/bin/make.exe.

 

Шаг 3: Отредактировать настройки в файле config/user-settings. В этом файле дан список поддерживаемых платформ.

 

Шаг 4: Запустить GNU make для конфигурации и сборки ODE и графических тестовых программ. В процессе конфигурации создается файл include/ode/config.h.

 

Шаг 5: Инсталлировать ODE библиотеку в вашу систему с помощью копирования lib/ и include/  директорий в необходимые места, напр. в Unix:

  • include/ode/ --> /usr/local/include/ode/
  • lib/libode.a --> /usr/local/lib/libode.a

2.1.1. Сборка и запуск ODE тестов на MacOS X

 

ODE использует XWindows и OpenGL, для визуализации имитируемых сцен. Прежде чем собирать ODE, вам надо инсталлировать Apple X11 сервер и X11SDK (обычные средства разработчика).

 

Их можно взять у компании Apple по адресу http://www.apple.com/macosx/x11. ЗАМЕЧАНИЕ: маленькая ссылка в нижнем правом углу страницы в SDK.

 

Установив это программное обеспечение дальше можно следовать инструкциям по обычной инсталляции ODE.

 

Поскольку ODE использует X11, то вам надо запустить X11 сервер (который должен быть у вас уже установлен, в папке Applications).

 

Если вы запускаете тестовые приложения в XTerm, который открывает X11 сервер по умолчанию, то все будет в порядке. Тем не менее если вы запускаете их из MacOS X Terminal, в этом случае вам надо определить переменную окружения DISPLAY. Если DISPLAY не определена, то получите сообщение: “ cannot open X11 display ”.

 

Например для запуска теста boxstack вам надо ввести

 

    cd ode/test
    DISPLAY=:0.0 ./test_boxstack.exe

 

Вы можете определить переменные окружения в своем скрипте оболочки запуска(shell startup scripts) (например в ~/.bashrc если вы используете bash)

 

2.2. Использование ODE

 

Лучший способ понять как использовать ODE посмотреть программы в test/example. Имейте в виду следующее:

 

● Программам, использующим ODE, необходимо подключать только один заголовочный файл:

 

 #include <ode/ode.h>

 

Предполагается что в include/ode находится директория с дистрибутивом ODE. Этот заголовочный файл указывает на другие директории ODE, поэтому вам надо указать путь вашему компилятору, напр. для linux

 

 gcc -c -I /home/username/ode/include myprogram.cpp

 

Когда ODE использует функцию dWorldStep, для хранения временных данных используется стек. Для больших систем может потребоваться стек в несколько мегабайт. Если в ваших экспериментах происходят ошибки связанные с нехваткой памяти или повреждением данных, особенно в Windows, попробуйте увеличить размер стека или использовать dWorldQuickStep.

 

3. Понятия

 

3.1. На заметку

 

[Здесь будет информация о динамике жесткого тела и симуляции, ее необходимо знать. А сейчас смотрите прекрасный обучающий материал с SIGGRAPH - http://www.cs.cmu.edu/~baraff/sigcourse/index.html].

 

3.2. Жесткие тела

 

Жесткие тела, с точки зрения симуляции, обладают различными свойствами. Некоторые из этих свойств меняются со временем:

 

Вектор позиции (x,y,z), указывающий на точку расположения тела (body's point of reference). На текущий момент точка расположения должна совпадать с центром массы тела.

● Линейной скоростью точки расположения является вектор (vx,vy,vz).

● Ориентация тела представлена кватернионом (qs, qx, qy, qz) или матрицей вращения 3х3.

● Вектор угловой скорости (wx,wy,wz), описывает как ориентация меняется во времени.

 

Другие свойства тела обычно остаются постоянными:

 

● Масса тела.

● Позиция центра масс по отношению к точке расположения. В текущей реализации центр масс и точка расположения должны совпадать.

● Матрица инерции. Это матрица 3х3 которая описывает как распределяется масса тела относительно центра массы.

 

В принципе каждое тело имеет x-y-z локальную систему координат, которая перемещается и вращается вместе с телом как показано на рисунке 1.

 

 

Рисунок 1: Локальная система координат тела.

 

Начало этой системы координат совпадает с точкой расположения тела. Некоторые значения в ODE (вектора, матрицы и т.д.) задаются в локальной системе координат тела, а другие в глобальной системе координат.

 

Учтите, что форма жесткого тела не является динамическим свойством. Только для определения столкновений имеет значение форма тела.

 

3.2.1. Острова и выключенные тела

 

Тела соединяются друг с другом с помощью сочленений(joints). “Остров”(island) тел представляет собой группу, которая не может быть разделена – другими словами каждое тело как то соединено с другим телом в острове.

 

Каждый остров в мире, во время шагов симуляции, обрабатывается отдельно. Вот что необходимо знать: если в симуляции принимают участие N схожих островов, то время расчета одного шага симуляции будет O(N).

 

Каждое тело может быть включено(enabled) или выключено(disabled). Выключенные тела, во время шагов симуляции, “убираются” и не обрабатываются. Выключение тел это эффективный способ сократить время вычислений в тех случаях, когда точно известно что тела не подвижны или оказывают несущественное влияние на симуляцию.

 

Если в острове присутствует хоть одно включенное тело, то в этом случае на следующем шаге симуляции включается весь остров. Таким образом чтобы выключить весь остров, необходимо чтобы все тела острова были выключены. Если выключенный остров вступит во взаимодействие с включенным телом, то в этом случае весь остров будет включен, поскольку контактное сочленение(contact joint) включит какое то тело острова.

 

3.3. Интегрирование

 

Процесс симуляции системы жестких тел во времени называется интегрированием(integration). Каждый шаг интегрирования увеличивает текущее время на заданный шаг и устанавливает новые значения состояний для всех жестких тел. Существует две главные проблемы при интегрировании:

Насколько оно точно? А именно, насколько точно поведение имитируемой системы совпадает с тем что происходит в реальной жизни?

● Насколько оно стабильно? А именно, как ошибки в вычислениях сказываются на физически некорректном поведении? (т.е. вынуждая системы “взрываться” без причины)

 

Текущая реализация интегрирования в ODE очень стабильна, но не очень точна даже несмотря на маленький шаг времени. Для большинства случаев это не является проблемой – поведение ODE почти во всех случаях смотрится прекрасно с точки зрения физики. Тем не менее не стоит использовать ODE для квантовой физики, до тех пор пока в следующих версиях проблемы с точностью не будут решены.

 

3.4. Аккумулятор силы

 

Между каждым шагом интегрирования пользователь может вызывать функции приложения сил к жесткому телу. Эти силы накапливаются в “аккумуляторе силы”(force accumulators) объекта жесткое тело. Когда происходит следующий шаг интегрирования, сумма всех приложенных сил вызывает перемещение тела. Аккумулятор силы устанавливается в ноль после каждого шага интегрирования.

 

3.5. Сочленения и соединения

 

В реальной жизни сочленение похоже на сгибание(hinge), используемое для соединения двух тел. Сочленение ODE имеет с ним много общего: это такое взаимоотношение между двумя телами, при котором тела могут занимать определенную позицию и ориентацию друг относительно друга. Такое взаимоотношение называется соединением(constraint) – слова сочленение и соединение часто взаимозаменяемы.

 

Рисунок 2: Три различных типа соединений.

 

Первое соединение называется сочленение шарик-в-разъеме(ball and socket joint), где “шарик” одного тела совпадает с расположением “разъема” другого тела. Второе это сочленение сгибание(hinge joint), здесь сгибание происходит в одном месте вдоль оси сгиба. Третье это сочленение скольжение(slider joint), здесь соединяются “поршень” и “разъем” вдоль одной линии, к тому же тела имеют одинаковую ориентацию.

 

На каждом шаге интегрирования всем сочленениям позволено применять силы соединения(constraint forces) к тем телам, к которым они присоединены. Эти силы вычисляются так, чтобы тела двигались, сохраняя связь с сочленением.

 

Каждое сочленение имеет многочисленные параметры, контролирующие геометрию. Например позицию точки шарика в разъема в сочленении шарик-в-разъеме. Функции, устанавливающие параметры сочленения, принимают глобальные координаты. В следствии этого каждое жесткое тело, к которому планируется присоединять сочленение, должно быть корректно размещено прежде чем присоединять сочленение.

 

3.6. Группы сочленений

 

Группа сочленений(joint group) это специальный контейнер, который содержит сочленения мира. Сочленения могут быть добавлены в группу, а когда сочленения группы больше не нужны, то вся группа может быть уничтожена с помощью одного вызова функции. Тем не менее отдельное сочленение группы не может быть уничтожено до тех пор пока группа не будет пуста.

 

Это особенно полезно для контактных сочленений, которые образовываются и удаляются из мира группами на каждом шаге времени.

 

3.7. Ошибки в сочленениях и параметр уменьшения ошибки (ERP)

 

Когда сочленение присоединяется  к двум телам, необходимо чтобы тела занимали определенное положение и ориентацию друг относительно друга. Тем не менее возможно такое расположение тел, что сочленения не будет соединено. Такая “ошибка в сочленении”(joint error) может случиться в двух случаях:

 

1. Если пользователь установил позицию/ориентацию одного тела некорректно по отношению к позиции/ориентации другого тела.

2. Во время симуляции могут появляться ошибки, что приведет к смещению тел от необходимых позиций.

 

Рисунок 3 показывает пример ошибки в сочленении шарик-в-разъеме (здесь шарик и разъем не совпадают).

 

 

Рисунок 3: Пример ошибки в сочленении шарик-в-разъеме.

 

Механизм уменьшения ошибок в сочленении следующий: во время каждого шага симуляции каждому сочленению прилаживаются специальные силы, чтобы вернуть тела на правильные позиции. Эта сила контролируется параметром уменьшения ошибки(error reduction parameter) (ERP) и принимает значение от 0 до 1.

 

ERP определяет пропорцию, в которой ошибка в сочленении будет исправляться в следующем шаге симуляции. Если ERP=0, то корректирующая сила прилагаться не будет и тела будут перемещаться в соответствии с ходом симуляции. Если ERP=1, то будет предприниматься попытка исправить все ошибки в сочленениях на следующем шаге симуляции. Тем не менее устанавливать ERP=1 не рекомендуется поскольку ошибки в сочленении нельзя полностью устранить из-за различных внутренних округлений. Рекомендуется устанавливать значения ERP=0.1 до 0.8 (0.2 значение по умолчанию).

 

Глобальное значение ERP воздействует на большинство сочленений симуляции. Тем не менее некоторые сочленения имеют локальные значения ERP, которые контролируют некоторые аспекты поведения сочленения.

 

3.8. Мягкое соединение и смешивающая сила соединения (CFM)

 

Большинство соединений по своей природе “твердые”(hard). Это значит что соединение находится в определенных условиях которые никогда не могут быть нарушены. Например, шарик всегда должен быть в разъеме, а сгибание должно происходит вдоль одной линии. На практике соединения могут быть нарушены непреднамеренным возникновением ошибок в системе, но с помощью параметра уменьшения ошибки можно откорректировать эти ошибки.

 

Не все соединения жестки. Некоторые “мягкие”(soft) соединения разработаны для того, чтобы быть нарушенными. Например, контактное соединение, которое предотвращает сталкивающиеся объекты от взаимного проникновения, по умолчанию жестки, это выглядит так как будто сталкивающиеся поверхности сделаны из стали. Но для симуляции материалов помягче можно сделать мягкое соединение, тем самым позволив естественному проникновению иметь место при взаимодействии двух объектов.

 

Существует два параметра которые контролируют различие между жестким и мягким соединением. Первый это параметр уменьшения ошибки (ERP), который уже был представлен. Второй это смешивающая сила соединения(constraint force mixing) (CFM), которая будет описана ниже.

 

3.8.1. Смешивающая сила соединения (CFM)

 

Далее следует описание значения CFM с технической точки зрения. Если вы просто хотите знать как использовать его на практике, то можете переходить к следующему разделу.

 

Обычно уравнение соединения(constraint equation) для каждого сочленения имеет форму

 

J * v = c

 

где v вектор скорости тел, JJacobianматрица в которой одна строка представляет одну степень свободы сочленения и c правосторонний вектор. На следующем шаге времени вектор lambda вычисляется так чтобы силы приложенные к телам сохранили соединение сочленения

 

force = JT * lambda

 

ODE использует следующий трюк. Уравнение соединения ODE имеет следующую форму

 

J * v = c + CFM * lambda

 

где CFM квадратно диагональная матрица(square diagonal matrix). CFM смешивает результирующую силу соединения в том соединении в котором она возникла. Ненулевое (положительное) значение CFM позволяет оригинальному уравнению соединения быть нарушенным пропорционально CFM раз, восстанавливая силу lambda, которая необходима для соединения. Решение для lambda дает

 

(J M-1 JT + CFM/h) lambda = c/h

 

Таким образом CFM просто добавляет диагональ к оригинальной системной матрице. Дополнительное преимущество от использования положительного значения CFM заключается в уменьшении странностей системы и увеличение точности разложения на множители.

 

3.8.2. Как использовать ERP и CFM

 

Для многих сочленений ERP и CFM можно устанавливать независимо. Они могут быть установлены для контактных сочленений, ограничений сочленений(joint limits) и еще в других местах, контролируя мягкость(spongyness) и упругость(springyness) сочленения (или ограничения сочленения).

 

Если CFM установлен в ноль, соединение будет жестким. Если в CFM установлено положительное число, то появляется возможность нарушать соединение “смещением” (например в контактных соединениях сдерживать два контактирующих объекта вместе). Другими словами соединение становится мягким и мягкость будет нарастать с увеличением CFM. Происходит здесь следующие, соединению позволяется быть нарушенным пропорционально CFM раз, восстанавливая силу, которая нужна для удержания соединения. Учтите что установка в CFM отрицательного значения приведет к непредсказуемым отрицательным последствиям, например к нестабильности. Не делайте этого.

 

Устанавливая значения в ERP и CFM, вы можете добиваться различных эффектов. Например вы можете сымитировать упругий контакт, когда два тела будут колебаться как будто соединены пружиной. Или вы можете сымитировать более мягкий контакт, без колебаний. Вообще настраивая ERP и CFM можно достичь любого желаемого эффекта пружинистости или торможения соединения. Если у вас есть коэффициент жесткости пружины(spring constant) kp и коэффициент торможения(damping constant) kd, то константы ODE вычисляются так:

 

ERP = h kp / (h kp + kd)

CFM = 1 / (h kp + kd)

 

где h размер шага(stepsize). Эти значения дадут тот же эффект что и пружинно-тормозящая система(spring-and-damper system) сымитированная с помощью неявного интегрирования первого порядка.

 

Увеличение CFM, особенно глобальной CFM, может сократить многочисленные ошибки симуляции. Если система ведет себя странно, это может значительно увеличить стабильность. Вообще если система ведет себя неправильно первое что необходимо сделать это увеличить глобальную CFM.

 

3.9. Обработка столкновений

 

[Здесь надо много чего написать об обработке столкновений.]

 

Столкновения между телами, или между телом и статическим окружением, обрабатываются следующим образом:

 

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

 

2. Для каждой точки контакта создается специальное контактное сочленение(contact joint). Контактное сочленение дает дополнительную информацию о контакте, например о трении контактирующих поверхностей, пружинистости или мягкости и различных других свойствах.

3. Контактные сочленения помещаются в "группу" сочленений, группа позволяет быстро добавлять и удалять сочленения из системы. Скорость симуляции падает с ростом числа контактов, поэтому существуют различные способы для сокращения количества точек контакта.

 

4. Происходит шаг симуляции.

 

5. Все контактные сочленения удаляются из системы.

 

Учтите что не обязательно использовать встроенную систему определения столкновений - другие библиотеки определения столкновений так же могут быть использованы, при условии что они предоставляют правильную информацию о контакте.

 

3.10. Типичный код симуляции

 

Типичный ход симуляции выглядит так:

 

1. Создать динамический мир.

2. Создать тела в динамическом мире.

3. Установить состояния(позиции и т.д.) для всех тел.

4. Создать сочленения в динамическом мире.

5. Соединить тела с сочленениями.

6. Установить параметры всем сочленениям.

7. Создать мир столкновений и геометрические объекты столкновений, если необходимо.

8. Создать группу сочленений для хранения контактных сочленений.

9. Цикл:

            1. Применить необходимые силы к телам.

            2. Установить необходимые параметры сочленений.

            3. Вызвать определение столкновений.

4. Создать контактное сочленение для каждой точки столкновения и поместить сочленение в группу контактных сочленений.

5. Произвести шаг симуляции.

6. Удалить все сочленения из группы контактных сочленений.

10. Уничтожить динамический мир и мир столкновений.

 

3.11. Физическая модель

 

Здесь обсуждаются различные методы и упрощения используемые в ODE.

 

3.11.1. Упрощение трения

 

[Мне действительно необходимо здесь больше рисунков.]

 

Модель трения Coulomb проста, но эффективна для случая с точками контакта. Это просто отношение между нормалью и касательными силами присутствующими в точке контакта (смотри раздел о контактном сочленении для описания этих сил). Правило следующие:

 

| fT | <= mu * | fN |

 

Где fN и fT вектор силы нормали и касательный вектор силы соответственно, а mu коэффициент трения (обычно около 1.0). Это уравнение определяет “конус трения”(friction