반응형
오늘 사용할 stl 은 아래와 같습니다. 다운받아서 사용하시면 됩니다.
먼저 stl을 불러와봅시다. 코드는 아래와 같습니다.
import os
from stl import mesh
import numpy as np
#stl이 있는 폴더 경로
path="폴더경로"
#폴더 경로를 현재 디렉토리로
os.chdir(converted_path)
#stl 불러오기
cat = mesh.Mesh.from_file('cat.stl')
데이터를 살펴봅시다. 아래와 같이 콘솔창이 입력합니다.
>>> cat
<stl.mesh.Mesh object at 0x000001B02A2D84C0>
데이터타입이 stl.mesh.Mesh 라는 것을 알 수 있습니다.
1. 각 매쉬 별 점 정보를 알고 싶어요!
아마 우리는 각 삼각매쉬를 형성하고 있는 점 정보를 주로 다룰 것입니다. 각 매쉬는 세개의 점으로 구성되어 있습니다. 각 매쉬별 점 정보를 출력하는 방법은 아래와 같습니다.
>>> cat.vectors
array([[[ 613.4, -21935.7, 31444.1],
[ 620.5, -21854.1, 31493.5],
[ 553.4, -21868.2, 31515.9]],
[[ 613.4, -21935.7, 31444.1],
[ 553.4, -21868.2, 31515.9],
[ 546.4, -21951.6, 31464.3]],
[[ 620.5, -21854.1, 31493.5],
[ 620.7, -21761. , 31537.1],
[ 554.4, -21772.4, 31561.3]],
...,
[[ -884.5, -15131.1, 15187.2],
[ -372.2, -15083.9, 15168.4],
[ -721.7, -15387.3, 15388.2]],
[[ -721.7, -15387.3, 15388.2],
[ -372.2, -15083.9, 15168.4],
[ -313.1, -15512.8, 15480.6]],
[[ -721.7, -15387.3, 15388.2],
[ -313.1, -15512.8, 15480.6],
[ -610.9, -15685.4, 15621.7]]], dtype=float32)
shape을 확인해봅시다.
>>> cat.vectors.shape
(70576, 3, 3)
2. 각 매쉬 별 법선벡터를 알고 싶어요!
각 삼각매쉬의 법선벡터를 사용하는 경우도 종종 있습니다. 각 삼각매쉬의 법선벡터를 확인하는 방법은 아래와 같습니다.
>>> cat.normals
array([[ 2524.3892 , -3473.8071 , 5375.225 ],
[ 2505.2397 , -3598.582 , 5476.5234 ],
[ 2750.172 , -2895.4941 , 6170.2227 ],
...,
[ 4670.5293 , -106032.91 , -138935.39 ],
[ 449.05273, -122103.8 , -167831.25 ],
[ -1759.9297 , -85170.25 , -107898.5 ]], dtype=float32)
shape은 아래와 같습니다.
>>> cat.normals.shape
(70576, 3)
매쉬의 개수와 같다는 것을 알 수 있습니다.
3. 모든 점을 출력하고 싶어요!
메소드가 따로 있지는 않아서 아래와 같은 방법을 사용합니다. vectors 의 결과를 reshape 해서 3열의 배열로 만들어줍니다. 다음으로 np.unique 를 적용하여 고유한 점들만 추출합니다.
point_unique=np.unique(cat.vectors.reshape(-1, 3),axis=0)
>>> point_unique
array([[-6277.6, 12695.6, 1059.3],
[-6274.6, 12576.9, 902.4],
[-6266.9, 12841.1, 1196.3],
...,
[ 6266.9, 12841.1, 1196.3],
[ 6274.6, 12576.9, 902.4],
[ 6277.6, 12695.6, 1059.3]], dtype=float32)
shape은 아래와 같습니다.
>>> point_unique.shape
(35290, 3)
4. 시각화 해주세요!
마지막으로 시각화를 해봅시다. cat.stl 을 시각화하는 방법은 아래와 같습니다. matplotlib 를 사용한 방법입니다.
import os
from stl import mesh
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d
#stl이 있는 폴더 경로
path="폴더경로"
#폴더 경로를 현재 디렉토리로
os.chdir(converted_path)
#stl 불러오기
cat = mesh.Mesh.from_file('cat.stl')
point_unique=np.unique(cat.vectors.reshape(-1, 3),axis=0)
# 3D 시각화
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(point_unique[:, 0], point_unique[:, 1], point_unique[:, 2])
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
# 축 눈금 간격 동일하게 설정
ax.set_box_aspect([np.ptp(point_unique[:, 0]), np.ptp(point_unique[:, 1]), np.ptp(point_unique[:, 2])])
plt.show()
반응형
'STL > 한눈에보기' 카테고리의 다른 글
numpy-stl mesh 데이터를 pyvista PolyData 로 바꾸기가 힘든 이유 (0) | 2023.12.08 |
---|---|
파이썬 STL 시각화 패키지 pyvista 글 하나로 끝내기 (0) | 2023.12.08 |
댓글