【问题标题】:Setting the up vector in the camera setup in a ray tracer在光线追踪器的相机设置中设置向上矢量
【发布时间】:2015-07-01 02:15:39
【问题描述】:

我正在阅读计算机图形学的基础知识并尝试设置我自己的光线追踪器。这本书说“构造相机框架的最常见方法是从视点,它变成e,视图方向,它是-w,以及向上向量,它用于构建一个基础,其中有v和w由视图方向和向上方向定义的平面"

但后来我遇到了How to move a camera using in a ray-tracer?,它说我们需要通过与相机方向 (w) 执行叉积来校正(斜率?)的向上向量。这是为什么呢?

我正在使用lookAt(0,0,0) 和up(0,1,0) 调用我的相机设置

// a camera can be constructed using a position, direction and an up vector
Camera::Camera(Vector position, Vector lookAt, Vector up) {
    this->position = position;
    this->lookAt = lookAt;

    // the difference between camera position and where we want
    // to look at is the direction of the camera
    Vector direction = lookAt.diff(position);

    // camera frame
    w = direction.normalize();
    v = up.cross(w).normalize(); // right vector


    // which is the correct up?
    u = up.normalize();
    printf("%.2f %.2f %.2f\n", u.getX(), u.getY(), u.getZ()); // prints 0 1 0

    u = v.cross(w).normalize(); // the up vector
    printf("%.2f %.2f %.2f\n", u.getX(), u.getY(), u.getZ()); // prints 0.31 -0.86 -0.41
}

【问题讨论】:

  • 它是 slop,而不是 slope

标签: camera raytracing


【解决方案1】:

你最终需要的是一对构成图像平面的正交基的向量。其中之一将相对于相机的方向指向右侧。另一个将相对于相机的方向指向上方。

如果向上矢量是一般的“天空是那样的”,并且如果您的相机不水平,那么向上矢量和相机向上矢量会略有不同。向上向量是关于您想要的方向的提示,但它并不完全是正确的向量。在这种情况下,您可以将右向量与方向向量相交,这将为您提供一个位于图像平面并垂直于右向量的向量。这就是你想要的。

如果向上向量是一般的“天空是那样的”,并且如果您的相机水平的,那么向上向量和camera_up向量将完全相同。额外的叉积是不必要的,但如果您希望代码足够通用以处理第一种情况,这并没有什么坏处。

也许一些 ASCII 艺术可以帮助澄清......

^                                        * look-at point
| "up"        "camera up"
|                  \ 
|       image plane \
                     \
                 "camera down"

向上的向量是直线向上的。观察点高于相机,因此相机必须向后倾斜一点。在图中,我们看到了图像平面的边缘。 “右”向量位于该平面中并从图中指出。方向向量(您的代码称为w)垂直于图像并直接指向观察点。

相机向上矢量(代码中的u)必须位于图像平面中,因此我们不能只使用“向上”。它必须垂直于“右”向量。最简单的方法是交叉这两个向量。

由于我们根据原始向上向量生成了“正确”向量,这为我们提供了方向。

【讨论】:

  • 使用右手定则,如果你穿过相机方向(应该有点类似于Z轴,进入图片)和右向量,你应该得到一个近似向下的向量,而不是起来,对吧?另外,什么是图像平面?是相机光线穿过的 x-y 网格吗?还是 3-D 的盒子?我猜你是说你需要 2 个轴来制作这个盒子,这就是为什么我们需要一个向上和一个正确的向量,对吧?
  • 我的答案假设 XY 平面是世界空间中的“地面”,而 Z 是高度。想象一下站在地板上拿着相机。它的位置具有正 Z 分量,并且它的视图矢量几乎与地面平行。 (在我的图表中,它略微向上。)相机胶片的平面(紫外线网格)垂直于视图网格。一种常见的方法是变换一切,直到胶片平面与 XY 平面重合,并且相机沿 Z 轴指向。那是等价的,但不是我在这里描述的。
  • 不确定我是否完全理解这件事背后的数学原理。我发布了一个新问题here
猜你喜欢
  • 2022-10-02
  • 1970-01-01
  • 1970-01-01
  • 2013-11-02
  • 2012-06-19
  • 2016-08-23
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
相关资源
最近更新 更多