我正在关注LearnOpenGL教程,并且一直在修补阴影投射。到目前为止,一切工作正常,但是存在一个非常具体的问题,我无法从纯垂直定向光投射阴影。让我们添加一些代码。我的光空间矩阵如下所示:
glm::mat4 view = glm::lookAt(-direction, glm::vec3(0.0f), glm::vec3(0.0f, 1.0f, 0.0f));
return glm::ortho(-10.0f, 10.0f, -10.0f, 10.0f, -10.0f, 10.0f) * view;
方向当然是 vector ,方向光的方向为定向光。在该方向 vector 设置为(0,-1,0)之前,一切工作都很好,因为它与向上 vector (0,1,0)平行。为了构造
lookAt
矩阵,glm在上 vector 和中心与眼睛之间的差之间执行叉积(因此,在这种情况下基本上是方向),但是由于两个 vector ,叉积不会给出任何结果是平行的。知道了所有这些之后,我的问题将是:当向上 vector 和光的方向平行时,我的
lookAt
View 矩阵应该如何?编辑:谢谢您的回答,我将代码更改为:
if(abs(direction.x) < FLT_EPSILON && abs(direction.z) < FLT_EPSILON)
view = glm::lookAt(-direction, glm::vec3(0.0f), glm::vec3(0.0f, 0.0f, 1.0f));
else
view = glm::lookAt(-direction, glm::vec3(0.0f), glm::vec3(0.0f, 1.0f, 0.0f));
return glm::ortho(-10.0f, 10.0f, -10.0f, 10.0f, -10.0f, 10.0f) * view;
现在一切正常!
最佳答案
当上 vector 和视线平行时,则 View 矩阵未定义,因为Cross product为(0,0,0)。
View 矩阵是Orthogonal matrix,这意味着3个轴中的每个垂直于由其他2个轴形成的平面。轴之间的 Angular 分别为90°。
View 矩阵是定义观察位置和方向的那个矩阵的逆矩阵。该矩阵由 glm::lookAt
的参数定义。由视线和上 vector 指定的轴a的2。第三轴由叉积计算。
这都意味着,您必须通过2个Orthogonal方向指定矩阵。如果方向 vector 之间的 Angular 不完全(90°),则使用glm::lookAt
进行纠正。但是,如果 vector 是并行的,该算法将无法做到这一点。
定义视线(方向) vector 和向上 vector ,彼此之间成90°角。如果旋转它们,则必须以相同的方式旋转另一个 vector 。
例如假设您有一个方向 vector (视线)和一个上 vector :
direction: (0, 0, 1)
up : (0, 1, 0)
如果方向 vector 旋转了90°,则向上 vector 也必须旋转90°:
direction: (0, -1, 0)
up : (0, 0, 1)
关于c++ - 转换平行于上 vector 的阴影时的LookAt矩阵,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58459722/