2016-08-25 26 views
1

こんにちは、MayaviとvtkのPythonバインディングを使用して、テクスチャを3Dメッシュにマップしようとしています。私は.obj波面を可視化しています。このobjは顔の3D写真です。テクスチャ画像は、3つの2D写真の合成である。Vtkは、テクスチャをメッシュにマッピングするときにノード間に不正な色を挿入します。

enter image description here

メッシュ内の各ノードは、その色を定義する画像における(UV)座標を有します。メッシュの異なる領域は、画像の異なるセクションから色を描画します。

enter image description here

を、代わりにメッシュにこれをマッピングされた:これを説明するために私はこの1つで実際のテクスチャ画像を交換しました。

enter image description here

私が午前問題は、鼻の周りに例示されています。赤と緑の境界には、青の輪郭があります。この領域をワイヤフレームモードでより詳細に検査することは、uvマッピングでは問題ではないが、vtkが2つのノード間の色をどのように補間しているかによって決まります。何らかの理由で、1つが赤で1つが緑である2つのノードの間に青の部分を追加しています。本物の質感

enter image description here

を使用して可視化する際

enter image description here

これは間の色のための1つのカラーまたは他の隣接ノードを選択するVTKを強制する方法はあり深刻な問題を引き起こしそれら?私は "エッジクランプ"をオンにしようとしましたが、これは何も達成できませんでした。

私が使用しているコードは以下の通りです。ここから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)全ての補間をオフにすることができますが、それはテクスチャのサブ画像間で補間するのと同じ場所で補間をオフにする方法はありません - で少なくともあなた自身のフラグメントシェーダーを書くことなく。これは原油に見えるでしょう。

もう1つの解決策は、俳優の顔の一部ではない各場所に透明テクセルを含む3つのテクスチャ画像を作成することです。次に、同じジオメトリを同じテクスチャ座標でレンダリングするが、毎回異なるイメージをレンダリングする(すなわち、それぞれが同じポリデータであるが異なるテクスチャイメージを有する3つのアクタを有する)。

+0

ありがとうDrone。補間をうまく機能している地域に保ちたいので、それをオフにすることは本当にオプションではありません。 3人のアクター/テクスチャマップのアイデアをありがとう。 –

+0

u-vマッピングのテクニックのおかげで、各アクタの入力ポリデータにVTKスレッシュホールドフィルタを使用して、非透過テクセルが存在する三角形だけがレンダリングされるようにすることもできます。これはオーバードローを大幅に減らすでしょう。 – Drone2537

+0

@ Drone2537このような古い質問にバグを残して申し訳ありませんが、まさに私が今やっている問題とまったく同じです。私は補間を無効にしようとしましたが、出力はまったく同じです - これを引き起こす可能性のある他のアイデアはありますか?また、 'vtkPainterPolyDataMapper'を使用すると、この特定のケースで自分自身のフラグメントシェーダーの作成に近づくことができますか?ありがとう! –

関連する問題