2015-01-30 3 views
6

나는 파이썬에서 반사 쉐이딩을 사용하여 예술적으로 기쁜 3D 플롯을 만들기 위해 노력하고 있으며 Mayavi 서핑과 같은 Mayavi의 3D 축과 표면 플롯을 사용하여 지금까지 시도해 보았습니다. 예제 웹 페이지 :광택있는 파이썬 3D 표면 플롯을위한 퐁 쉐이핑

enter image description here

결과는 좋은보고, 나는 "반짝"모양을 달성하기 위해 보이지 않을 수 있지만 Mayavi에, 조명의 합리적인 통제가 될 것 같지 않습니다. 매트랩

,이 '퐁'조명 사용에 의해 달성 될 수있다 :

enter image description here

따라서

http://www.mathworks.com/matlabcentral/fileexchange/35240-matlab-plot-gallery-change-lighting-to-phong/content/html/Lighting_Phong.html 참조, 내 질문은 :이 퐁 스타일의 반짝 음영을 달성 할 수있는 방법 파이썬 기반의 3D 플롯?

+0

두 가지가 마음에 봄. matlab에서, 렌더러를 (matlab 소프트웨어 렌더러에서 OpenGL 렌더러로) 전환하면 반짝이는 것에서 훨씬 더 평평하게 보입니다. matplotlib이 OpenGL 렌더러를 사용하고있을 수도 있습니다. 둘째, matplotlib에서 소스 광원의 색상과 밝기를 변경하는 방법이 있습니까? 이것은 당신이 당신의 음모의 "shininess"를 바꿀 수있게 할 것입니다. – shaw2thefloor

+0

감사합니다. 좋은 제안 - Mayavi/Matplotlib 렌더러를 어떻게 바꿀 수 있는지 궁금합니다. – NewPythonUsers1

+0

아마도 matplotlib의 백엔드 변경에 도움이 될 것입니다. http://stackoverflow.com/questions/3285193/how-to-switch-backends-in-matplotlib-python 퐁 스타일의 조명은 파이썬에서는 정말 좋겠지 만 아무 것도 찾을 수 없습니다. 유일한 언급은 블렌더 파이썬 API를 사용하는 맥락에서였습니다 : http://blenderartists.org/forum/showthread.php?190352-Simple-Phong-shader-via-PyNodes – mmagnuski

답변

2

예, Mayavi에서이 작업을 수행 할 수 있습니다. Mayavi 창에서 왼쪽 상단 모서리에있는 작은 Mayavi 아이콘을 클릭하여 고급 메뉴를 표시합니다. 화면에서 표면에 해당하는 표면을 클릭 한 다음 오른쪽 메뉴의 "Actor"탭을 클릭하고 "Property"레이블이 붙은 상자로 스크롤 한 다음 "More options"를 클릭하십시오. "보간"상자에서 음영을 퐁 음영으로 설정할 수 있습니다.

7

언급 한 바와 같이 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)에 더 두드러집니다. –