2011-10-08 46 views
14

Trong công việc ban ngày của tôi là một sinh viên tiến sĩ, tôi làm người mẫu địa chất. Trong thời gian rảnh rỗi của tôi (chủ yếu là cho vui), tôi đang học Python và cố gắng viết một chương trình đơn giản để xem các mô hình địa hình 3D.Đồ họa 3D/4D với Python và wxPython?

geological model http://img710.imageshack.us/img710/6503/sgems.png geo model2 http://img638.imageshack.us/img638/529/1sblockmodel.jpg

Mô hình geocellular chỉ là một mạng lưới 3D mà mỗi tế bào lưới có một số giá trị (như thể hiện trong hình bên phải). Vì vậy, tôi muốn người xem của mình có thể hiển thị một mô hình lưới 3D như hình ảnh ở bên phải. Đồng thời, tôi muốn nó có thể hiển thị các mặt cắt ngang qua mô hình theo các hướng x, y và z (điều này được thể hiện trong hình bên trái).

Tôi cũng muốn các mô hình có thể xoay quanh tất cả ba trục và phóng to và thu nhỏ.

Tôi đã thực hiện một số điều tra sơ bộ (chủ yếu là here) và có vẻ như VisVis và VTK là hai lựa chọn tiềm năng. Tôi đang cố gắng sử dụng wxPython cho giao diện chính và có vẻ như cả hai tùy chọn sẽ làm việc với wxPython như xa như tôi có thể nói.

Câu hỏi:

  1. Tôi có phải không khi tôi nói rằng tôi nghĩ VisVis và VTK sẽ làm việc cho những gì tôi muốn? Là một trong những thích hợp hơn cho người khác?

  2. Lựa chọn nào trong số hai tùy chọn này sẽ dễ triển khai nhất?

  3. Có tùy chọn nào khác mà tôi cũng nên cân nhắc không?

Hãy nhớ rằng tôi mới bắt đầu với Python và rất mới với wxPython.

Trả lời

13

Những gì bạn đang tìm kiếm được gọi là hiển thị voxel, lưới voxel hoặc tương tự. Tôi sẽ nghiêm túc xem xét MayaVi (không bao giờ được sử dụng nó, nhưng tôi giữ cho mắt trên nó), có vẻ như có một cái gì đó rất gần here.

Paraview, được xây dựng trên đỉnh VTK giống như MayaVi, cũng có thể là một lựa chọn tốt.

Tôi nghĩ rằng đi thẳng đến VTK để trực quan là khó khăn, nó quá thấp và có thể sẽ khiến bạn cảm thấy thất vọng. Điều đó nói rằng, bạn sẽ muốn lưu dữ liệu của mình vào dưới dạng bộ dữ liệu VTK để mở trong MayaVi/Paraview; nó không phải là khó khăn, bạn chỉ cần chọn cấu trúc đúng (vtkGrid, vtkUnstructedGrid, ...).

3

