如何计算正确的平面截头积分?

时间:2017-09-19 22:29:16

标签: geometry line intersection perspective plane

问题:

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

enter image description here

说明:

这是我的矩形投影到另一个空间(转换/矩阵/节点)的透视形式。我可以通过平面线交叉算法计算任何矩形的交叉形状没有透视光线(所有光线都是平行的)伪代码)

说明:

// 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;
}

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

简单地说,我需要通过任意角度来看待仲裁平面的可见部分"相机"。

enter image description here

感谢您的建议。

2 个答案:

答案 0 :(得分:0)

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

对T空间进行所有计算(原点位于金字塔的顶部)比较容易,因为有些A,B,C为0。

我不知道你是否知道观点是一种投影,会扭曲z(“深度“,远离原点)。因此,如果包含矩形的平面不垂直于fustrum(z轴)的轴,则投影到平面时它不是矩形,而是梯形。

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

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

答案 1 :(得分:0)

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

Description of the mathematical problem

然后,我可以为您提供数学解决方案here (Internet Explorer .mht file, possibly requiring modern Windows OS)。如果您正在考虑一个实际的实现,那么我只能将您引向一个我在此处实现/上传的非常类似的视锥投影实现(Lua):https://github.com/quiret/mta_lua_3d_math

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