#4553 Score: 0
zyk
Participant
6 pts

1. zNear = -zNear, zFar = -zFar这两句取反本来就是需要的,因为定义中,zNear和zFar传入的是距离,所以是正数,但是我们推导透视矩阵的时候,需要的是坐标,假定看向Z负半轴的话,坐标都是负的,需要取负
2. vert.z() = -vert.z()*f1 + f2,这一句,是为了将深度值取反,之所以要变这个,是因为你的透视矩阵传递的深度跟框架对深度的设定不匹配
3. 框架假定,在归一化NDC坐标中,深度的区间为[-1, 1],-1为靠近视点,1为远离(越大越远)
4. 透视矩阵推导中,我们把所有东西都转换到看向Z负半轴,因此Z值是负的,并且是越小越远,这与框架的假定相反
5. 想解决这种相反,有两个方式,第一就是改这句vert.z() = -vert.z()*f1 + f2,第二是将你的透视矩阵整个乘以-1(透视矩阵齐次分量传递的是深度,整个乘以-1其实只会影响深度)
6. 正确的做法我觉得是透视矩阵乘以-1,符合框架的设定
7. 按照老师在课堂推导的透视矩阵,还需要乘以如下矩阵
1, 0, 0, 0,
0, 1, 0, 0,
0, 0,-1, 0,
0, 0, 0, 1
用于将z取反,这个取反的原因也是因为z值要改成越大越远
8. 之所以透视矩阵需要做两次取负,是因为我们的透视矩阵其实传递了两个深度,一个是z分量,一个是w分量,要取负两个都得反

This post has received 1 vote up and 1 vote down.