Nếu bạn muốn một cách dễ dàng hơn để nhận được vào thế giới VTK/MayaVi (xem câu trả lời tốt eudoxos'), nhìn vào mlab API để nó. Điều này mang lại cho matplotlib giống như convenience để hiển thị khối lượng cơ bản và tôi chưa tìm thấy nhu cầu đào sâu hơn vào nền tảng cơ bản.

+0

URL mlab/liên kết bị hỏng – DevPlayer

10

Trong trường hợp của tôi, tôi đã chọn sử dụng trực tiếp các liên kết VTK cho Python. Thành thật mà nói, tôi thấy đơn giản hơn khi bắt đầu với VTK hơn Mayavi, một phần vì tài liệu hướng dẫn tốt hơn (nhiều ví dụ!).Có vẻ như Mayavi đang thêm một lớp phức tạp khác trên đường đi của tôi để hoàn thành công việc. Nhưng tom10 là đúng. Sau khi bạn bắt đầu, việc sử dụng Mayavi có thể dễ dàng hơn. Ngoài ra, Mayavi cung cấp một thư viện được gọi là TVTK là một phiên bản nhiều hơn của các liên kết VTK nhưng cuối cùng tôi đã chọn VTK đơn giản để giảm thiểu số lượng phụ thuộc. Nhưng bạn nên kiểm tra xem nó ra. Có lẽ nó sẽ chỉ là những gì bạn đang tìm kiếm.

Lúc đầu, tôi thấy rất hữu ích này tutorial. Nó không phải là về Python, nó là về tcl, nhưng dịch các ví dụ là tầm thường và nó giúp bạn hiểu cách thức hoạt động của vtk.

Ngoài ra, để giúp bạn bắt đầu, bạn có thể kiểm tra các ví dụ tại số VTK Wiki. Nếu họ không đủ, bạn luôn có thể kiểm tra C++ examples và dịch chúng sang Python. Bản dịch không khó như tên của các phương thức và thuộc tính giống nhau. Nếu bạn làm như vậy, bạn được khuyến khích thêm các ví dụ tại wiki. Thậm chí còn có nhiều ví dụ hơn trong số source.

Trong khi bạn đang học VTK, bạn sẽ (lại) khám phá ra rằng Ipython thật tuyệt vời! Có toàn bộ không gian tên VTK trong tầm tay của bạn sẽ giúp rất nhiều.

Trong trường hợp bạn cần trợ giúp cụ thể hơn, danh sách gửi thư vtk-users là khá tích cực. Cuối cùng, có books về VTK và some of them là miễn phí! Chúng không phải là về Python.

Tôi chưa thử wxPython và VTK cùng nhau, nhưng đó là vì tôi thích PyQt4 hơn wxPython. AFAIK không có vấn đề gì với sự tích hợp của VTK với một trong hai thư viện. Trong mọi trường hợp, trước khi dành thời gian viết một GUI, hãy xem kỹ ParaView. Nó có thể đã làm những gì bạn muốn, và nếu nó không, nó là python scriptable quá! (Tôi chưa bao giờ kiểm tra nó).

+3

+1: Tôi đồng ý rằng thẳng với VTK dễ dàng hơn. Thật khó nhưng tất cả thử thách với MayaVi và VTK đơn giản là học về VTK, và với MayaVi, đó là một rào cản khác. Sau đó, tôi thấy dễ dàng hơn khi bắt đầu sử dụng MayaVi vì điều này đơn giản hóa một vài điều phức tạp (nhưng không khó để khái niệm hóa). – tom10

7

Cũng như một ví dụ đơn giản của việc sử dụng giao diện mlab Mayavi để làm điều này (Với một số dữ liệu địa chất, thậm chí!):

from mayavi import mlab 
import geoprobe 

vol = geoprobe.volume('Volumes/example.vol') 
data = vol.load() #"data" here is just a 3D numpy array of uint8's 

fig = mlab.figure(bgcolor=(1., 1., 1.), fgcolor=(0., 0., 0.), size=(800,800)) 
grid = mlab.pipeline.scalar_field(data) 

# Have things display in kilometers with no vertical exxageration 
# Each voxel actually represents a 12.5 by 18.5 by 5 meter volume. 
grid.spacing = [vol.dxW/1000, vol.dyW/1000, vol.dz/1000] 

# Now, let's display a few cut planes. These are interactive, and are set up to 
# be dragged around through the volume. If you'd prefer non-interactive cut 
# planes, have a look at mlab.pipeline.scalar_cut_plane instead. 
orientations = ['x', 'x', 'y', 'z'] 
starting_positions = [vol.nx//4, 3*vol.nx//4, vol.ny//2, vol.nz] 
for orientation, start_pos in zip(orientations, starting_positions): 
    plane = mlab.pipeline.image_plane_widget(grid, colormap='gray', 
      plane_orientation='%s_axes' % orientation, slice_index=start_pos) 

    # High values should be black, low values should be white... 
    plane.module_manager.scalar_lut_manager.reverse_lut = True 

mlab.show() 

enter image description here (Các dữ liệu và mã dữ liệu định dạng xử lý (module geoprobe) có sẵn tại đây: http://code.google.com/p/python-geoprobe/)

Trong khi tôi đồng ý rằng việc học VTK tốt hơn trong thời gian dài, bạn có thể bắt đầu và chạy khá nhanh với Mayavi. Lợi thế lớn là không phải nhảy qua các vòng để lấy dữ liệu của bạn sang định dạng VTK. TVTK và Mayavi cho phép bạn trực tiếp sử dụng mảng numpy.

+0

Để tạo tệp VTK, bạn có thể sử dụng PyEVTK https://bitbucket.org/pauloh/pyevtk. Hơn nữa, việc tạo tệp VTK lecagy bằng tay khá đơn giản. – pmav99

+0

Bạn cũng có thể sử dụng các hàm tích hợp sẵn trong mayavi. Tôi chỉ không muốn có một định dạng tệp riêng biệt để trực quan hóa. –

+0

Làm rõ: 'bằng tay' Ý tôi là lập trình. – pmav99