2015-01-30 2 views
6

Я пытаюсь создать эстетически привлекательные 3D-графики в Python с зеркальным оттенением, и до сих пор пробовал использовать как Matplotlib с 3D-осями и поверхностными графиками от Mayavi, например, от Mayavi surf примеры веб-страница:Фонг-затенение для блестящих участков поверхности 3D Python

enter image description here

результаты выглядят хорошо, и в MayaVi там, похоже, разумный контроль освещения, хотя я не могу показаться, чтобы достичь «блестящего» внешнего вида.

В Matlab, это может быть достигнуто с помощью «Фонг» освещение:

enter image description here

см http://www.mathworks.com/matlabcentral/fileexchange/35240-matlab-plot-gallery-change-lighting-to-phong/content/html/Lighting_Phong.html

Поэтому мой вопрос: как я могу достичь этого Фонг стиль блестящие затенения в основанный на Python 3D-сюжет?

+0

Две вещи приходят на ум. В Matlab я заметил, что если вы переключаете рендереры (из рендеринга программного обеспечения matlab в рендеринг OpenGL), он идет от блестящего взгляда на гораздо более плоский вид. Поэтому может быть, что matplotlib использует рендеринг OpenGL. Во-вторых, есть ли способ изменить цвет и яркость источника света в matplotlib. Это может позволить вам изменить «блеск» вашего сюжета. – shaw2thefloor

+0

Спасибо. Хорошее предложение - интересно, как я могу изменить рендеринга Mayavi/Matplotlib, чтобы помочь достичь этого, пожалуйста? – NewPythonUsers1

+0

Возможно, это поможет - смена бэкэндов в matplotlib: http://stackoverflow.com/questions/3285193/how-to-switch-backends-in-matplotlib-python Фон-стиль освещения будет действительно приятным на питоне, но я ничего не мог найти. Единственное упоминание было в контексте использования API-интерфейса Blender: http://blenderartists.org/forum/showthread.php?190352-Simple-Phong-shader-via-PyNodes – mmagnuski

ответ

2

Да, вы можете сделать это в Майяви. В окне Mayavi нажмите маленькую иконку Mayavi в верхнем левом углу, чтобы отобразить расширенное меню. Нажмите на поверхность в сцене, которая соответствует вашей поверхности, затем нажмите на вкладку «Актер» в меню справа, прокрутите вниз до поля с надписью «Свойство» и нажмите «Дополнительные параметры». Вы можете установить оттенок в темное затенение в поле «Интерполяция».

7

Как упоминалось в @ben, вы можете использовать Mayavi, а затем интерактивно менять освещение. Хорошей идеей является щелчок по скрипту записи , тогда вы можете использовать эти строки кода в своих сценариях (вот как я сделал для части Mayavi здесь).

Другой вариант - использовать Matplotlib. Основываясь на shading example, мне удалось создать поверхность с освещением.

См. Приведенный ниже код.

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() 

Это дает как результат:

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

В Mayavi с 'specular = 1.0' и' specular_power = 100' Я получаю более сильные моменты. Проблема с Matplotlib заключается в том, что [он не может правильно рисовать пересекающиеся объекты] (http: // stackoverflow.com/q/20407936/1143274), потому что он рисует одну вещь за раз. Это означает, что, например, невозможно нарисовать приятные контуры на поверхностях (если ни одна из них не будет закрыта другими частями поверхности). Кроме того, те артефакты, которые видны на нижней фигуре, становятся более выраженными для более грубых поверхностей и [нет обходного пути] (https://github.com/matplotlib/matplotlib/issues/6027#issuecomment-187807292). –

 Смежные вопросы

  • Нет связанных вопросов^_^