Я обновляю старый проект OpenGL и переключаю все (устарело) glMatrix () функции для матриц и кватернионов, и у меня возникают проблемы с работой вращения.
Мой рисунок выглядит так:
//these two are supposedly working
mat4 mProjection = perspective(FOV, aspectRatio, near, far);
mat4 mView = lookAt(cameraPosition, cameraCenter, headsUp);
mat4 mModel = mat4(1.0f);
mat4 mMVP = mProjection * mView * mModel;
Сейчас я пытаюсь применить вращение к объекту вокруг определенной точки (например, к центру объекта).
Я старался:
mat4 mModelRotation = rotate(mModel, object->RotationY(), vec3(0.0, 1.0, 0.0)); //RotationY being an angle in degrees
mat4 mMVP = mProjection * mView * mModel * mModelRotation;
Но это заставляет объект вращаться вокруг одного из его краев, а не его центра.
Я хотел бы знать, как я могу применить Quaternions, чтобы вращать объект вокруг любой точки, которую я передаю в качестве параметра, например.
Я неопытный с матрицами, так как я избегал их, потому что я мог использовать glMatrix () функций, так что я не очень разбираюсь в связи между пространственным положением и ними, и попытка обновить их до кватернионов выглядит еще более сложной.
Я читал о логике кватернионов и о том, как их использовать технически, но я не понимаю, откуда взялись их ценности.
Например:
//axis is a unit vector
local_rotation.w = cosf( fAngle/2)
local_rotation.x = axis.x * sinf( fAngle/2 )
local_rotation.y = axis.y * sinf( fAngle/2 )
local_rotation.z = axis.z * sinf( fAngle/2 )
total = local_rotation * total
Я прочитал это, и я понятия не имею, что это за значения. Ось — это единичный вектор … чего? нелепое изобретение Я предполагаю, что это угол, который я хочу повернуть, но поскольку кватернионы используют произвольную ось, как мне получить значение для каждой оси XYZ и как мне указать его в кватернионе?
Итак, я ищу любой практический пример / учебник по Quaternion, чтобы я мог понять, что происходит.
Единственная информация, которую я имею, когда хочу повернуть объект, — это ось, которую я хочу повернуть (x, y ИЛИ z, не все из них, а их комбинация в конечном результате) и значение в градусах.
Я не очень разбираюсь в математике, поэтому любой учебник, в котором не используются ярлыки, высоко ценится.
ОК, скажем, у вас есть модель ML
(набор точек модели) и точка P
повернуть это ML
,
Все повороты относятся к началу координат, поэтому вам нужно переместить набор точек ML
принять точку P
как источник, сделайте вращение всех точек и затем переместите это назад.
Как это сделать?, Просто, для каждой точки ML(k)
(точка в наборе) вы делаете:
ML(k)-P --> with this you move the points, using the P point as origin
затем поверните:
ROT * (ML(k)-P)
и, наконец, вы переместите его обратно:
ROT(ML(k)-P) + P
Как кватернионы, вы заменяете матрицу mult на q
а также -q
q * (ML(k)-p) * -q + p
Это должно работать.
Других решений пока нет …