본문 바로가기
STL/numpy stl 모듈

[numpy-stl] stl 생성 원리

by 만다린망고 2023. 5. 26.
반응형

numpy-stl 에서 정사면체를 생성하는 예제는 아래와 같습니다. 

import numpy as np
from stl import mesh

# mesh points
vertices = np.array([[0, 0, 0],
                     [1, 0, 0],
                     [0, 1, 0],
                     [0, 0, 1]])

# mesh faces
faces = np.array([[0,1,2],  # square
                   [0,1,3],     # triangle
                   [0,2,3],
                   [1,2,3]])    # triangle

# Create the mesh
cube = mesh.Mesh(np.zeros(faces.shape[0], dtype=mesh.Mesh.dtype))
for i, f in enumerate(faces):
    for j in range(3):
        cube.vectors[i][j] = vertices[f[j],:]


vertices 변수에 총 네개의 점을 생성했습니다. 각각의 점은 순서 대로 0번, 1번, 2번, 3번 점 입니다. 점의 번호를 이용하여 faces 변수에 면을 생성합니다. 

np.zeros(faces.shape[0],dtype=mesh.Mesh.dtype) 을 이용하여 배열을 하나 생성합니다. faces.shape[0] 은 면의 개수입니다. 생성된 배열은 아래와 같습니다. 

>>> np.zeros(faces.shape[0], dtype=mesh.Mesh.dtype)
array([([0., 0., 0.], [[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]], [0]),
       ([0., 0., 0.], [[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]], [0]),
       ([0., 0., 0.], [[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]], [0]),
       ([0., 0., 0.], [[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]], [0])],
      dtype=[('normals', '<f4', (3,)), ('vectors', '<f4', (3, 3)), ('attr', '<u2', (1,))])


이 배열은 mesh.Mesh 의 입력값으로 사용됩니다. mesh.Mesh에 위배열을 입력하고 cube 라는 변수를 생성했습니다. cube 를 인터프리터 창에 입력해보면 아래와 같습니다. 

>>> cube
<Mesh: '' 4 vertices>


점이 4개 라고만 출력됩니다. 이어서 for 문을 이용하여 cube.vectors 를 채워줍니다. 최종 생성된 cube.vectors 는 아래아 같습니다. 

>>> cube.vectors
array([[[0., 0., 0.],
        [1., 0., 0.],
        [0., 1., 0.]],

       [[0., 0., 0.],
        [1., 0., 0.],
        [0., 0., 1.]],

       [[0., 0., 0.],
        [0., 1., 0.],
        [0., 0., 1.]],

       [[1., 0., 0.],
        [0., 1., 0.],
        [0., 0., 1.]]], dtype=float32)


세개의 점이 하나의 face 를 이루고 있습니다. face 는 총 4개 입니다. 

반응형

댓글