주어진 평면과 교차하는 작은 입방체 (그리드 보셀)의 목록을 얻으려는 것 같습니다.
간단한 방법 : 모든 큐브 가장자리 비행기의
찾기 교차로. 예를 들어, AAB의 수직 에지와 교차하는 Y 알이 방정식에 의해 계산 될 수있다 (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
는 레이의 경우 Amanatides/우 알고리즘과 같은 (2D와 3D 모두 포함)의 복셀 시퀀스를 생성하는 고급 방법이 있습니다. 아마도 비슷한 여기
이
e
및
r
모든 큐브에 대해 동일하게 유지, 그래서 한 번을 계산하는 것을
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;
}
참고 인 평면 voxelization 위해도 존재 나중에 사용하십시오.
출처
2017-12-22 06:17:10
MBo
한 번 내 알고리즘을 살펴보고 변경 사항을 설명해 주시면됩니다. 고맙습니다 –
Emm ... 알고리즘이 무엇입니까? 귀하의 확인은 옳지 않습니다 - 거짓 긍정적 결과가 나올 수 있습니다. 그리고 나는 당신에게 단서를주었습니다 - 모든 작은 입방체를 무차별 적으로 검사하는 방법을 없애는 방법. – MBo
프로그래머의 초심자이기 때문에 알고리즘을 코딩하는 것이 약간 어렵다는 것을 알고 있기 때문에 당신이 내 수표를 약간 수정할 수 있다면 정말 기쁠 것입니다. –