2015-01-30 46 views
6

Tôi đang cố tạo các ô 3D có tính thẩm mỹ trong Python bằng cách tô bóng, và cho đến nay đã thử sử dụng cả Matplotlib với trục 3D và các ô bề mặt từ Mayavi. ví dụ trang web:Tạo bóng phong cách cho các ô bề mặt 3D có bề mặt 3D

enter image description here

các kết quả tìm kiếm tốt, và trong Mayavi có dường như là kiểm soát hợp lý của ánh sáng, mặc dù tôi dường như không thể đạt được một "bóng" xuất hiện.

Trong Matlab, điều này có thể đạt được bằng cách sử dụng 'Phong' ánh sáng:

enter image description here

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

Vì vậy, câu hỏi của tôi là: làm thế nào tôi có thể đạt được điều này Phong kiểu bóng bóng trong một cốt truyện 3D dựa trên Python?

+0

Hai điều mùa xuân trong tâm trí. Trong MATLAB, tôi nhận thấy rằng nếu bạn chuyển đổi kết xuất đồ họa (từ trình kết xuất phần mềm MATLAB sang trình kết xuất OpenGL), nó chuyển sang màu sáng bóng để trông phẳng hơn nhiều. Vì vậy, có thể là matplotlib đang sử dụng trình kết xuất đồ họa OpenGL. Thứ hai, là có một cách để thay đổi màu sắc và độ sáng của nguồn ánh sáng trong matplotlib. Điều này có thể cho phép bạn thay đổi "shininess" của cốt truyện của bạn. – shaw2thefloor

+0

Cảm ơn. Đề nghị tốt - Tôi tự hỏi làm thế nào tôi có thể thay đổi Mayavi/Matplotlib renderer sau đó để giúp đạt được điều này xin vui lòng? – NewPythonUsers1

+0

Có thể điều này sẽ giúp - thay đổi các chương trình phụ trợ trong matplotlib: http://stackoverflow.com/questions/3285193/how-to-switch-backends-in-matplotlib-python Chiếu sáng phong cách sẽ thực sự tốt đẹp trong python, nhưng tôi không thể tìm thấy bất cứ điều gì trên đó. Chỉ đề cập đến trong ngữ cảnh sử dụng API python Blender: http://blenderartists.org/forum/showthread.php?190352-Simple-Phong-shader-via-PyNodes – mmagnuski

Trả lời

2

Có, bạn có thể thực hiện việc này trong Mayavi. Trong cửa sổ Mayavi, nhấp vào biểu tượng Mayavi nhỏ ở góc trên bên trái để hiển thị menu nâng cao. Nhấp vào bề mặt trong cảnh tương ứng với bề mặt của bạn, sau đó nhấp vào tab "Diễn viên" trong menu ở bên phải, cuộn xuống hộp có nhãn "Thuộc tính" và nhấp vào "Tùy chọn khác". Bạn có thể thiết lập độ bóng để tạo bóng phong trong hộp "Nội suy".

7

Như @ben đã đề cập, bạn có thể sử dụng Mayavi và sau đó tương tác thay đổi ánh sáng. Ý tưởng hay là nhấp vào nút ghi bản ghi, sau đó bạn có thể sử dụng các dòng mã đó trong tập lệnh của mình (Đó là cách tôi đã làm cho phần Mayavi ở đây).

Một tùy chọn khác là sử dụng Matplotlib. Dựa trên shading example, tôi đã quản lý để tạo ra một bề mặt có ánh sáng.

Xem mã bên dưới.

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

Điều này cho phép như kết quả:

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

Trong Mayavi, với 'specular = 1.0' và' specular_power = 100' Tôi thấy nổi bật hơn. Sự cố với Matplotlib là [nó không thể vẽ các đối tượng giao nhau đúng cách] (http: // stackoverflow.com/q/20407936/1143274), bởi vì nó vẽ một thứ tại một thời điểm. Điều này có nghĩa là ví dụ: không thể vẽ các đường nét đẹp trên các bề mặt (trừ khi không có đường viền nào bị che khuất bởi các phần khác của bề mặt). Ngoài ra, những hiện vật dải có thể nhìn thấy trong hình dưới cùng trở nên rõ rệt hơn cho các bề mặt gồ ghề hơn và [không có cách giải quyết] (https://github.com/matplotlib/matplotlib/issues/6027#issuecomment-187807292). –

Các vấn đề liên quan