Камера определяется точкой положения (position
), целевой точкой (refrence
) и вектором повышения upVector
. Если вы хотите изменить ориентацию камеры, то вам нужно повернуть вектор направления от положения (position
) к цели (refrence
), а не к целевой точке на Матрица вращения .
Обратите внимание, поскольку 2 угла - это углы, которые должны изменить уже повернутый вид, вам необходимо использовать матрицу вращения, чтобы повернуть векторы, которые указывают в произвольном направлении.
Напишите функцию, которая устанавливает матрицу вращения 3x3 вокруг произвольной оси:
void RotateMat(float m[], float angle_radians, float x, float y, float z)
{
float c = cos(angle_radians);
float s = sin(angle_radians);
m[0] = x*x*(1.0f-c)+c; m[1] = x*y*(1.0f-c)-z*s; m[2] = x*z*(1.0f-c)+y*s;
m[3] = y*x*(1.0f-c)+z*s; m[4] = y*y*(1.0f-c)+c; m[5] = y*z*(1.0f-c)-x*s;
m[6] = z*x*(1.0f-c)-y*s; m[7] = z*y*(1.0f-c)+x*s; m[8] = z*z*(1.0f-c)+c };
}
Напишите функцию, которая вращает трехмерный вектор по матрице:
Vector3D Rotate(float m[], const Vector3D &v)
{
Vector3D rv;
rv.x = m[0] * v.x + m[3] * v.y + m[6] * v.z;
rv.y = m[1] * v.x + m[4] * v.y + m[7] * v.z;
rv.z = m[2] * v.x + m[5] * v.y + m[8] * v.z;
return rv;
}
Вычислите вектор от позиции до цели:
Vector3D los = Vector3D(refrence.x - position.x, refrence.y - position.y, refrence.z - position.z);
Поверните все векторы вокруг оси z на angleX
:
float rotX[9];
RotateMat(rotX, angleX, Vector3D(0, 0, 1));
los = Rotate(rotX, los);
upVector = Rotate(rotX, upVector);
Поверните все векторы вокругтекущая ось y вида на angleY
:
float rotY[9];
RotateMat(rotY, angleY, Vector3D(los.x, los.y, 0.0));
los = Rotate(rotY, los);
upVector = Rotate(rotY, upVector);
Рассчитать новую целевую точку:
refrence = Vector3D(position.x + los.x, position.y + los.y, position.z + los.z);