1. Основы физики. Тела
----------------------------------------------------------------------------------------------------------------------------
Приступать к изучению этого материала желательно после знакомства с уроками:
3. Работа с освещением
4. Введение в меши
Начнем мы с исходного кода второго урока, закомментировав или удалив создание мешей.
----------------------------------------------------------------------------------------------------------------------------
В Leadwerks engine за физику отвечает библиотека newton. Newton это профессиональный физический движок с обширным функционалом.
Базовым объектом в Newton, для которого просчитываются физические процессы, является тело (body). В Leadwerks engine оно представлено классом TBody.
Создадим тело в виде коробки и установим ему массу. Добавим перед главным циклом следующий код:
// Создаем физическое тело
TBody body = LE.CreateBodyBox();
//Задаем массу
LE.SetBodyMass(body, 1);
Поскольку сам по себе body невидим, включим режим отладки физики:
//Отображение физических объектов
LE.DebugPhysics(1);
Запущенная программа нарисует зеленый куб, который под воздействием гравитации тут же упадет вниз куда-то за пределы экрана.
Чтобы куб не падал в бесконечность, создадим еще одно тело и поместим его под кубом:
TBody ground = LE.CreateBodyBox(5, 0.1f, 5);
LE.PositionEntity(ground, LE.Vec3(0, -1, 0));
Массу ему указывать не будем.
Теперь, если запустить программу, зеленый куб все равно упадет вниз, пройдя сквозь другое тело. Чтобы такое не происходило нужно задействовать проверку столкновений.
//Активация проверки столкновений
LE.Collisions(1,1);
LE.EntityType(body, 1);
LE.EntityType(ground, 1);
Причем, в движке можно сделать так, чтобы не все тела сталкивались. Для этого нужно разделить их по типам. Тип телу задается функцией EntityType. А функция Collisions указывает, какие типы тел могут взаимодействовать между собой.
Запустим программу, теперь куб никуда не упадет.
Ну и ради интереса добавим еще одно тело:
TBody body2 = LE.CreateBodyBox();
LE.SetBodyMass(body2, 1);
LE.PositionEntity(body2, LE.Vec3(0.5f, 2, 0));
LE.EntityType(body2, 1);
В результате один бокс упадет на другой и свалится с него:
Теперь заменим контуры тел на видимые объекты. Ведь в компьютерных играх графика состоит не только из линий. Для этого создадим кубический меш и соединим его функцией EntityParent с физическим телом.
TMesh mesh = LE.CreateCube();
LE.EntityParent(mesh, body);
Проделав то же самое с остальными телами и отключив отладку физики мы увидим такую картину:
Ну а в завершение устроим небольшой «кубопад», добавив перед главным циклом такой код:
float x;
float z;
Random rnd = new Random();
for (int n = 1; n <= 1000; n++)
{
body = LE.CopyEntity(body);
x = rnd.Next(-5, 5);
z = rnd.Next(-5, 5);
LE.PositionEntity(body, LE.Vec3(x, n, z));
}
А чтобы картинка не была такой мрачной, вспомним урок про загрузку мешей и загрузим и применим ко всем объектам материал:
TMaterial mat = LE.LoadMaterial("brick.mat");
if (mat != null)
{
//Применяем материал к мещам
LE.PaintEntity(mesh, mat);
LE.PaintEntity(mesh2, mat);
LE.PaintEntity(mesh3, mat);
}
Так, однозначно, смотрится веселее.
Полный исходный код можно взять здесь.
|