Я довольно новичок в 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", который дал мне правильный ответ!
Ответы:
Что вам поможет, так это наличие матрицы преобразования для объекта, которому вы хотите следовать. Вы можете извлечь вектор вперед из этой матрицы - в зависимости от вашей системы координат и управляемости матрицы это будет одна из строк или столбцов с удаленным 4-м компонентом (при условии, что вы используете матрицы преобразования 4x4 без масштабных коэффициентов - масштабные коэффициенты ужасны для много причин ... но если у вас есть масштабные коэффициенты, вы можете нормализовать строку / столбец после удаления 4-го компонента.)
Получив это, вы можете расположить камеру непосредственно за объектом, вычитая ее из положения объекта. Чтобы перемещать камеру внутрь и наружу, вы можете масштабировать вектор, а для поворота вокруг объекта вы можете вращаться по осям X и Y (или XZ / ZY и т. Д. В зависимости от руки и т. Д.), Которые вы применяете к копии матрицы объекта. перед извлечением прямого направления.
Наконец, чтобы сгладить движение, самое простое решение состоит в том, чтобы отследить предыдущее смещение и углы и подскочить к ним на некоторую зависящую от частоты кадров величину, описываемую ^ (b.dt), где dt - время дельты, а a, b - выбранные вами параметры. a = 0,9 и b = 30 дает вам эффект перемещения на 90% к позиции, как если бы вы делали это каждый кадр со скоростью 30 кадров в секунду. это называется «фильтр с бесконечной импульсной характеристикой» и является классическим хаком для такого рода сглаживания.
это может быть не идеально, вы можете выбрать минимальное расстояние и ограничить углы, в противном случае камера может пройти через объект. если вы находитесь в плотном мире, то обрезание или исчезновение промежуточных объектов также станет важным.
извините, это долго, но это не тривиальная проблема, как вы, кажется, обнаружили.
надеюсь это поможет. Я могу предоставить больше глубины детализации, если это необходимо.
(ps кватернионы не нужны - они действительно не помогают в этой проблеме)
источник