【问题标题】:How to calculate correct plane-frustum intersection?如何计算正确的平截头体相交?
【发布时间】:2018-02-28 20:08:24
【问题描述】:

问题:

我需要计算由 Ax + By + Cz + D = 0 定义的平面的交点形状 (purple) 和由矩形角发出的 4 条光线定义的截锥体(红色箭头)。结果应该是四边形(4 个点),重要的要求是结果形状必须在平面的局部空间中。 平面是用变换矩阵创建的 T(平面的法线是vec3(0, 0, 1)T 的空间中)。

解释:

这是我的矩形投影到另一个空间的透视形式(变换/矩阵/节点)。我能够通过 plane-line intersection 算法 (伪代码)

定义:

// Plane defined by normal (A, B, C) and D
struct Plane { vec3 n; float d; };

// Line defined by 2 points
struct Line { vec3 a, b; };

路口:

vec3 PlaneLineIntersection(Plane plane, Line line) {
    vec3 ba = normalize(line.b, line.a);
    float dotA = dot(plane.n, l.a);
    float dotBA = dot(plane.n, ba);
    float t = (plane.d - dotA) / dotBA;
    return line.a + ba * t;
}

透视形式有一些问题,因为一些光线可能与平面平行(交点无限大)或最终形状是自相交的。 它在某些情况下有效,但对于任意转换来说还不够。如何通过透视得到正确的平面相交部分?

简单地说,我需要通过任意透视“相机”获得任意平面的可见部分。

感谢您的建议。

【问题讨论】:

    标签: geometry line intersection perspective plane


    【解决方案1】:

    平面(一个 Ax+By+Cx+D 方程)和一条线(两个平面方程)之间的交点是求解 x,y,z 的 3x3 矩阵的问题。

    在 T 空间(原点位于金字塔顶部)上进行所有计算更容易,因为某些 A、B、C 为 0。

    我不知道你是否知道,透视是一种投影,它扭曲了z(“深度”,远非起源)。所以如果包含矩形的平面不垂直于平锥体的轴(z轴),那么它在投影到平面时就不是矩形,而是梯形。

    无论如何,使用projection perspective matrix,您可以获得四个矩形角的投影坐标。

    要判断一个点是在平面的一侧还是在另一侧,只需将点坐标放入平面方程并得到符号,如图所示here

    【讨论】:

      【解决方案2】:

      您的问题似乎本质上是数学问题,所以请原谅我在 StackOverflow 上的数学解决方案。如果您的四个箭头从一个点发射并且形成的侧平面共享一个共同的角度,那么您正在寻找平截头体投影问题的解决方案。您的要求大大简化了问题,因为您使用法线而不是两个有界向量定义了平面,因此如果您同意这些定义...

      那么我可以为您提供数学解决方案here (Internet Explorer .mht file, possibly requiring modern Windows OS)。如果您正在考虑一个实际的实现,那么我只能指导您使用我在此处实现/上传的非常相似的平截头体投影实现(Lua):https://github.com/quiret/mta_lua_3d_math

      实现的路线图如下:为所有子问题(0

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-18
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-12
        相关资源
        最近更新 更多