移动相机后鼠标点击射线投射起点仍停留在0,0,0是什么原因?
3D射线拾取相机移动后射线起点不跟随问题修复方案
核心根因
代码存在变量名笔误:你定义的射线近点变量为startRay、远点变量为endRay,但后续透视除法操作错误使用了未更新的变量startR、endR,导致计算得到的射线方向始终是相机初始位置对应的方向,如果全局startR的初始值绑定了原点参数,就会出现射线起点不随相机移动更新的问题。
修复后完整代码
// 1. 获取鼠标坐标并归一化 float x = (2.0f * lastX) / width - 1.0f; float y = 1.0f - (2.0f * lastY) / height; // 2. 从裁剪空间转换到世界空间 glm::mat4 inverseWorldMatrix = glm::inverse(proj * view); glm::vec4 near_vec = glm::vec4(x, y, -1.0f, 1.0f); glm::vec4 far_vec = glm::vec4(x, y, 1.0f, 1.0f); glm::vec4 startRay = inverseWorldMatrix * near_vec; glm::vec4 endRay = inverseWorldMatrix * far_vec; // 透视除法:修复变量名错误 startRay /= startRay.w; endRay /= endRay.w; // 方向计算后归一化,保证后续长度计算准确 glm::vec3 direction = glm::normalize(glm::vec3(endRay - startRay)); // 射线起点直接取当前实时相机位置 glm::vec3 startPos = camera.GetPosition(); glm::vec3 endPos = startPos + direction * someLength;
额外验证项
如果修复变量名后问题仍然存在,请核对两处配置:
- 每次计算射线前必须重新调用
camera.GetViewMatrix()获取最新视图矩阵,不能复用相机初始位置的旧view矩阵 - 确认
camera.GetPosition()接口返回的是当前实时的相机位置,而非缓存的初始位置值
内容的提问来源于stack exchange,提问作者Fullstack_Developer
相关产品推荐
相关产品推荐

