Knowhow/Vision

Open3d mesh uv coordinate

침닦는수건 2024. 7. 30. 16:00
반응형

 

이전 글 Trimesh to Open3d TriangleMesh 에서 짧게 적어두긴 했는데, open3d는 기존 graphic tool에서 쓰는 uv 좌표계랑 다르게 쓰는 특징이 있다. 

 

OBJ가 들고 있는 UV 값이 있을 때, 이를 trimesh나 meshlab 등 각종 라이브러리나 툴에서 이를 읽을 때와 open3d로 읽을 때 방향이 반대다. 

 

위와 같이 mesh와 uv map이 주어졌다고 보자. 

 

trimesh.load_mesh()로 불러온 mesh와 o3d.io.read_triangle_mesh()로 불러온 mesh 내에 UV 값 자체는 똑같다.

Convention

 

trimesh나 다른 툴들은 그 값을 갖고 texture map을 읽을 때, 위와 같이 좌측 하단에 원점을 두고 UV 값을 읽는다. 

(이게 정석)

Open3d

하지만 open3d만은 위와 같이 좌측 상단에 원점을 두고 UV 값을 읽는다. 추측컨대 vision 좌표계에 초점을 맞추고 정의했기 때문인 것 같다. (이런 부분에서는 기존 convention을 따랐어야 하지 않을까 싶다.)

 

따라서 texture map을 상하 반전 시켜 주거나 v값을 뒤집어 주어야 한다.

 

이런 전처리를 안해주면 texture가 뒤집혀 나온다.

아래와 같이 꼭 처리해주고 써야한다.

import numpy as np
import open3d as o3d

mesh = o3d.io.read_triangle_mesh(MESH_PATH)
uvs = np.asarray(mesh.triangle_uvs)

uvs[:,1] = 1-uvs[:,1] ### essential
mesh.triangle_uvs = o3d.utility.Vector2dVector(uvs)

o3d.visualization.draw_geometries([mesh])

 

파일 저장을 open3d에 맞춰서 하는 일은 없어야 한다. open3d 에서 사용할 때만 뒤집어주면 된다.

반응형