使用C++/OpenGL。
以缩放相机为例,使其始终对准光标位置:
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(?);
有没有一种方法可以在保持绝对平移/旋转的同时重置比例尺?
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
根据rabbid76的建议:
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;
看起来很有前途,但到目前为止,曾经的放大现在是缩小,反之亦然。此外,还存在一些晃动效果,表明某些地方不太对劲。
Matrix4
是哪种数据类型? - Rabbid76m[12] /= l_scale.x;
m[13] /= l_scale.y;
,m[14] /= l_scale.z;
这部分是错误的。将其删除,它就可以正常工作了。字段12-14包含绝对平移量,如果更改它,立方体就会“移动”。 - Rabbid76t = l_matrix.GetScale() * l_matrix.GetTranslation()
。矩阵乘法不满足交换律。 - Rabbid76