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

点光源阴影映射中glm::lookAt函数上向量的确定疑问

点光源深度立方体贴图阴影中glm::lookAt上向量的疑问

我正在实现基于深度立方体贴图的点光源阴影,参考教程使用1个透视矩阵和6个视图矩阵完成光源空间变换,教程中的6个视图矩阵代码如下:

std::vector<glm::mat4> shadowTransforms;
shadowTransforms.push_back(shadowProj * 
                 glm::lookAt(lightPos, lightPos + glm::vec3( 1.0, 0.0, 0.0), glm::vec3(0.0,-1.0, 0.0));
shadowTransforms.push_back(shadowProj * 
                 glm::lookAt(lightPos, lightPos + glm::vec3(-1.0, 0.0, 0.0), glm::vec3(0.0,-1.0, 0.0));
shadowTransforms.push_back(shadowProj * 
                 glm::lookAt(lightPos, lightPos + glm::vec3( 0.0, 1.0, 0.0), glm::vec3(0.0, 0.0, 1.0));
shadowTransforms.push_back(shadowProj * 
                 glm::lookAt(lightPos, lightPos + glm::vec3( 0.0,-1.0, 0.0), glm::vec3(0.0, 0.0,-1.0));
shadowTransforms.push_back(shadowProj * 
                 glm::lookAt(lightPos, lightPos + glm::vec3( 0.0, 0.0, 1.0), glm::vec3(0.0,-1.0, 0.0));
shadowTransforms.push_back(shadowProj * 
                 glm::lookAt(lightPos, lightPos + glm::vec3( 0.0, 0.0,-1.0), glm::vec3(0.0,-1.0, 0.0));

我理解glm::lookAt的工作原理,但对其中上向量的确定存在疑问:比如第一个lookAt的最后一个参数为什么是(0,-1,0)而非(0,1,0)?

我尝试使用其他上向量组合,例如:

(0,1,0)
(0,1,0)
(1,0,0)
(1,0,0)
(0,1,0)
(0,1,0)

但运行出现错误。我查询得到的答案与教程相反:

glm::vec3 upVectors[6] = {
    glm::vec3(0.0, 1.0, 0.0),  // 右
    glm::vec3(0.0, 1.0, 0.0),  // 左
    glm::vec3(0.0, 0.0, -1.0), // 上
    glm::vec3(0.0, 0.0, 1.0),  // 下
    glm::vec3(0.0, 1.0, 0.0),  // 远
    glm::vec3(0.0, 1.0, 0.0)   // 近
};

我想知道,这是否意味着必须遵循教程中的既定上向量,还是有其他背后的原因?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 16:05:28