يؤدي تغيير عتامة الانسيابات إلى أي شيء آخر غير قيمتها الافتراضية (1.0) إلى جلب الخطوط الانسيابية إلى مقدمة المشهد حتى عندما تكون هناك كائنات أخرى يجب أن تحجبها.
على سبيل المثال ، أحيلك إلى مثال حقل المجال المغناطيسي الوارد هنا: http://docs.enthought.com/mayavi/mayavi/auto/example_magnetic_field_lines.html.
تشغيل الكود كما هو يعطي المشهد التالي:
ومع ذلك ، إذا قمنا بتغيير عتامة خطوط الحقول بحيث تختلف عن قيمتها الافتراضية 1.0 (إما عن طريق إضافة field_lines.actor.property.opacity = 0.99
أو عن طريق ضبط التعتيم يدويًا في خط أنابيب Mayavi) نحصل على شيء مثل المشهد التالي:
أصبحت الخطوط الميدانية الآن في مقدمة المشهد ، ولكن يجب أن تظل الخطوط المتساوية غامضة كما في الصورة السابقة.
هل هذه مشكلة يمكن حلها في المستقبل القريب؟ إذا لم يكن الأمر كذلك ، سأكون ممتنًا لعلمي حتى أتمكن من إيجاد طريقة أخرى لحل مشكلتي. شكرا لك
يبدو أن هذا ينطبق على الأشياء الأخرى أيضًا. أنا أستخدم contour3d مع Points3d وقم بتعيين عتامة النقاط على أي شيء بخلاف 1.0 مما يجعل السطح لا يحجبها بعد الآن.
أرى ما أعتقد أنه نفس المشكلة مع كائنين من نقطتين ثلاثي الأبعاد. فيما يلي بعض الأمثلة التي توضح كيف أن مظهر 2 من المجالات التي يتم تجسيدها يعتمد على ترتيب العرض إذا تم ضبط العتامة على .99 ، ولكن ليس إذا تم ضبط العتامة على 1.
mlab.figure()
mlab.points3d(0,0,1,color=(.8,.8,.8),resolution=100,opacity=.99)
mlab.points3d(0,0,0,color=(.8,.8,.8),resolution=100,opacity=.99)
mlab.figure()
mlab.points3d(0,0,0,color=(.8,.8,.8),resolution=100,opacity=.99)
mlab.points3d(0,0,1,color=(.8,.8,.8),resolution=100,opacity=.99)
mlab.figure()
mlab.points3d(0,0,1,color=(.8,.8,.8),resolution=100)
mlab.points3d(0,0,0,color=(.8,.8,.8),resolution=100)
mlab.figure()
mlab.points3d(0,0,0,color=(.8,.8,.8),resolution=100)
mlab.points3d(0,0,1,color=(.8,.8,.8),resolution=100)
لا يبدو أن المشكلة تعتمد على اختيار الأضواء أو light_manager ("vtk" أو "raymond").
أفترض أن أحد الحلول قد يكون أولاً فرز الكائنات ليتم عرضها من خلال عمقها على طول محور داخل الشاشة أو خارجها.
ربما تحتاج إلى ضبط خيار إعدام الوجه الأمامي. جرب هذا:
mlab.figure()
g1 = mlab.points3d(0,0,1,color=(.8,.8,.8),resolution=100,opacity=.99)
g2 = mlab.points3d(0,0,0,color=(.8,.8,.8),resolution=100,opacity=.99)
g1.actor.property.frontface_culling = True
g2.actor.property.frontface_culling = True
شكرًا برابهو - أعتقد أن الواجهة الأمامية قد حسنت المرئيات ، لكن ترتيب العرض كان عاملاً فقط في العلبة شبه الشفافة.
لقد كررت هذه الملاحظة في vtk وحدها (إنها مشكلة ذات مستوى أدنى).
بعد مزيد من القراءة ، أعتقد أن هناك حلًا أو اثنين مضمنين في vtk ، ولكن قد يكون الحل الآخر هو فرز الكائنات قبل التقديم.
إليك بعض الروابط حول vtk التي بدت ذات صلة:
https://www.vtk.org/Wiki/VTK/Examples/Cxx/Visualization/CorrectlyRenderingTranslucentGeometry
https://www.vtk.org/Wiki/VTK/Depth_Peeling
وزوجين من الروابط التي استخدمتها لإعادة إنتاج حالة المجال:
https://lorensen.github.io/VTKExamples/site/Python/GeometricObjects/Sphere/
https://www.vtk.org/Wiki/VTK/Examples/Cxx/Visualization/Opacity
شكرا لإضافتك إلى المناقشة وعلى الروابط المفيدة. لست على دراية كبيرة بـ VTK أو تقشير العمق ، لكن الحل البسيط الذي وجدته كان مناسبًا لمثالي الأصلي والمشروع الذي أعمل عليه هو تضمين هذا:
scene = mlab.gcf().scene
scene.renderer.set(use_depth_peeling=True)
الذي اقتبسته من هذا السؤال عن موضوع مشابه ..
شكرا للمساعدة مات وبرابهو.
لقد جربت deep_peeling ، والذي يعد مفيدًا لحالة الاستخدام الفعلي أكثر مما هو عليه بالنسبة لمثال 2 sphere. ولكن بالمقارنة مع إعادة ترتيب المجالات ، تبدو الحواف أقل ...
f=mlab.figure()
f.scene.renderer.use_depth_peeling=1
g0=mlab.points3d(0,0,1,color=(.8,.8,.8),resolution=100,opacity=.99)
g1=mlab.points3d(0,0,0,color=(.8,.8,.8),resolution=100,opacity=.99)
g0.actor.property.frontface_culling = True
g1.actor.property.frontface_culling = True
بالنسبة إلى الرسم ثلاثي الأبعاد ، لدي قائمة بالنقاط وقائمة بالألوان. لذلك بدلاً من تقشير العمق ، استخدمت هذه الوظيفة لإعادة ترتيب تلك القوائم معًا قبل التخطيط:
def orderTransparentRender(cl,c):
'''Opacity < 1 rendering results in appearance of spheres incorrectly in front of or behind other spheres
One solution is setting f.scene.renderer.use_depth_peeling=1, however this seemed to result in less anti-aliased edges?
This function sorts the cluster list cl and color list c together.
'''
cz=zip(cl,c)
cz=sorted(cz,key=lambda x:-1*x[0][2])
cz=zip(*cz)
return cz[0],cz[1]
وإلا فقد تكون المكالمة التي تم فرزها هي كل ما هو مطلوب. تعلمت ذلك من مستندات Python: https://wiki.python.org/moin/HowTo/Sorting. لقد تعلمت عن بيثون zip
هنا: https://stackoverflow.com/questions/1663807/how-can-i-iterate-through-two-lists-in-parallel
مع إصدارات VTK الأخيرة ، يعمل هذا جيدًا بالنسبة لي:
from mayavi import mlab
f = mlab.figure()
mlab.points3d(0,0,1,color=(.8,.8,.8),resolution=100,opacity=.99)
mlab.points3d(0,0,0,color=(.8,.8,.8),resolution=100,opacity=.99)
f.scene.renderer.use_depth_peeling = True
أيضًا ، هناك f.scene.renderer.maximum_number_of_peels
يمكنك استخدامه. إنها 4 بشكل افتراضي ولكن يمكنك تعيينها على صفر بلا حدود على الرغم من أن هذا سيؤدي إلى إبطاء التقديم. يمكنك العبث بهذا.
هل يمكنني إغلاق هذه القضية؟ أعتقد أن هذا يبدو أنه يحل العديد من المشكلات التي رأيتها من قبل.
شكرا لك. سأكون قادرة على العمل مع هذا. يمكنك إغلاق هذه القضية.
ماثيو ألكوك | باحث دكتوراه
جامعة شيفيلد | مدرسة الرياضيات والإحصاء
www.matthewallcock.co.uk
يوم الأحد ، 26 أغسطس 2018 ، الساعة 21:55 مساءً ، برابو راماشاندران ، [email protected]
كتب:
مع إصدارات VTK الأخيرة ، يعمل هذا جيدًا بالنسبة لي:
من استيراد ملاب مايافي
f = mlab.figure ()
mlab.points3d (0،0،1، color = (. 8، .8، .8)، Resolution = 100، opacity = .99)
mlab.points3d (0،0،0، color = (. 8، .8، .8)، Resolution = 100، opacity = .99)
f.scene.renderer.use_depth_peeling = صحيحأيضًا ، هناك f.scene.renderer.maximum_number_of_peels التي يمكنك القيام بها
يحتمل استخدامها. إنها 4 افتراضيًا ولكن يمكنك ضبطها على صفر مقابل لا
الحد على الرغم من أن هذا سوف يبطئ التقديم. يمكنك العبث بهذا.هل يمكنني إغلاق هذه القضية؟ أعتقد أن هذا يبدو أنه يحل العديد من المشكلات التي لدي
رأينا من قبل.-
أنت تتلقى هذا لأنك قمت بتأليف الموضوع.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/enthought/mayavi/issues/491#issuecomment-416071420 ،
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/AP4RUC8AYAnDAV6-wE88hHw5cPP-x01gks5uUwtGgaJpZM4MT7Rp
.
عظيم شكرا.
التعليق الأكثر فائدة
مع إصدارات VTK الأخيرة ، يعمل هذا جيدًا بالنسبة لي:
أيضًا ، هناك
f.scene.renderer.maximum_number_of_peels
يمكنك استخدامه. إنها 4 بشكل افتراضي ولكن يمكنك تعيينها على صفر بلا حدود على الرغم من أن هذا سيؤدي إلى إبطاء التقديم. يمكنك العبث بهذا.هل يمكنني إغلاق هذه القضية؟ أعتقد أن هذا يبدو أنه يحل العديد من المشكلات التي رأيتها من قبل.