2015-01-30 14 views
6

Python'da özel olarak gölgelendirme özelliğine sahip estetik 3D grafikler oluşturmaya çalışıyorum ve şimdiye kadar Mayavi sörfünden Mayavi'den 3D eksenler ve yüzey grafikleriyle her iki Matplotlib'i kullanmayı denedim örnekler web sayfası:Parlak Python 3D yüzey pürüzlülüğü için Phong gölgelendirme

enter image description here

sonuç iyi bakmak ve ben bir "parlak" bir görünüm elde etmek için görünmüyor rağmen Mayavi içinde, aydınlatma makul kontrolü olacaksa görünüyor. Matlab içinde

, bu 'Phong' aydınlatma kullanılarak elde edilebilir:

enter image description here

nedenle

http://www.mathworks.com/matlabcentral/fileexchange/35240-matlab-plot-gallery-change-lighting-to-phong/content/html/Lighting_Phong.html bkz sorum şu: Ben bu Phong tarzı parlak gölgelendirme içinde nasıl elde edebileceğini Python tabanlı 3D arsa?

+0

İki şey akla. Matlab'da, renderleyicileri (matlab yazılım oluşturucusundan OpenGL renderleyicisine) değiştirirseniz, parlaklıktan çok daha düz görünümlü görünmeye başladığını fark ettim. Yani matplotlib OpenGL renderer kullanıyor olabilir. İkincisi, matplotlib'deki kaynak ışığının rengini ve parlaklığını değiştirmenin bir yolu var. Bu, arsanızın "parlaklığını" değiştirmenize izin verebilir. – shaw2thefloor

+0

Teşekkürler. İyi bir öneri - Mayavi/Matplotlib işleyicisini nasıl değiştirebilirim? – NewPythonUsers1

+0

Belki bu yardımcı olacaktır - matplotlib içinde arka uçları değişen: http://stackoverflow.com/questions/3285193/how-to-switch-backends-in-matplotlib-python Phong tarzı aydınlatma piton gerçekten güzel olabilir, ama ben ediyorum üzerinde hiçbir şey bulamadım. '= Aynaya' ile http://blenderartists.org/forum/showthread.php?190352-Simple-Phong-shader-via-PyNodes – mmagnuski

cevap

2

Evet, Mayavi yapabilirsiniz. Mayavi penceresinde, gelişmiş menüyü göstermek için sol üst köşedeki küçük Mayavi simgesine tıklayın. Sahnede yüzeye karşılık gelen yüzeye tıklayın, sonra sağdaki menüdeki "Oyuncu" sekmesine tıklayın, "Özellik" etiketli kutuya ilerleyin ve "Diğer seçenekler" e tıklayın. Gölgeyi "Interpolation" kutusuna phong gölgelendirmesine ayarlayabilirsiniz. @ben belirtildiği gibi

7

, sen Mayavi kullanmak ve daha sonra etkileşimli aydınlatma değiştirebilir. kayıt komut dosyasını butonuna tıklamak iyi bir fikirdir, daha sonra komut satırlarında bu kod satırlarını kullanabilirsiniz (Ben de Mayavi kısmı için böyle yaptım).

Diğer bir seçenek Matplotlib kullanmaktır. shading example dayanarak, ışıklı bir yüzey oluşturmayı başardım.

aşağıdaki kodu bakın.

import numpy as np 
from mayavi import mlab 
import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 
from matplotlib.colors import LightSource 

## Test data: Matlab `peaks()` 
x, y = np.mgrid[-3:3:150j,-3:3:150j] 
z = 3*(1 - x)**2 * np.exp(-x**2 - (y + 1)**2) \ 
    - 10*(x/5 - x**3 - y**5)*np.exp(-x**2 - y**2) \ 
    - 1./3*np.exp(-(x + 1)**2 - y**2) 

## Mayavi 
surf = mlab.surf(x, y, z, colormap='RdYlBu', warp_scale='auto') 
# Change the visualization parameters. 
surf.actor.property.interpolation = 'phong' 
surf.actor.property.specular = 0.1 
surf.actor.property.specular_power = 5 



## Matplotlib 
fig = plt.figure() 
ax = fig.gca(projection='3d') 

# Create light source object. 
ls = LightSource(azdeg=0, altdeg=65) 
# Shade data, creating an rgb array. 
rgb = ls.shade(z, plt.cm.RdYlBu) 
surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, linewidth=0, 
         antialiased=False, facecolors=rgb) 
plt.show() 
mlab.show() 

Bu sonuçlar olarak verir:

  • Mayavi: enter image description here
  • Matplotlib: enter image description here
+0

Mayavi yılında 1.0' ve: tek söz Blender piton API kullanarak bağlamında oldu specular_power = 100' Daha parlak sonuçlar elde ediyorum. Matplotlib ile ilgili sorun şu ki [kesişen nesneleri doğru şekilde çizemiyor] (http: // stackoverflow.com/q/20407936/1143274), çünkü her seferinde bir şey çiziyor. Bu, örn. Yüzeylerde güzel konturlar çizmek imkansızdır (yüzeylerin diğer kısımları tarafından tıkanmadıkça). Ayrıca, alttaki şekilde görünen bu bantlama eserleri daha kaba yüzeyler için daha belirgin hale gelir ve [geçici bir çözüm yoktur] (https://github.com/matplotlib/matplotlib/issues/6027#issuecomment-187807292). –