2016-08-25 2 views
1

안녕하세요, Maya와 vtk의 Python 바인딩을 사용하여 텍스처를 3D 메쉬에 매핑하려고합니다. 나는 .obj 파면을 시각화하고 있습니다. 이 obj는 얼굴의 3D 사진입니다. 텍스처 이미지는 세 개의 2D 사진의 합성물입니다.텍스처를 메쉬에 매핑 할 때 Vtk가 노드 사이에 잘못된 색상을 삽입합니다.

enter image description here

메시의 각 노드는 그 컬러를 정의하는 이미지에서 (UV) 좌표를 갖는다. 메쉬의 다른 영역은 이미지의 다른 섹션에서 색상을 그립니다.

enter image description here

을 대신 메쉬이 매핑 :이를 설명하기 위해 나는이 하나 실제 텍스처 이미지를 대체했다.

enter image description here

오전 데 문제는 코 주위에 예시되어있다. 빨간색과 녹색 경계선에는 파란색의 윤곽선이 있습니다. 와이어 프레임 모드에서이 영역을 면밀히 검사하면 uv 매핑에서 문제가되지 않지만 vtk가 두 노드 사이의 색상을 보간하는 방법과 관련되어 있음을 알 수 있습니다. 웬일인지 그것은 하나의 빨간색과 하나가 녹색 인 두 노드 사이에 파란색 부분을 추가하는 것입니다. 실제 질감

enter image description here

를 사용하여 시각화 할 때

enter image description here

이 사이의 색상에 대한 하나의 색상이나 다른 이웃 노드를 선택 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) 

답변

1

당신은 (당신의 예에서 interpolate = 0에 변화 interpolate = 1) 모든 보간을 해제 할 수 있지만,이 텍스처의 서브 이미지를 통해 보간하는 것과 장소에서 보간을 해제하는 방법이 아니다 -에 최소한 자신의 조각 셰이더를 쓰지 않고. 이는 원유처럼 보일 것입니다.

다른 해결책은 액터의 얼굴이 아닌 각 위치에서 투명한 텍셀을 사용하여 3 개의 텍스처 이미지를 만드는 것입니다. 그런 다음 동일한 지오메트리 좌표로 동일한 지오메트리를 렌더링하지만 매번 다른 이미지를 렌더링합니다 (즉, 각각 동일한 polydata지만 다른 텍스처 이미지를 가진 3 개의 액터가 있음).

+0

감사 드론. 보간이 잘 작동하는 지역에서 보간을 유지하고 싶습니다. 따라서 꺼두는 것은 실제로 선택 사항이 아닙니다. 세 배우/텍스처 맵 아이디어를 가져 주셔서 감사합니다. –

+0

u-v 매핑 기술 덕분에 각 투명체의 입력 polydata에 VTK 임계 값 필터를 사용하여 투명하지 않은 텍셀이있는 삼각형 만 렌더링되도록 할 수도 있습니다. 그러면 오버 드로우가 크게 줄어 듭니다. – Drone2537

+0

@ Drone2537 이런 오래된 질문에 불편을 끼쳐 드려 죄송합니다. 그러나 지금 당장 드리고있는 문제와 정확히 같습니다. 내 보간을 끄는 시도했지만 출력이 정확히 동일합니다 - 어쩌면 당신이 다른 원인이 발생할 수 있습니다? 또한,'vtkPainterPolyDataMapper'를 사용하면이 특별한 경우에 어떻게 내 자신의 조각 쉐이더를 작성할 수 있습니까? 감사! –

관련 문제