Home Forums GAMES在线课程(现代计算机图形学入门)讨论区 作业3 插值的投影透视矫正问题

Viewing 2 reply threads
  • Author
    Posts
    • #16726 Score: 0
      Cander花朵
      Participant

      作业2中有这样一段代码:

      float w_reciprocal = 1.0/(alpha / v[0].w() + beta / v[1].w() + gamma / v[2].w());
      float z_interpolated = alpha * v[0].z() / v[0].w() + beta * v[1].z() / v[1].w() + gamma * v[2].z() / v[2].w();
      z_interpolated *= w_reciprocal;

      作业3中有这样一段代码:

      float Z = 1.0 / (alpha / v[0].w() + beta / v[1].w() + gamma / v[2].w());
      float zp = alpha * v[0].z() / v[0].w() + beta * v[1].z() / v[1].w() + gamma * v[2].z() / v[2].w();
      zp *= Z;

      猜想这两段代码正在进行插值和重心坐标的投影透视矫正(因为重心坐标在投影后会改变)。
      但是我无法理解其具体计算过程,即使我在作业2中已经使用提供的代码完成了正确的输出。
      因为在 rasterize_triangle 函数中有:
      auto v = t.toVector4();
      而 toVector4 函数则将第四维,即 v[i].w() 设置为了 1 ,这是符合齐次化表示的,但我也因此无法理解为何要在计算插值的时候使用类似 alpha / v[0].w() 之类的操作。除以固定的值 1 有何意义?这里的计算不应当是 alpha / v[0].z() 吗?
      另外,我无法找到课程中提到的作业三的 FAQ ,这可能与此有关,如果有人能提供该帖地址,十分感谢。

    • #16728 Score: 0
      Cander花朵
      Participant

      已经解决部分问题,理解了投影透视矫正的内容。关键的点在于:v[i].w 是指变换前的 Z 坐标。知道这一点之后计算过程就能明白了。
      但是我仍然没能理解为什么 v[i].zv[i].w 分别指的是变换后的深度和变换前的深度。

    • #17054 Score: 0
      xiaoma10
      Participant

      我感觉源代码这里确实是有点问题的。具体的你可以看这篇blog,里面有我的评论,建议先看完blog再看评论

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