确定由3个顶点形成的平面切割的网格
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了确定由3个顶点形成的平面切割的网格相关的知识,希望对你有一定的参考价值。
我从三个顶点发现了一个平面方程。现在,如果我有一个边界框(即一个大的立方体),我如何确定平面切割大立方体的网格位置(小立方体)。
我目前正在遵循这种方法:
对于每个小立方体中心,比如说(Xp,Yp,Zp),计算到平面的垂直距离,即(aXp + bYp + c * Zp + d)/(SquareRoot Of(a ^ 2 + b ^ 2 + c ^ 2) ))。这应该小于或等于(smallCube * SquareRoot(3))/ 2的长度。如果这个标准得到满足,那么我假设我的飞机在这个小立方体位置切割大立方体。
a,b,c,d是平面的系数,形式为ax + by + cz + d = 0。
我真的很高兴,如果有人能让我知道,如果我做错了什么(或),还有其他任何简单的方法。
似乎你想得到一个与给定平面相交的小立方体(网格体素)列表。
最简单的方法:
找到平面与任何立方体边缘的交点。例如,可以通过求解未知Y的该等式来计算与AAB的垂直边缘的交点(X0,Z0是常数):
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
对于所有立方体保持相同,因此请计算一次并稍后使用。
以上是关于确定由3个顶点形成的平面切割的网格的主要内容,如果未能解决你的问题,请参考以下文章