Home Forums GAMES在线课程(现代计算机图形学入门)讨论区 关于第四次课件与作业一的一些疑惑

Viewing 3 reply threads
  • Author
    Posts
    • #3170 Score: 0
      HighSun
      Participant
      5 pts

      1. 在第四次课件的第30页中,在求透视投影到正交投影的变换矩阵时,我们根据相似三角形得到了点 (x, y, z) 的新的 Y 轴坐标是 y’ = (n/z) * y,但是在此处相机的位置已经是在原点上,点 (x, y, z) 的 Z 轴坐标是负值,那么新的 Y 轴坐标是否应该写为 y’ = (n/(-z)) * y 呢?
      <br>
      2. 使用上面的方式求出的透视->正交变换矩阵 M’ 的最后一行就成为了 (0, 0, -1, 0),使用这个变换矩阵 M’ 得到的坐标系就与课件中的最后一样为 (0, 0, 1, 0) 的变换矩阵 M 关于原点对称。这是否解释了为什么作业中不少同学都遇到的“等腰三角形的顶角向下”的问题呢?

      这个问题我是昨天才感觉想明白的,如果是错的还希望各位老师助教同学们不吝指教。

    • #3171 Score: 1
      HighSun
      Participant
      5 pts

      另外,我认为对于 main.cpp 中的函数 get_projection_matrix 的两个参数 zNearzFar 的解释,是否应当是“相机到 透视投影的近、远两面 的距离”呢?这样就可以解释代码框架中的这两个参数为什么是正数,要让三角形向上,只要像上面那样修改变换矩阵就够了

      This post has received 1 vote up.
    • #3173 Score: 0
      Angus
      Participant
      23 pts

      我认为老师的推导是没错的,是代码与老师的推导不太一致。
      n和z是同符号的,它们本身是正是负无所谓,n/z一定是一个非负数。
      而且,在老师的设定中,n为负数,这可以从ppt5 page6t的t的求法中推理出,即t=tan(fov/2)*|n|
      至于你说的三角形朝下问题,可以参考

      关于光栅化后显示的x-axis和y-axis的朝向问题

      在程序中,n和f都设定为了正值,这与老师的推导是不一致的。
      如果按照老师的推导来做,要输入负值的n和f,这时的三角形是正确朝上的。

      • #3174 Score: 0
        HighSun
        Participant
        5 pts

        您好,谢谢耐心解答。

        我之前也看到助教对于三角形“向下”的解答的几篇帖子了,当时也去尝试修改了两个参数为负数,编译运行后得到的三角形仍然是“向下”的。

        刚才我发现我是基于将 zNearzFar 理解为 “n面和f面到相机的距离” 来实现透视投影函数的,在这种理解下,nf 两个参数一定是正数。所以当输入参数改变符号时,函数后半部分 “根据fov计算top” 以及 “计算正交投影中的缩放矩阵” 时对应的参数符号也发生了改变,而在之前我修改完输入参数的符号后并没有继续对应修改函数内部对应部分。这才是我修改输入参数而三角形仍然向下的原因。

        我想我是由于看到 ppt4 page30 中对坐标的“n”的标注没有加绝对值号(像 ppt5 page6 中同样图片中的那样)才产生了歧义,然后根据自己对函数中参数的理解得到了另一种推导方式而产生了上面的疑惑。现在经过修改,我已经能够用之前的变换矩阵、修改输入参数两种方式分别实现使三角形“向上”,至此我的疑惑已经解决,再次谢谢解答。

        最后,如果有别的同学和我有类似的疑惑并且仅修改输入参数符号也不能使三角形“向上”:注意一下当函数输入改变后,在函数后半部分计算的 top 的符号和正交投影的缩放矩阵中的 Z 分量符号是否也发生了改变即可。

        • #3175 Score: 2
          Angus
          Participant
          23 pts

          其实在我的测试中,如果完全按照PPT中老师推理的矩阵来写代码的话,只需注意一下求t时要对zNear取绝对值,不需要针对zNear和zFar的正值负值对代码有任何特别调整。输入的zNear和zFar改为负值后,三角形就是顶点朝上的。因此老师的推导我认为是正确的,但确如如你所说,如果把zNear和zFar的定义误解的话,是会对老师的推导过程产生怀疑。

          另外,当三角形顶点朝上后,按D键是绕z轴顺时针渲染(-10°),按A键是绕z轴逆时针渲染(+10°),也是符合认知的。
          我当时没有仔细看其他部分的代码,不过这让我有些怀疑是否zNear和zFar为负值,才是正确的。原来二者为正值的写法是bug呢?

          当zNear和zFar为正值时,按照老师的推导,Frustum是没有包含三角形的,且此时三角形在摄像机的“后面”。但是如果没有做z方向上的裁切,也就是没有depth Clamp,我们还是看得见摄像机“后面”的三角形的。这一点可以从提高部分的「绕x轴旋转」看出,无论如何绕x轴旋转该三角形,它始终都在我们的视野之内。

          This post has received 2 votes up.
    • #3235 Score: 0
      sublimation
      Participant
      3 pts

      我也是一开始少了绝对值,改为负以后还是朝下,但是我是如Angus同学所说,差在了正交投影的x,y。如果是正交投影的Z方向,应该不会造成x,y关于原点中心对称,他会使得原三角形关于xOy对称。
      所以我推测这也就解释了,为什么一开始你只是修改了”透视->正交变换矩阵 M’ 的最后一行就成为了 (0, 0, -1, 0)”却很合理。
      解释一下:
      如果直接按照n,f为正计算,有几个地方有问题:
      1.将视锥压到长方体的时候,三角形的顶点坐标是在视锥外的,而且是视锥相对在原点的对侧,做了同样的变换后,感觉像是关于原点的小孔成像一样的变换(比例不太一样)。所以,再经过正交投影后可以有图形,我觉得是一个巧合,恰好经过将视锥压到长方体的矩阵计算后,还落在了被压缩的视锥体得到的长方体内,这样才在最后的结果有了成像(假如点在视锥外,z的改变,可能会造成变换后不在这个长方体内,可能就看不到了。而且如果这个z是接近于0,那么三角形会非常大,如果趋近于无穷,又会非常小)
      2.如果n,f是正的,那么f->1;n->-1,如果n,f是负的,那么n->1;f->-1。(这个我是自己推断,不知道是否真的是这样)

      所以,修改了”透视->正交变换矩阵 M’ 的最后一行就成为了 (0, 0, -1, 0)”。关于1,可以看做恰好,是等价于了压缩[-f,-n]部分的视锥。然后关于2,n,f是正的,你的正交投影矩阵并没有变化,所以导致依旧是f->1;n->-1,这里再次翻转。最后恰好使得结果正确。

      最后,感谢一下这个错误,可以获得和各位优秀的同学讨论的机会。以及,对透视投影的理解更加深刻。

Viewing 3 reply threads
  • You must be logged in to reply to this topic.