Камера от третьего лица

Xtreme3D

Урок 10
Камера от третьего лица

Уровень: средний
Версия Xtreme3D: 3.0.x
Автор урока: Gecko

Многие игры используют вид от третьего лица, где камера показывает персонажа "со спины" - это, например, многие игры жанров Action и RPG, 3D-платформеры типа Spyro или Crash Bandicoot, спортивные симуляторы и т.д. При этом, как правило, камера не является жестко зафиксированной на определенном расстоянии от персонажа - она обычно перемещается плавно, с некоторым запаздыванием, что добавляет реализма и кинематографичности.

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

Код в событии Create:

camera = CameraCreate(global.scene);
CameraSetViewDepth(camera, 800);
CameraSetFocal(camera, 80);
ViewerSetCamera(view1, camera);

actor = CubeCreate(1, 1, 1, global.scene);

target = DummycubeCreate(actor);
ObjectSetPosition(target, 0, 1, -4);
CameraSetTargetObject(camera, actor);

Код в событии Step:

if keyboard_check(vk_up) ObjectMove(actor, 10 * dt);
if keyboard_check(vk_down) ObjectMove(actor, -10 * dt);
if keyboard_check(vk_left) ObjectTurn(actor, -200 * dt);
if keyboard_check(vk_right) ObjectTurn(actor, 200 * dt);

cx = ObjectGetAbsolutePosition(camera, 0);
cy = ObjectGetAbsolutePosition(camera, 1);
cz = ObjectGetAbsolutePosition(camera, 2);
tx = ObjectGetAbsolutePosition(target, 0);
ty = ObjectGetAbsolutePosition(target, 1);
tz = ObjectGetAbsolutePosition(target, 2);
dx = tx - cx;
dy = ty - cy;
dz = tz - cz;
ObjectTranslate(camera, dx * 0.05, dy * 0.05, dz * 0.05);

Логика камеры устроена так, что ее наиболее дальняя дистанция от персонажа - при движении вперед (чтобы можно было хорошо видеть, что творится вокруг), а самая близкая - при движении назад. При повороте персонажа камера позволяет рассмотреть его сбоку. Примерно такой же прием используется в гоночных симуляторах, так что на основе этого кода вполне можно сделать и движок гонок.