[파이썬] PyTorch 3D 모델링 및 애니메이션

PyTorch는 딥러닝 프레임워크로 유명한데, 신경망 모델링 뿐만 아니라 3D 모델링과 애니메이션에도 사용될 수 있습니다. 이 글에서는 PyTorch를 사용하여 3D 모델을 만들고 애니메이션을 생성하는 방법에 대해 알아보겠습니다.

3D 모델링

PyTorch에서 3D 모델링을 위해 사용되는 주요 라이브러리는 PyTorch3D입니다. 이 라이브러리는 3D 형상의 생성, 변형, 렌더링 등 다양한 기능을 제공합니다.

설치

PyTorch3D를 설치하려면 다음 명령을 실행하세요:

pip install torch torchvision
pip install -U git+https://github.com/facebookresearch/pytorch3d.git@stable

3D 모델 생성

PyTorch3D는 다양한 형상을 생성하기 위한 함수와 클래스를 제공합니다. 예를 들어, 다음은 정육면체를 생성하는 코드입니다.

import torch
from pytorch3d.structures import Meshes
from pytorch3d.utils import ico_sphere

# 정육면체 생성
vertices, faces = ico_sphere(4, device=torch.device('cuda'))
mesh = Meshes(verts=[vertices], faces=[faces])

# 모델 렌더링
from pytorch3d.renderer import (
    PerspectiveCameras,
    RasterizationSettings,
    MeshRenderer
)

num_samples = 256
raster_settings = RasterizationSettings(
    image_size=512,
    blur_radius=0.0,
    faces_per_pixel=1,
)
cameras = PerspectiveCameras(
    fov=60,
    device=torch.device('cuda')
)
renderer = MeshRenderer(
    rasterizer=raster_settings,
    cameras=cameras
)

# 이미지 렌더링
images = renderer(mesh)

3D 모델 변형

PyTorch3D를 사용하면 생성된 3D 모델을 다양한 방식으로 변형할 수 있습니다. 예를 들어, 다음은 모델을 회전시키는 코드입니다.

import torch

# 모델 회전
rotation_angle = torch.tensor([0.0, 45.0, 0.0])
rotation_matrix = torch.tensor(
    [
        [torch.cos(rotation_angle[1]), 0, torch.sin(rotation_angle[1])],
        [0, 1, 0],
        [-torch.sin(rotation_angle[1]), 0, torch.cos(rotation_angle[1])]
    ]
)
rotated_vertices = torch.matmul(vertices, rotation_matrix)
mesh.vertices_list()[0] = rotated_vertices

# 모델 렌더링
images = renderer(mesh)

애니메이션 생성

PyTorch를 사용하여 3D 애니메이션을 생성하는 방법을 살펴보겠습니다. 애니메이션은 프레임 단위로 변형을 적용하여 시간에 따라 모델의 변화를 시뮬레이션합니다.

프레임 기반 변형

애니메이션을 만들기 위해 프레임 기반 변형을 사용할 수 있습니다. 예를 들어, 다음은 회전이 점차 증가하는 애니메이션을 생성하는 코드입니다.

import torch

frame_count = 30
rotation_angles = torch.linspace(0, 360, frame_count)

for frame_idx, angle in enumerate(rotation_angles):
    rotation_matrix = torch.tensor(
        [
            [torch.cos(angle), 0, torch.sin(angle)],
            [0, 1, 0],
            [-torch.sin(angle), 0, torch.cos(angle)]
        ]
    )
    rotated_vertices = torch.matmul(vertices, rotation_matrix)
    mesh.vertices_list()[0] = rotated_vertices

    # 이미지 렌더링
    image = renderer(mesh)

    # 애니메이션 저장
    image.save(f'frame_{frame_idx}.png')

위 코드는 각 프레임마다 모델을 회전시키고 이미지를 렌더링하여 PNG 파일로 저장합니다.

보간 기반 변형

또 다른 방법으로 보간 기반 변형을 사용하여 애니메이션을 생성할 수 있습니다. 예를 들어, 다음은 시작과 끝 모습 사이를 보간하여 애니메이션을 생성하는 코드입니다.

import torch
import torchvision.transforms as transforms

frame_count = 30
start_angle = torch.tensor([0.0, 0.0, 0.0])
end_angle = torch.tensor([90.0, 180.0, 90.0])

for frame_idx in range(frame_count):
    t = frame_idx / frame_count  # 0.0 to 1.0
    angle = (1 - t) * start_angle + t * end_angle
    rotation_matrix = torch.tensor(
        [
            [torch.cos(angle[0]), 0, torch.sin(angle[0])],
            [torch.sin(angle[1]), torch.cos(angle[1]), -torch.sin(angle[1])],
            [-torch.sin(angle[2]), torch.sin(angle[2]), torch.cos(angle[2])]
        ]
    )
    rotated_vertices = torch.matmul(vertices, rotation_matrix)
    mesh.vertices_list()[0] = rotated_vertices

    # 이미지 렌더링
    image = renderer(mesh)

    # 애니메이션 저장
    image.save(f'frame_{frame_idx}.png')

위 코드는 시작과 끝 각도 사이를 선형적으로 보간하여 애니메이션을 생성합니다.

이제 여러분은 PyTorch를 사용하여 3D 모델링 및 애니메이션을 만들 수 있게 되었습니다! PyTorch3D의 다양한 기능과 변형 옵션을 살펴보고 독자적인 작품을 만들어보세요.