【问题标题】:From pixel to world coordinate formula explanation从像素到世界坐标公式解释
【发布时间】:2015-07-23 15:23:52
【问题描述】:

我有以下(相对简单的)问题。我正在开发一个光线追踪器,我正在按照此链接中解释的教程进行操作:

http://www.scratchapixel.com/code.php?id=3&origin=/lessons/3d-basic-rendering/introduction-to-ray-tracing

有一个我不明白的公式,它用于将像素 (i,j) 映射到世界坐标。公式如下:

float fov = 30, aspectratio = width / height; 
float angle = tan(M_PI * 0.5 * fov / 180.);
float xx = (2 * ((x + 0.5) * invWidth) - 1) * angle * aspectratio; 
float yy = (1 - 2 * ((y + 0.5) * invHeight)) * angle;

在本教程中,相机放置在 (0,0,0) 并且完全不使用 up/right/lookAt 向量。似乎在每个教程中都使用不同的公式来映射像素,而我无法理解原因。 此外,如果我的相机不是放置在 (0,0,0) 而是放置在我可以决定的另一个位置怎么办?公式将如何变化?你能帮帮我吗?谢谢!

【问题讨论】:

  • 您可以通过两种不同的方式查看运动:1) 相机移动而世界静止,2) 世界移动而相机静止。如果您将相机固定在 (0, 0, 0) 并将上/右/注视方向固定在本地 y/x/z 方向,那么如果您想通过矢量 v 移动相机,您可以改为移动-v 的世界并使用相同的代码。与旋转相同,不是将相机旋转theta,而是将世界旋转-theta
  • 这节课都解释了:scratchapixel.com/lessons/3d-basic-rendering/… 我不敢相信有些人懒到不阅读人们付出了很多努力的工作,直接去SO问他们提到的参考文献中回答了一个问题。

标签: c++ graphics 3d rendering pixel


【解决方案1】:

http://scratchapixel.com/lessons/3d-basic-rendering/3d-viewing-pinhole-camera

如果您对该网站进行更多研究,您就会找到答案。这个网站的重点是解释这种技术。请在期待 SO 上的任何人为您回答之前做出努力。你的问题应该被严重否决。这纯粹是懒惰。

【讨论】:

    【解决方案2】:

    我建议您点击此链接: https://www.opengl.org/wiki/Compute_eye_space_from_window_space

    您的 x 范围在屏幕坐标 [0, WindowWidth] 中。 在第一行中,您在标准化设备坐标 (NDC) 中计算它,它在 [-1,1] 的范围内。

    x_NDC = ( x_Screen *2 / WindowWidth ) - 1;
    

    您可以通过将 x_Screen 设置为最大 (WindowWidth) 和最小 (0) 来检查它。你得到 1 和 -1。 y 坐标也一样:

    y_NDC = ( y_Screen *2 / WindowHeight ) - 1;
    

    您的 z 范围是 [Near,Far]。

    z_NDC = ( z_Screen - Near ) / ( Far - Near);  // Here you have it scaled to [0,1]
    z_NDC = 2*NDC -1 //Scaled to [-1,1];
    

    获得 NDC 坐标后,只需将其与投影矩阵的逆矩阵和模型视图矩阵的逆矩阵相乘即可​​得到世界坐标。

    【讨论】:

    • 你的解释没有任何价值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 2018-07-03
    • 2013-12-16
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    相关资源
    最近更新 更多