こんにちは、MayaviとvtkのPythonバインディングを使用して、テクスチャを3Dメッシュにマップしようとしています。私は.obj波面を可視化しています。このobjは顔の3D写真です。テクスチャ画像は、3つの2D写真の合成である。Vtkは、テクスチャをメッシュにマッピングするときにノード間に不正な色を挿入します。
メッシュ内の各ノードは、その色を定義する画像における(UV)座標を有します。メッシュの異なる領域は、画像の異なるセクションから色を描画します。
を、代わりにメッシュにこれをマッピングされた:これを説明するために私はこの1つで実際のテクスチャ画像を交換しました。
私が午前問題は、鼻の周りに例示されています。赤と緑の境界には、青の輪郭があります。この領域をワイヤフレームモードでより詳細に検査することは、uvマッピングでは問題ではないが、vtkが2つのノード間の色をどのように補間しているかによって決まります。何らかの理由で、1つが赤で1つが緑である2つのノードの間に青の部分を追加しています。本物の質感
を使用して可視化する際
はこれは間の色のための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)
ありがとうDrone。補間をうまく機能している地域に保ちたいので、それをオフにすることは本当にオプションではありません。 3人のアクター/テクスチャマップのアイデアをありがとう。 –
u-vマッピングのテクニックのおかげで、各アクタの入力ポリデータにVTKスレッシュホールドフィルタを使用して、非透過テクセルが存在する三角形だけがレンダリングされるようにすることもできます。これはオーバードローを大幅に減らすでしょう。 – Drone2537
@ Drone2537このような古い質問にバグを残して申し訳ありませんが、まさに私が今やっている問題とまったく同じです。私は補間を無効にしようとしましたが、出力はまったく同じです - これを引き起こす可能性のある他のアイデアはありますか?また、 'vtkPainterPolyDataMapper'を使用すると、この特定のケースで自分自身のフラグメントシェーダーの作成に近づくことができますか?ありがとう! –