Mayavi: BUG: عتامة تبسيط التفاعل مع الترتيب المرئي لوحدات التصور

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

يؤدي تغيير عتامة الانسيابات إلى أي شيء آخر غير قيمتها الافتراضية (1.0) إلى جلب الخطوط الانسيابية إلى مقدمة المشهد حتى عندما تكون هناك كائنات أخرى يجب أن تحجبها.

على سبيل المثال ، أحيلك إلى مثال حقل المجال المغناطيسي الوارد هنا: http://docs.enthought.com/mayavi/mayavi/auto/example_magnetic_field_lines.html.

تشغيل الكود كما هو يعطي المشهد التالي:
test_bug_1

ومع ذلك ، إذا قمنا بتغيير عتامة خطوط الحقول بحيث تختلف عن قيمتها الافتراضية 1.0 (إما عن طريق إضافة field_lines.actor.property.opacity = 0.99 أو عن طريق ضبط التعتيم يدويًا في خط أنابيب Mayavi) نحصل على شيء مثل المشهد التالي:
test_bug_2
أصبحت الخطوط الميدانية الآن في مقدمة المشهد ، ولكن يجب أن تظل الخطوط المتساوية غامضة كما في الصورة السابقة.

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

مع إصدارات 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 بشكل افتراضي ولكن يمكنك تعيينها على صفر بلا حدود على الرغم من أن هذا سيؤدي إلى إبطاء التقديم. يمكنك العبث بهذا.

هل يمكنني إغلاق هذه القضية؟ أعتقد أن هذا يبدو أنه يحل العديد من المشكلات التي رأيتها من قبل.

ال 10 كومينتر

هل هذه مشكلة يمكن حلها في المستقبل القريب؟ إذا لم يكن الأمر كذلك ، سأكون ممتنًا لعلمي حتى أتمكن من إيجاد طريقة أخرى لحل مشكلتي. شكرا لك

يبدو أن هذا ينطبق على الأشياء الأخرى أيضًا. أنا أستخدم 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)

2

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)

4

mlab.figure()
mlab.points3d(0,0,1,color=(.8,.8,.8),resolution=100)
mlab.points3d(0,0,0,color=(.8,.8,.8),resolution=100)

1

mlab.figure()
mlab.points3d(0,0,0,color=(.8,.8,.8),resolution=100)
mlab.points3d(0,0,1,color=(.8,.8,.8),resolution=100)

3

لا يبدو أن المشكلة تعتمد على اختيار الأضواء أو 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

image

بالنسبة إلى الرسم ثلاثي الأبعاد ، لدي قائمة بالنقاط وقائمة بالألوان. لذلك بدلاً من تقشير العمق ، استخدمت هذه الوظيفة لإعادة ترتيب تلك القوائم معًا قبل التخطيط:

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
.

عظيم شكرا.

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

القضايا ذات الصلة

rambalachandran picture rambalachandran  ·  9تعليقات

igamenovoer picture igamenovoer  ·  7تعليقات

stefanoborini picture stefanoborini  ·  11تعليقات

ktavabi picture ktavabi  ·  15تعليقات

Kekushke picture Kekushke  ·  9تعليقات