You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

移动相机后鼠标点击射线投射起点仍停留在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 16:15:00