Newton Game Dynamics/Обучающие примеры
Анализ обучающих примеров начнем со сборки и компиляции компонентов требуемых для этого.
Компоненты и зависимости
правитьКомпоновка в проекты сделано не удачно, не выполняется стиль программирования когда проект должен располагаться в той же директории, где и исходные файлы. Чтобы это привести в порядок требуется понимать состав компонентов и их зависимости. Если этого не сделать, то например компоновка обучающих компонентов (tutorials) будет содержать изначальную структуру, которая излишняя и неудобная для использования.
Для работы обучающих компонентов (tutorials), требуется
- core
- physics (← core)
- newton (← core, ←physics)
- dMath
- dContainers (← dMath)
- dCustomJoints (← dMath, ← newton)
- здесь можно скачать перестроенные обучающие компоненты (tutorials) — основная цель перестройки удаление лишних зависимостей, и приведение к стилю „проект в той же директории, где и исходные файлы“, компиляция под Microsoft Visual C++ 2008 Express Edition
Баги
правитьКомпиляция под Microsoft Visual C++ 2010
править- Версия 2.33 (собрана 1 апреля 2011, соответствует ревизии r498) не компилируется под Microsoft Visual C++ 2010 Express Edition, рассчитана на Microsoft Visual C++ 2008 без совместимости
- „Руганина“ от автора[1], после того как не смог, видимо, собрать для Microsoft Visual C++ 2010, относится к версии 2.29 (синтаксические ошибки же надо сказать справедливы, поэтому претензии автора мало обоснованы)
12/29/2010
Revert back to Visual studion 2008
Visual studio 2010 is too buggy for prime time, it is no backwrodk compatible, and it teh bash build funtionality doe no work at all,
This may be the last version of Newton using Visual studio, futher version will use eithr GCC or Intel compiler
Thsi s a prublic service for those hwo are on teh fance and wnat to buy Visual studio 2010, please do not.
Give yor self a favor and do not waste you money byu visual stiduo 2010, because it is useless for anything more complex than a "Hello world program"
- Но ревизия r680 (доступна через SVN) уже содержит проекты под Microsoft Visual C++ 2010. И все сопутствующие ошибки исправлены. Но проекты tutorials еще не пересозданы (что сделать не сложно, но кроме этого есть вопросы стабильности этой ревизии).
Анализ
правитьВ обучающих примерах с самого начала используется концепция мешей (англ. polygon mesh). Это позволяет визуализировать практически любое тело. Но сама по себе загрузка меша (Entity::LoadMesh), не является стандартным действием движка, и дается как один из примеров. Загрузка меша позволяет только визуализировать тело, но не создает ни какой физики этого тела.
После загрузки меша (Entity::LoadMesh) выполняется его оптимизация (Entity::OptimizeMesh). Оптимизация выполняется с помощью дисплейных списков OpenGL.
Основные функции
правитьДобавление твердого тела
правитьТема второго обучающего примера
Entity* frowny;
NewtonBody* frownyBody;
NewtonCollision* shape;
// add some visual entities.
frowny = sceneManager->CreateEntity();
frowny->LoadMesh ("Frowny.dat");
frowny->m_curPosition.m_z = 0.4f;
frowny->m_curPosition.m_y = 10.0f + 0.4f;
frowny->m_prevPosition = frowny->m_curPosition;
// add a body with a box shape
shape = CreateNewtonBox (world, frowny, 0);
frownyBody = CreateRigidBody (world, frowny, shape, 10.0f);
NewtonReleaseCollision (world, shape);
Создание связи между твердыми телами
правитьТема третьего обучающего примера
// Создание связи между двумя квадратами, назваными Smilly и Frowny
// now we will link the body of Smilly and Frowny with a specialize Hinge Joint
NewtonUserJoint* smillyFrownyHinge;
matrix.m_posit = smilly->m_curPosition;
matrix.m_posit.m_z += 0.2f;
matrix.m_posit.m_y += 0.4f;
smillyFrownyHinge = CreateCustomHinge (&matrix[0][0], smillyBody, frownyBody);
HingeEnableLimits (smillyFrownyHinge, 1);
HingeSetLimits (smillyFrownyHinge, -0.5f * 3.1416f, 0.5f * 3.1416f);
- В данном примере применяется не стандартное соединение, описанное в пакете dJointLibrary. Тут можно ознакомится со стандартными соединениями, самого движка.
Наиболее простую связь можно создать функцией NewtonConstraintCreateBall(..), пример применения:
dVector pivot (location.m_posit); // место контакта (точка поворота)
pivot.m_y += size.m_y * 0.5f;
// Connect these two bodies by a ball and sockect joint
joint = NewtonConstraintCreateBall (nWorld, &pivot.m_x, link1, link0);
Различные нюансы
править- Класс SceneManager.h содержит статичное определение #define MAX_ENTITY_COUNT 1024. Если у Вас будет большее число сущностей, вы вылетите по ошибке. Место ошибки может быть произвольным, но как правило связано с освобождением памяти. Чтобы этого не случилось нужно задать соответствующие максимальное число сущностей.
- В проекте physics класс dgBroadPhaseCollision метод UpdateContactsBroadPhaseBegin содержит следующие объявление:
dgUnsigned32 dgBroadPhaseCollision::UpdateContactsBroadPhaseBegin(dgFloat32 timestep, bool collisioUpdateOnly, dgUnsigned32 ticksBase)
{
union {
dgCellPair cellArray[1024];
dgBody* bodyArray[1024];
};
...
}
проблемы возникают когда число твердых тел больше 1024, физический движок вылетает по ошибке. Для устранения необходимо соответственно увеличить данное число.