Mayavi: تحريك لون وجه ثلاثي الشكل

تم إنشاؤها على ٢٦ يناير ٢٠١٧  ·  2تعليقات  ·  مصدر: enthought/mayavi

مرحبًا ، لدي شبكة مثلثة بها بيانات تتوافق مع لون الوجه ، والتي يمكنني رسمها باستخدام الحل من # 253 على سبيل المثال

mesh = mlab.triangular_mesh(self.vertices[:,0], self.vertices[:,1], self.vertices[:,2], self.triangles,representation='wireframe',opacity=0)
mesh.mlab_source.dataset.cell_data.scalars = color
mesh.mlab_source.dataset.cell_data.scalars.name = 'Cell data' 
mesh.mlab_source.update() 
mesh2 = mlab.pipeline.set_active_attribute(mesh,cell_scalars='Cell data') 
surf = mlab.pipeline.surface(mesh2)  

ومع ذلك ، لست متأكدًا من كيفية تحريك التغييرات في اللون بعد ذلك. على سبيل المثال،

@mlab.animate(delay=100)
def anim():
    f = mlab.gcf()
    for i in range(0,data.shape[0]):
        mesh.mlab_source.dataset.cell_data.scalars = data[i,:]
        mesh.mlab_source.dataset.cell_data.scalars.name = 'Cell data' 
        mesh.mlab_source.update()
        mesh2 = mlab.pipeline.set_active_attribute(mesh,cell_scalars='Cell data') 
        mlab.pipeline.surface(mesh2) 
        yield
anim()
mlab.show()

يفعل ما أريد ، لكنه يتباطأ بسرعة مع تقدم الرسوم المتحركة وفي النهاية يصبح غير قابل للاستخدام. تؤدي معظم التغييرات التي أحاولها (مثل إزالة أوامر خط الأنابيب) إلى عدم تحديث الصورة على الإطلاق. هل هناك خيار آخر لتحديث ألوان الوجه؟

التعليق الأكثر فائدة

تضمين التغريدة

اقض يومًا أو يومين في محاولة لإصلاح هذا واتبع نفس المثال. شكرا جزيلا لك!

ال 2 كومينتر

لقد قمت بتنظيف الكود كثيرًا عن طريق إنشاء tvtk.PolyData يدويًا. ومع ذلك ، فإن التغيير الكبير الآخر هو أن الوثائق تقترح أن طريقة PolyData.modified() هي ما يجب استخدامه لتحديث الرقم. ومع ذلك ، هذا لا يعمل بالنسبة لي - بدلاً من ذلك ، يجب أن أستخدم طريقة VTKDataSource.update() ، حيث يلف VTKDataSource PolyData وبالتالي يجب العثور عليه من خلال اجتياز الآباء السطحية

لذلك كان كود العمل النهائي

from mayavi import mlab 
from tvtk.api import tvtk

polydata = tvtk.PolyData(points=self.vertices, polys=self.triangles)
polydata.cell_data.scalars = np.ravel(data[:,0].copy())
polydata.cell_data.scalars.name = 'celldata'
mesh = mlab.pipeline.surface(polydata)

@mlab.animate(delay=10)
def anim():
    for i in range(0,data.shape[0]):
        polydata.cell_data.scalars = np.ravel(data[:,i].copy())
        polydata.cell_data.scalars.name = "celldata" 
        # polydata.modified()  # does not work
        mesh.parent.parent.update() # works
        yield

anim()
mlab.show()

تضمين التغريدة

اقض يومًا أو يومين في محاولة لإصلاح هذا واتبع نفس المثال. شكرا جزيلا لك!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات