确定由一个平面切割的网格,由 3 个顶点组成
Determining the grids cut by a plane,formed from 3 vertices
我从三个顶点找出了一个平面方程。
现在,如果我有一个边界框(即一个大立方体),我如何确定平面切割大立方体的网格位置(小立方体)。
我目前采用的是这种方法:
对于每个小立方体中心,比如 (Xp, Yp, Zp),计算到平面的垂直距离,即 (aXp + bYp + c*Zp + d )/ ((a^2 + b^2 + c^2) 的平方根)。这应该小于或等于(smallCube 的长度 * SquareRoot(3))/2。
如果满足这个标准,那么我假设我的飞机在这个小立方体位置切割大立方体。
a,b,c,d是平面的系数,形式为ax+by+cz+d = 0。
如果有人能让我知道,如果我做错了什么(或)还有任何其他简单的方法,我会很高兴。
您似乎想要获得与给定平面相交的小立方体(网格体素)的列表。
最简单的方法:
找到平面与任意立方体边的交点。例如,与 AAB 的垂直边缘(X0、Z0 为常数)的交点可以通过对未知 Y 求解此方程来计算:
aX0 + bY + c*Z0 + d = 0
并检查 Y 是否在立方体范围内。获取小立方体坐标(0, ky=Floor(Y/VoxelSize), 0)
,然后按顺序检查相邻体素(考虑平面系数以仅检查真正的候选对象)。
candidates:
0,ky,0
1,ky,0
0,ky-1,0
0,ky+1,0
0,ky,1
有更高级的方法可以为光线情况(2d 和 3d)生成体素序列,例如 Amanatides/Woo 算法。也许平面体素化也存在类似的东西
这是来自this page的AABB平面相交测试代码(包含一些解释)
// Test if AABB b intersects plane p
int TestAABBPlane(AABB b, Plane p) {
// Convert AABB to center-extents representation
Point c = (b.max + b.min) * 0.5f; // Compute AABB center
Point e = b.max - c; // Compute positive extents
// Compute the projection interval radius of b onto L(t) = b.c + t * p.n
float r = e[0]*Abs(p.n[0]) + e[1]*Abs(p.n[1]) + e[2]*Abs(p.n[2]);
// Compute distance of box center from plane
float s = Dot(p.n, c) - p.d;
// Intersection occurs when distance s falls within [-r,+r] interval
return Abs(s) <= r;
}
请注意,e
和 r
对所有立方体保持不变,因此计算一次并在以后使用。
我从三个顶点找出了一个平面方程。 现在,如果我有一个边界框(即一个大立方体),我如何确定平面切割大立方体的网格位置(小立方体)。
我目前采用的是这种方法:
对于每个小立方体中心,比如 (Xp, Yp, Zp),计算到平面的垂直距离,即 (aXp + bYp + c*Zp + d )/ ((a^2 + b^2 + c^2) 的平方根)。这应该小于或等于(smallCube 的长度 * SquareRoot(3))/2。 如果满足这个标准,那么我假设我的飞机在这个小立方体位置切割大立方体。
a,b,c,d是平面的系数,形式为ax+by+cz+d = 0。
如果有人能让我知道,如果我做错了什么(或)还有任何其他简单的方法,我会很高兴。
您似乎想要获得与给定平面相交的小立方体(网格体素)的列表。
最简单的方法:
找到平面与任意立方体边的交点。例如,与 AAB 的垂直边缘(X0、Z0 为常数)的交点可以通过对未知 Y 求解此方程来计算:
aX0 + bY + c*Z0 + d = 0
并检查 Y 是否在立方体范围内。获取小立方体坐标(0, ky=Floor(Y/VoxelSize), 0)
,然后按顺序检查相邻体素(考虑平面系数以仅检查真正的候选对象)。
candidates:
0,ky,0
1,ky,0
0,ky-1,0
0,ky+1,0
0,ky,1
有更高级的方法可以为光线情况(2d 和 3d)生成体素序列,例如 Amanatides/Woo 算法。也许平面体素化也存在类似的东西
这是来自this page的AABB平面相交测试代码(包含一些解释)
// Test if AABB b intersects plane p
int TestAABBPlane(AABB b, Plane p) {
// Convert AABB to center-extents representation
Point c = (b.max + b.min) * 0.5f; // Compute AABB center
Point e = b.max - c; // Compute positive extents
// Compute the projection interval radius of b onto L(t) = b.c + t * p.n
float r = e[0]*Abs(p.n[0]) + e[1]*Abs(p.n[1]) + e[2]*Abs(p.n[2]);
// Compute distance of box center from plane
float s = Dot(p.n, c) - p.d;
// Intersection occurs when distance s falls within [-r,+r] interval
return Abs(s) <= r;
}
请注意,e
和 r
对所有立方体保持不变,因此计算一次并在以后使用。