OpenGL-绘制相机空间后,将模型放置在世界空间中
OpenGL - Placing a model in world space after drawing in camera space?
有没有办法在opengl中可以在相机空间绘制一个对象,并且一旦您移开,它就可以留在世界空间?
?我想离开子弹,让它留在世界空间中,而不是在相机空间中并固定在相机上。
有没有办法这样做,还是我做错了?我认为我不能在世界空间中绘制对象,因为我可以面对任何方向。谢谢。
子弹与世界上任何对象都没有什么不同。使对象与其他对象有所不同的是在同一空间中其坐标。 如果您在相机坐标中有子弹,则可以通过将它们乘以"视图 *模型"矩阵的倒数来获得其世界坐标。 假设您使用代码设置了子弹相对于相机: 您选择的" ModelMatrix"的名称可能与用于在世界空间中设置对象的矩阵相混淆,而不是相对于相机。因此,更好地重命名: 我们可以说,子弹本地坐标中子弹XYZ的点被转换为 其余对象通过矩阵 请注意,逐步撤消是
在相机坐标中具有对象意味着您可以避免通过"模型"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;
glm::mat4 BulletInCameraMatrix = BulletTranslationMatrix * BulletRotationMatrix * BulletScaleMatrix;
glm::mat4 CameraAndProj = ProjectionMatrix * BulletInCameraMatrix ;
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)
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- QTableView:endMoveRows在模型中重置水平页眉大小
- 使用命名空间时出现多个定义错误
- OpenGL相机和相机空间转型的困惑
- 将IBM Rhapsody模型集成到VS 2019中
- CUDA内核和数学函数的显式命名空间
- 旋转模型矩阵时的形状失真
- 打印第二列时的2d字符矢量打印空间
- 嵌套的匿名命名空间
- CMakeLists.txt中的命名空间表示法
- 我们可以将阈值应用于色彩空间模型的单个组件(如 RGB 和 LAB)吗?
- OpenGL-绘制相机空间后,将模型放置在世界空间中
- 如何使用Odeint求解状态空间模型
- 为什么使用摄影机空间而不是模型空间作为法线