Viewing 1 reply thread
  • Author
    Posts
    • #4546 Score: -1
      杰哥
      Participant
      2 pts

      作业三的牛之前一直倒过来。。。最后在main.cpp的投影矩阵里面加了zNear = -zNear, zFar = -zFar,并且在rasterizer.cpp中将
      vert.z() = vert.z()*f1 + f2改为vert.z() = -vert.z()*f1 + f2,得到了和作业文档里一样的正的牛。但是不明白为什么改了这两个地方牛就正了。。。
      倒的牛和代码如下

      This post has received 1 vote up.
      Attachments:
      You must be logged in to view attached files.
    • #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.
Viewing 1 reply thread
  • You must be logged in to reply to this topic.