OpenGL-绘制相机空间后,将模型放置在世界空间中



有没有办法在opengl中可以在相机空间绘制一个对象,并且一旦您移开,它就可以留在世界空间?

我想离开子弹,让它留在世界空间中,而不是在相机空间中并固定在相机上。

有没有办法这样做,还是我做错了?我认为我不能在世界空间中绘制对象,因为我可以面对任何方向。谢谢。

子弹与世界上任何对象都没有什么不同。使对象与其他对象有所不同的是在同一空间中其坐标
在相机坐标中具有对象意味着您可以避免通过"模型"one_answers"视图"矩阵乘法,并仅使用"投影"矩阵。

如果您在相机坐标中有子弹,则可以通过将它们乘以"视图 *模型"矩阵的倒数来获得其世界坐标。

假设您使用代码设置了子弹相对于相机

glm::mat4 BulletRotationMatrix = glm::toMat4(bulletRotation);
// Offset so that it appears after the barrel of the gun
glm::mat4 BulletTranslationMatrix = translate(mat4(), glm::vec3(0.35, 0, -3));
glm::mat4 BulletScaleMatrix = scale(mat4(), glm::vec3(0.1f, 0.1f, 0.1f));
glm::mat4 ModelMatrix = BulletTranslationMatrix * BulletRotationMatrix * BulletScaleMatrix;
glm::mat4 MVP = ProjectionMatrix * ModelMatrix;

您选择的" ModelMatrix"的名称可能与用于在世界空间中设置对象的矩阵相混淆,而不是相对于相机。因此,更好地重命名:

glm::mat4 BulletInCameraMatrix = BulletTranslationMatrix * BulletRotationMatrix * BulletScaleMatrix;
glm::mat4 CameraAndProj = ProjectionMatrix * BulletInCameraMatrix ;

我们可以说,子弹本地坐标中子弹XYZ的点被转换为

的相机空间
glm::vec4 bulletViewCoords = CameraAndProj * glm::vec4(x, y, z, 1.0);

其余对象通过矩阵VM = View * Model遭受了从本地空间到相机空间(视图)空间的转变。现在,我们想要在世界空间中的子弹点。因此,仅撤消摄像头和查看转换:

glm::mat4 BulletToWorld = glm::_inverse(CameraAndProj * View);
//bullet coordinates in world space
glm::vec4 bulletWorldCoords = BulletToWorld * glm::vec4(x, y, z, 1.0);

请注意,逐步撤消是inv(CameraAndProj),然后是inv(View)。矩阵代数告诉我们,它等于inv(CameraAndProj * View)

最新更新