gpt4 book ai didi

c++ - 使用逆变换的 OpenGL 光线追踪

转载 作者:行者123 更新时间:2023-11-30 03:19:41 25 4
gpt4 key购买 nike

我有一个使用模型、 View 和投影矩阵来渲染三角形网格的管道。

我正在尝试实现一个光线追踪器,它将通过转换的逆向投影光线原点和方向来挑选出我正在点击的对象。

当我在顶点着色器中只有一个模型(没有 View 或投影)时

Vector4f ray_origin = model.inverse() * Vector4f(xworld, yworld, 0, 1);
Vector4f ray_direction = model.inverse() * Vector4f(0, 0, -1, 0);

一切都很完美。但是,我添加了一个 View 和投影矩阵,然后将代码更改为

Vector4f ray_origin = model.inverse() * view.inverse() *  projection.inverse() * Vector4f(xworld, yworld, 0, 1);
Vector4f ray_direction = model.inverse() * view.inverse() * projection.inverse() * Vector4f(0, 0, -1, 0);

然后什么都没有了。我做错了什么?

最佳答案

如果您使用透视投影,那么我建议在归一化设备空间中通过近平面上的一个点和远平面上的另一个点来定义光线。近平面的z坐标为-1,远平面的z坐标为1。x和y坐标必须是[-1, 1]范围内屏幕上的“点击”位置底部的坐标左边是(-1, -1),右上角的坐标是(1, 1)。窗口或鼠标坐标可以线性映射到 NDC 的 x 和 y 坐标:

float x_ndc = 2.0 * mouse_x/window_width - 1.0;
flaot y_ndc = 1.0 - 2.0 * mouse_y/window_height; // flipped

Vector4f p_near_ndc = Vector4f(x_ndc, y_ndc, -1, 1); // z near = -1
Vector4f p_far_ndc = Vector4f(x_ndc, y_ndc, 1, 1); // z far = 1

归一化设备空间中的一个点可以通过逆投影矩阵转换到模型空间,然后是逆 View 矩阵,最后是逆模型矩阵:

Vector4f p_near_h = model.inverse() * view.inverse() *  projection.inverse() * p_near_ndc;
Vector4f p_far_h = model.inverse() * view.inverse() * projection.inverse() * p_far_ndc;

在此之后,点是一个 Homogeneous coordinates , 可以通过 Perspective divide 进行转换到 Cartesian coordinate :

Vector3f p0 = p_near_h.head<3>() / p_near_h.w();
Vector3f p1 = p_far_h.head<3>() / p_far_h.w();

模型空间中的“射线”,由点 r 和归一化方向 d 最终定义为:

Vector3f r = p0;
Vector3f d = (p1 - p0).normalized()

关于c++ - 使用逆变换的 OpenGL 光线追踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53467077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com