원기둥 내부의 점 판별 코드는 아래글에서 설명했습니다.
2024.06.03 - [3D Algorithm] - 임의의 점 원기둥 내부/외부 판별 코드(c++)
Cube 내부판별은
Cube가 AABB와 같이 축에 정렬이 되어 있다면 x, y, z의 min, max로 외부/내부 판별 할 수 있겠지만, OBB같이 축에 정렬이 되어 있지 않으면 내적을 이용한 정사영으로 외부/내부 판별 할 수 있습니다. AABB와 OBB 설명은 아래글에 있습니다.
2023.12.11 - [3D Algorithm] - AABB OBB 차이와 의미
아래와 같이 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 안에 있는 점들(노란색)을 위 코드를 이용해서 찾은 결과 이미지입니다.
'3D Algorithm' 카테고리의 다른 글
CAD Revolve (1) | 2024.09.03 |
---|---|
AABB(Axis Aligned Bounding Box) 계산과 활용 (0) | 2024.08.22 |
PLY File Format(포맷 정보) (0) | 2024.06.06 |
임의의 점 원기둥 내부/외부 판별 코드(c++) (0) | 2024.06.03 |
3차원 점 직선 투영(Point Line Projection) 방법2 (0) | 2024.05.17 |