繁体   English   中英

确定由平面切割的网格,该网格由3个顶点组成

[英]Determining the grids cut by a plane,formed from 3 vertices

我从三个顶点找出一个平面的方程。 现在,如果我有一个边界框(即一个大立方体),如何确定平面切割大立方体的网格位置(小立方体)。

我目前正在采用这种方法:

对于每个小立方体中心,说(Xp,Yp,Zp),计算到平面的垂直距离,即(a Xp + b Yp + 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算法。 也许对于平面体素化也存在类似的东西

这是此页面上的 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;
}

请注意,所有多维数据集的er都相同,因此请计算一次,以后再使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM