본문 바로가기
3D Algorithm

임의의 점 직육면체 외부/내부 판별(Point Inside Cube)

by DarkRock 2024. 6. 13.
반응형

원기둥 내부의 점 판별 코드는 아래글에서 설명했습니다. 

2024.06.03 - [3D Algorithm] - 임의의 점 원기둥 내부/외부 판별 코드(c++)

 

임의의 점 원기둥 내부/외부 판별 코드(c++)

* 아래 코드는 임의의 점이 cylinder 내부/외부에 있는지 판별하는 코드입니다. * 입력변수 설명 -  pt1: 원기둥 하단 중심점 -  pt2: 원기둥 상단 중심점 -  len: 원기둥 높이 -  radius: 원기둥 반

darkrock.tistory.com


Cube 내부판별은

Cube가 AABB와 같이 축에 정렬이 되어 있다면 x, y, z의 min, max로 외부/내부 판별 할 수 있겠지만, OBB같이 축에 정렬이 되어 있지 않으면 내적을 이용한 정사영으로 외부/내부 판별 할 수 있습니다. AABB와 OBB 설명은 아래글에 있습니다.

2023.12.11 - [3D Algorithm] - AABB OBB 차이와 의미

 

AABB OBB 차이와 의미

AABB(Axis Aligned Bounding Box)와 OBB(Oriented Bounding Box)는 모두 3D 그래픽스 및 게임 프로그래밍 분야에서 주로 사용되는 Bounding Box 계산 기법입니다. AABB는 축에 정렬된 바운딩 박스로, 3축 x(1,0,0), y(0,1,0),

darkrock.tistory.com


아래와 같이 cube의 하단 코너 포인트(ori)와 x, y, z 축에 해당하는 3점(px, py, pz)을 알고 있을 때,


3축에 해당하는 벡터
xdir = px - ori
ydir = py - ori
zdir = pz - ori

를 계산하고 ori로부터 각 축에 거리 cube_xl, cube_yl, cube_zl를 계산해서 다음 조건 식을 만족하면 cube 안의 점입니다.

xl = (p-ori) ⋅ xdir    p: 임의의 점, xdir: 단위벡터
yl = (p-ori) ⋅ ydir    ydir: 단위벡터 
zl = (p-ori) ⋅ zdir    zdir: 단위벡터

조건식: (0 < xl < cube_xl) && (0 < yl < cube_yl) && (0 < zl < cube_zl)

아래는 openmesh를 이용해서 cube 안에 있는 mesh의 점들을 찾는 코드입니다.

void findPntInsideCube(MyMesh *tmesh, MyMesh::Point ori, MyMesh::Point px, MyMesh::Point py, MyMesh::Point pz, vector<MyMesh::Point> &pnts)
{	
	MyMesh::Point xdir = px - ori;
	float cube_xl = xdir.length();
	xdir.normalize();

	MyMesh::Point ydir = py - ori;
	float cube_yl = ydir.length();
	ydir.normalize();

	MyMesh::Point zdir = pz - ori;
	float cube_zl = zdir.length();
	zdir.normalize();
		
	MyMesh::VertexIter	vit = tmesh->vertices_sbegin();
	MyMesh::VertexIter	vend = tmesh->vertices_end();
	for (; vit != vend; vit++)
	{
		MyMesh::Point p = tmesh->point(*vit);
		float xl = (p - ori) | xdir;
		float yl = (p - ori) | ydir;
		float zl = (p - ori) | zdir;
		if (0 < xl && xl < cube_xl  &&
			0 < yl && yl < cube_yl  &&
			0 < zl && zl < cube_zl)
		{
			pnts.push_back(p);		// point inside cube
		}
	}
}

 

 

아래 그림은 cylinder mesh에서 cube 안에 있는 점들(노란색)을 위 코드를 이용해서 찾은 결과 이미지입니다.

반응형