Using C++/OpenGL.
As an example, zooming camera at cursor position:
Vector3 target = GetScreenToWorldPosition(in_position);
Matrix4 s(MATRIX4_IDENTITY);
s.SetScale(0.12648); /// Arbitrary value for simplicity sake.
Matrix4 t(MATRIX4_IDENTITY);
t.SetTranslation(target);
Matrix4 tMinus(MATRIX4_IDENTITY);
tMinus.SetTranslation(-target);
Camera *camera = GetCurrentCamera();
Matrix4 matrix = camera->GetWorldMatrix();
matrix *= t * s * tMinus;
l_camera->SetScale(1, 1, 1);
l_camera->SetTranslation(?);
l_camera->SetRotation(?);
Is there a way to reset the scale while keeping the absolute translation/rotation?
Matrix4:
float m[16];
Row-Major:
m[00], m[01], m[02], m[03]
m[04], m[05], m[06], m[07]
m[08], m[09], m[10], m[11]
m[12], m[13], m[14], m[15]
m[00], m[04], m[08] = Cross vector
m[01], m[05], m[09] = Up vector
m[02], m[06], m[10] = Normal vector
m[12], m[13], m[14] = Translation vector
Based on rabbid76 suggestion:
Vector3 l_scale;
l_scale.x = sqrt(m[0] * m[0] + m[4] * m[4] + m[8] * m[8]);
l_scale.y = sqrt(m[1] * m[1] + m[5] * m[5] + m[9] * m[9]);
l_scale.z = sqrt(m[2] * m[2] + m[6] * m[6] + m[10] * m[10]);
m[0] /= l_scale.x;
m[4] /= l_scale.y;
m[8] /= l_scale.z;
m[1] /= l_scale.x;
m[5] /= l_scale.y;
m[9] /= l_scale.z;
m[2] /= l_scale.x;
m[6] /= l_scale.y;
m[10] /= l_scale.z;
It looks promising but so far, what used to be zooming in is now zooming out and vise-versa. Plus, there is some wobbling effects which indicates that something is not quite right.
Matrix4? - Rabbid76