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

C++ OpenGL引擎中调用glm::lookAt传vec3参数出现原变量被修改问题

问题根本原因

你的代码存在两个核心逻辑错误,共同触发了nan问题:

  1. glm::lookAt参数非法
    glm::lookAt的第一个参数是相机(此处为平行光)的位置,第二个参数是相机看向的目标点。你修改代码后将光的位置设为frustumCenter,但目标点还是固定写死的glm::vec3(0.0f, 100.0f, 200.0f) + lightDirection:
  • 当光的位置与目标点坐标重合/距离极近时,lookAt内部计算视线向量会得到零向量,归一化后直接产生nan,生成的lightView矩阵全为非法值
  • 下一帧调用函数时,第一步就会用带nan的lightView变换视锥体点,后续所有计算结果都会被污染为nan,形成恶性循环
  1. 平行光位置逻辑不符合阴影计算规则
    对于平行光的正交阴影映射,正确的光位设置逻辑是:光需要放在视锥体中心沿光照反方向的位置,看向视锥体中心,才能保证整个相机视锥体都在阴影视锥体内,正确写法参考:
// 光从视锥外沿光照方向看向视锥中心
glm::vec3 lightPos = glm::vec3(frustumCenter) - lightDirection * SHADOW_DISTANCE;
glm::vec3 lightTarget = glm::vec3(frustumCenter);
lightView = glm::lookAt(lightPos, lightTarget, glm::vec3(0,1,0));

其他隐藏问题

你的视锥体边界计算循环存在漏检:std::array<glm::vec3,8>共8个点,但循环条件写的是i<7,只会遍历前7个点,导致边界计算不准确,可能出现阴影裁切的问题,需要改为i<8。

内容的提问来源于stack exchange,提问作者user11779843

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:27:03