안녕하세요, Maya와 vtk의 Python 바인딩을 사용하여 텍스처를 3D 메쉬에 매핑하려고합니다. 나는 .obj 파면을 시각화하고 있습니다. 이 obj는 얼굴의 3D 사진입니다. 텍스처 이미지는 세 개의 2D 사진의 합성물입니다.텍스처를 메쉬에 매핑 할 때 Vtk가 노드 사이에 잘못된 색상을 삽입합니다.
메시의 각 노드는 그 컬러를 정의하는 이미지에서 (UV) 좌표를 갖는다. 메쉬의 다른 영역은 이미지의 다른 섹션에서 색상을 그립니다.
을 대신 메쉬이 매핑 :이를 설명하기 위해 나는이 하나 실제 텍스처 이미지를 대체했다.
오전 데 문제는 코 주위에 예시되어있다. 빨간색과 녹색 경계선에는 파란색의 윤곽선이 있습니다. 와이어 프레임 모드에서이 영역을 면밀히 검사하면 uv 매핑에서 문제가되지 않지만 vtk가 두 노드 사이의 색상을 보간하는 방법과 관련되어 있음을 알 수 있습니다. 웬일인지 그것은 하나의 빨간색과 하나가 녹색 인 두 노드 사이에 파란색 부분을 추가하는 것입니다. 실제 질감
를 사용하여 시각화 할 때
는이 사이의 색상에 대한 하나의 색상이나 다른 이웃 노드를 선택 VTK를 강제 할 수있는 방법이 있나요 심각한 문제를 야기 그들? 나는 "edge-clamping"을 켜는 것을 시도했지만, 이것은 아무 것도 성취하지 못했습니다.
아래 코드는 여기에서 사용하고 있습니다. 여기에서 https://www.dropbox.com/sh/ipel0avsdiokr10/AADmUn1-qmsB3vX7BZObrASPa?dl=0 의 파일에 액세스 할 수 있지만이 파일이 간단한 해결책이되기를 바랍니다.
from numpy import *
from mayavi import mlab
from tvtk.api import tvtk
import os
from vtk.util import numpy_support
def obj2array(f):
"""function for reading a Wavefront obj"""
if type(f)==str:
if os.path.isfile(f)==False:
raise ValueError('obj2array: unable to locate file ' + str(f))
f =open(f)
vertices = list()
connectivity = list()
uv = list()
vt = list()
fcount = 0
for l in f:
line = l.rstrip('\n')
data = line.split()
if len(data)==0:
pass
else:
if data[0] == 'v':
vertices.append(atleast_2d(array([float(item) for item in data[1:4]])))
elif data[0]=='vt':
uv.append(atleast_2d(array([float(item) for item in data[1:3]])))
elif data[0]=='f':
nverts = len(data)-1 # number of vertices comprising each face
if fcount == 0: #on first face establish face format
fcount = fcount + 1
if data[1].find('/')==-1: #Case 1
case = 1
elif data[1].find('//')==True:
case = 4
elif len(data[1].split('/'))==2:
case = 2
elif len(data[1].split('/'))==3:
case = 3
if case == 1:
f = atleast_2d([int(item) for item in data[1:len(data)]])
connectivity.append(f)
if case == 2:
splitdata = [item.split('/') for item in data[1:len(data)]]
f = atleast_2d([int(item[0]) for item in splitdata])
connectivity.append(f)
if case == 3:
splitdata = [item.split('/') for item in data[1:len(data)]]
f = atleast_2d([int(item[0]) for item in splitdata])
connectivity.append(f)
if case == 4:
splitdata = [item.split('//') for item in data[1:len(data)]]
f = atleast_2d([int(item[0]) for item in splitdata])
connectivity.append(f)
vertices = concatenate(vertices, axis = 0)
if len(uv)==0:
uv=None
else:
uv = concatenate(uv, axis = 0)
if len(connectivity) !=0:
try:
conarray = concatenate(connectivity, axis=0)
except ValueError:
if triangulate==True:
conarray=triangulate_mesh(connectivity,vertices)
else:
raise ValueError('obj2array: not all faces triangles?')
if conarray.shape[1]==4:
if triangulate==True:
conarray=triangulate_mesh(connectivity,vertices)
return vertices, conarray,uv
# load texture image
texture_img = tvtk.Texture(interpolate = 1,edge_clamp=1)
texture_img.input = tvtk.BMPReader(file_name='HM_1_repose.bmp').output
#load obj
verts, triangles, uv = obj2array('HM_1_repose.obj')
# make 0-indexed
triangles = triangles-1
surf = mlab.triangular_mesh(verts[:,0],verts[:,1],verts[:,2],triangles)
tc=numpy_support.numpy_to_vtk(uv)
pd = surf.mlab_source.dataset._vtk_obj.GetPointData()
pd.SetTCoords(tc)
surf.actor.actor.mapper.scalar_visibility=False
surf.actor.enable_texture = True
surf.actor.actor.texture = texture_img
mlab.show(stop=True)
감사 드론. 보간이 잘 작동하는 지역에서 보간을 유지하고 싶습니다. 따라서 꺼두는 것은 실제로 선택 사항이 아닙니다. 세 배우/텍스처 맵 아이디어를 가져 주셔서 감사합니다. –
u-v 매핑 기술 덕분에 각 투명체의 입력 polydata에 VTK 임계 값 필터를 사용하여 투명하지 않은 텍셀이있는 삼각형 만 렌더링되도록 할 수도 있습니다. 그러면 오버 드로우가 크게 줄어 듭니다. – Drone2537
@ Drone2537 이런 오래된 질문에 불편을 끼쳐 드려 죄송합니다. 그러나 지금 당장 드리고있는 문제와 정확히 같습니다. 내 보간을 끄는 시도했지만 출력이 정확히 동일합니다 - 어쩌면 당신이 다른 원인이 발생할 수 있습니다? 또한,'vtkPainterPolyDataMapper'를 사용하면이 특별한 경우에 어떻게 내 자신의 조각 쉐이더를 작성할 수 있습니까? 감사! –