glm lookAt 和矩阵变换产生奇怪的行为

Posted

技术标签:

【中文标题】glm lookAt 和矩阵变换产生奇怪的行为【英文标题】:glm lookAt and matrix transformation yielding odd behaviour 【发布时间】:2013-06-21 18:40:41 【问题描述】:

我正在使用glm::lookAt 来获取一个矩阵来改变世界。这很好用,我可以生成矩阵,将其输入着色器,一切正常。我现在需要做的是通过lookAt 矩阵转换任意向量(即100,100,100,1)。出于某种原因,我得到了垃圾值

glm::mat4 model = glm::lookAt(glm::vec3(current_pos.x,
                                        current_pos.y, 
                                        current_pos.z),
                              glm::vec3(current_pos.x + dir.x,
                                        current_pos.y + dir.y, 
                                        current_pos.z + dir.z),
                              glm::vec3(up.x,up.y,up.z));
GLfloat fmodel[16] =

    model[0][0],
    model[0][1],
    model[0][2],
    model[0][3],

    model[1][0],
    model[1][1],
    model[1][2],
    model[1][3],

    model[2][0],
    model[2][1],
    model[2][2],
    model[2][3],

    model[3][0],
    model[3][1],
    model[3][2],
    model[3][3]
;

model 的值的打印输出:0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3 我正在使用model * vec4(x, y, z, 1)计算点

矩阵是重复的,所以我可以将它作为制服传递。两者都使用原始矩阵和从数组构造矩阵产生相同的结果。

编辑

打印代码如下:

for (unsigned i = 0; i < 16; ++i)
  printf("%d,", fmodel[i]);

无论我的向量是什么,这都会产生3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 的输出

【问题讨论】:

你的向量具体是什么,你得到了什么结果? 为什么要复制矩阵? model 已经是 float[16] 数组, 向量具体为100,100,100,1。不同的值不会改变结果。结果的值随着程序的每次调用而变化,就像未初始化的变量一样。复制已完成,因此我可以将矩阵作为统一传递,这要求它是一个浮点数组 current_posdirup 输入到 lookat 的值是什么?您的打印代码中一定有一些错误,因为glm::lookat 不可能生成这样的矩阵。旁注:在矩阵/向量上使用glm::value_ptr() 以获得浮点数组。 current_pos 最初是 1.5,100,6。 dir 是指向 -z 的归一化向量。 up 点 +y。但是,当这些变化时,矩阵输出不会。我不知道glm::value_ptr()。我将更新代码以反映 【参考方案1】:

奇怪的是,在使用 glm::value_ptr() 重写了大量代码之后,现在可以正常工作了

【讨论】:

以上是关于glm lookAt 和矩阵变换产生奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章

相机 旋转

相机 旋转

相机 旋转

使用 GLM(旋转)为 OpenGL 创建变换矩阵

如何缩放使用 glm::lookat() 获得的矩阵?

LookAt Matrix 实现中的点积