Какой самый простой способ реализовать камеру от третьего лица в C ++ / DirectX9

8

Я довольно новичок в C ++ и DirectX9, и я хочу реализовать камеру от третьего лица. Прочитав немного о камерах на основе кватернионов, я решил попробовать реализовать их. Но это действительно поражает меня, поэтому я спрашиваю, как проще всего внедрить TP-камеру?

Вот что должна делать камера:

  • Следуйте координатам, сохраненным в 3DVector (x, y, z)

  • Поворот вокруг объекта (гладкий)

  • Может быть, какой-то тип «пружины» = медленно возвращаясь к нормальному положению позади объекта после вращения

Извиняюсь за мой плохой английский: я немец и все еще в школе!

Заранее спасибо!

РЕДАКТИРОВАТЬ:

После некоторых попыток я понял.

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

Во время моего исследования я обнаружил, что-то вроде этого:

D3DXVECTOR3 direction;
direction.x = worldMatrix->_13;
direction.y = worldMatrix->_23;
direction.z = worldMatrix->_33;
D3DXVec3Normalize(&direction, &direction);

Это НЕ работает для меня! Вместо этого я сделал это:

D3DXVECTOR3 direction;
direction.x = worldMatrix->_13;
// Consider the .y after the .z!
direction.z = worldMatrix->_23;
direction.y = worldMatrix->_33;
D3DXVec3Normalize(&direction, &direction);

Для масштабирования:

// The tenfold of the average distance
D3DXVec3Scale(&direction, &direction, 10.0f);

Установка позиций:

cameraPos = targetPos - direction;
// For a top-view
cameraPos.y = targetPos.y + 5;

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

Сглаживание вращения действительно зависит от ВАШЕЙ игры!

Такого рода камеру от третьего лица действительно легко сделать, и она делает свое дело!

Действительно большое спасибо "jheriko", который дал мне правильный ответ!

Аноним Аноним
источник
+1 за фактическое описание того, что вам нужно, это редко (хотя это может быть более подробно, например, 3-й пункт сбивает с толку - разве вы не предполагали, что он вращается свободно?).
Wondra
Да, он должен вращаться свободно, но я хочу, чтобы он медленно возвращался к точке в задней части плеера после завершения вращения!
Аноним Аноним

Ответы:

1

Что вам поможет, так это наличие матрицы преобразования для объекта, которому вы хотите следовать. Вы можете извлечь вектор вперед из этой матрицы - в зависимости от вашей системы координат и управляемости матрицы это будет одна из строк или столбцов с удаленным 4-м компонентом (при условии, что вы используете матрицы преобразования 4x4 без масштабных коэффициентов - масштабные коэффициенты ужасны для много причин ... но если у вас есть масштабные коэффициенты, вы можете нормализовать строку / столбец после удаления 4-го компонента.)

Получив это, вы можете расположить камеру непосредственно за объектом, вычитая ее из положения объекта. Чтобы перемещать камеру внутрь и наружу, вы можете масштабировать вектор, а для поворота вокруг объекта вы можете вращаться по осям X и Y (или XZ / ZY и т. Д. В зависимости от руки и т. Д.), Которые вы применяете к копии матрицы объекта. перед извлечением прямого направления.

Наконец, чтобы сгладить движение, самое простое решение состоит в том, чтобы отследить предыдущее смещение и углы и подскочить к ним на некоторую зависящую от частоты кадров величину, описываемую ^ (b.dt), где dt - время дельты, а a, b - выбранные вами параметры. a = 0,9 и b = 30 дает вам эффект перемещения на 90% к позиции, как если бы вы делали это каждый кадр со скоростью 30 кадров в секунду. это называется «фильтр с бесконечной импульсной характеристикой» и является классическим хаком для такого рода сглаживания.

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

извините, это долго, но это не тривиальная проблема, как вы, кажется, обнаружили.

надеюсь это поможет. Я могу предоставить больше глубины детализации, если это необходимо.

(ps кватернионы не нужны - они действительно не помогают в этой проблеме)

jheriko
источник
Большое спасибо! Вы дали мне несколько идей, как это сделать. Но я был бы признателен за некоторые примеры кода, если вы не возражаете. А почему бы не использовать кватернионы? Я читал, что они обычно используются для подобных вещей ( en.wikipedia.org/wiki/Quaternion ).
Аноним Аноним
Попытка сделать это, как вы описали, но все еще есть некоторые проблемы. Камера не в задней части проигрывателя, а, по крайней мере, где-то рядом с ним! Я не понимаю, какая часть связана с поворотами X и Y: что нужно повернуть? Матрица мира, вектор направления или копия вектора позиции игрока? А как вращать? Надеюсь, вы можете помочь мне!
Аноним Аноним
Вы поворачиваете вектор направления или матрицу, из которой извлекаете его (матрица преобразования объекта, а не матрица мира или вида), чтобы повернуть, вы
строите