我需要计算由 Ax + By + Cz + D = 0 定义的平面的交点形状(紫色)和由矩形角发出的4条光线定义的平截头体(红色箭头)。结果应该是四边形(4点),重要的要求是结果形状必须在平面的局部空间中。平面是用变换矩阵 T
( vec3(0, 0, 1)
空间中的T
平面正常。
这是我的矩形投影到另一个空间(转换/矩阵/节点)的透视形式。我可以通过平面线交叉算法计算任何矩形的交叉形状没有透视光线(所有光线都是平行的)伪代码):
说明:
// 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;
}
透视形式带来一些问题,因为一些光线可能与平面平行(交点是无限的)或最终形状是自相交的。 在某些情况下有效,但对于任意转换来说还不够。如何通过透视获得正确的平面交叉部分?
简单地说,我需要通过任意角度来看待仲裁平面的可见部分"相机"。
感谢您的建议。
答案 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上的数学解决方案。如果您的四个箭头从一个点发出,并且形成的侧面共享一个公共角度,那么您正在寻找一种解决圆锥体投影问题的方法。您的要求大大简化了问题,因为您使用法线而不是两个有界矢量来定义平面,因此如果您同意这些定义...
然后,我可以为您提供数学解决方案here (Internet Explorer .mht file, possibly requiring modern Windows OS)。如果您正在考虑一个实际的实现,那么我只能将您引向一个我在此处实现/上传的非常类似的视锥投影实现(Lua):https://github.com/quiret/mta_lua_3d_math
实现的路线图可能如下:为所有子问题(0