OpenGLでマウス位置オフセットのあるオブジェクトをドラッグしたかった。レンダリング パイプラインは次のようになります。
gl_Position = projection * view * model * vec4(aPos, 1.0);
だから私は逆(投影*ビュー)し、それらをエイジアンに掛けて、モデルマトリックスに適用される変換を取得する必要があると考えました。
glm::mat4 CalculateDragTransform(double xOffset, double yOffset) {
double x = (2 * xOffset) / m_width;
double y = (2 * yOffset) / m_height;
glm::mat4 projection = glm::perspective(glm::radians(m_camera->GetFOV()),
(float) m_width /
(float) m_height, 0.1f,
100.0f);
glm::mat4 view = m_camera->GetViewMatrix();
glm::mat4 transform = glm::translate(glm::mat4(1.0), glm::vec3(x, y, 0));
return glm::inverse(projection * view) * transform * projection * view;
m_objects[index]->SetModelMatrix(transform * m_objects[index]->GetModelMatrix());
オブジェクトをドラッグすると、オブジェクトがマウスの動きに追従していました。しかし、別の角度から見ると、オブジェクトは大きく歪んでいます。それで、私は何を間違えましたか?(投影 * ビュー) を反転する必要がありますか?
ドラッグ前のダイス:
ドラッグ後のダイス:
他の角度から歪みを見ることができます。
歪みのより明白な例:
更新:位置の変換のみを保持することで、問題を (一種の) 修正することができました。したがって、変換の左上の 3x3 マトリックスに問題があると思われます。デバッグすると、4 行目の最初の 3 列がゼロではないことがわかりました。これはまったく間違っています。しかし、何が原因なのか理解できませんでした..この現象は、glm::perspective を射影行列として使用した場合にのみ発生します。glm::ortho を使用することも、左上の 3x3 行列を破棄する必要のない解決策です。
glm::mat4 view = m_camera->GetViewMatrix();
glm::mat4 transform = glm::translate(glm::mat4(1.0), glm::vec3(x, y, 0));
transform = glm::inverse(projection * view) * transform * projection * view;
float x = transform[3][0];
float y = transform[3][1];
float z = transform[3][2];
transform = glm::translate(glm::mat4(1.0f), glm::vec3(x, y, z));