본문 바로가기
STL/한눈에보기

파이썬 STL 시각화 패키지 numpy-stl 글 하나로 끝내기

by 만다린망고 2023. 12. 8.
반응형

오늘 사용할 stl 은 아래와 같습니다. 다운받아서 사용하시면 됩니다. 

CAT.stl
3.37MB


먼저 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()

 

 

 

 

 

 

 

반응형

댓글