Tạo một tiểu hành tinh 3D ngẫu nhiên


8

Hãy tưởng tượng bạn đang làm việc trên một bản chuyển thể 3D của trò chơi video cổ điển Asteroid . Nhiệm vụ của bạn là viết một thuật toán có thể tạo ra một tiểu hành tinh 3D ngẫu nhiên.

Đây là một cuộc thi phổ biến, không phải mã golf. Viết mã đẹp và tạo kết quả thú vị. Thêm các tính năng thú vị khác nếu bạn muốn.

Quy tắc:

  • Thuật toán của bạn thực sự phải tạo mô hình, không chỉ tải nó từ nguồn bên ngoài hoặc tương tự.
  • Các kết quả phải là (giả). Chạy thuật toán nhiều lần phải tạo ra kết quả khác nhau.
  • Khả năng thời gian thực là mong muốn, nhưng không cần thiết.
  • Số lượng đa giác thấp hay cao? Hiện thực hay cách điệu? Bạn quyết định...
  • Đầu ra phải là một lưới , trong bộ nhớ hoặc dưới dạng tệp như Wavefront OBJ . Trong cả hai trường hợp, bạn cần phải kết xuất nó theo một cách nào đó.
  • Giải thích thuật toán của bạn, để mọi người có thể học hỏi từ nó.
  • Hiển thị một số hình ảnh về kết quả của bạn.

Câu trả lời:


25

Máy xay sinh tố + Python

Kịch bản Python tích hợp sẵn của Blender là hoàn hảo cho loại điều này.

Hoạt hình GIF của một tiểu hành tinh quay

Mở bảng điều khiển Python và dán vào phần sau:

import bpy
import random

def asteroid():
    bpy.ops.mesh.primitive_ico_sphere_add()
    bpy.ops.object.mode_set(mode='EDIT')
    bpy.ops.mesh.faces_shade_smooth()
    bpy.ops.mesh.select_mode(type='VERT')
    bpy.ops.mesh.select_random()
    bpy.ops.transform.resize(value=(random.uniform(1.1,1.4),random.uniform(1.1,1.4),random.uniform(1.1,1.4)))
    bpy.ops.mesh.select_all(action='SELECT')
    bpy.ops.mesh.subdivide(smoothness=1)
    bpy.ops.mesh.select_random()
    bpy.ops.transform.resize(value=(random.uniform(1.05,1.15),random.uniform(1.05,1.15),random.uniform(1.05,1.15)))
    bpy.ops.mesh.select_all(action='SELECT')
    bpy.ops.mesh.subdivide(smoothness=1)
    bpy.ops.mesh.select_random()
    bpy.ops.transform.resize(value=(random.uniform(0.92,1.05),random.uniform(0.92,1.05),random.uniform(0.92,1.05)))
    bpy.ops.mesh.select_all(action='SELECT')
    bpy.ops.mesh.subdivide(smoothness=1)
    stretch = random.uniform(0.9,1.5)
    bpy.ops.transform.resize(value=(stretch,1,1))
    bpy.ops.transform.rotate(value=(random.uniform(-1.57,1.57)), axis=(random.uniform(-1.57,1.57),random.uniform(-1.57,1.57),random.uniform(-1.57,1.57)))
    bpy.ops.object.mode_set(mode='OBJECT')

asteroid()

Một tiểu hành tinh sau đó sẽ được tạo ở vị trí con trỏ 3D của bạn:

Kết xuất khung hình của mô hình 3D tiểu hành tinh

Muốn một tiểu hành tinh khác? Di chuyển con trỏ 3D sang một nơi khác và sau đó nhập asteroid()lại vào bảng điều khiển Python (hoặc chỉ Enterđể lặp lại dòng cuối cùng được nhập).

Để làm cho nó trông giống như một mảnh đá không gian và ít giống như một đốm nhựa, bạn cần phải áp dụng một vật liệu phù hợp. Các tài liệu thủ tục sau đây hoạt động khá tốt. Tôi đã sử dụng một màu khuếch tán của #635C5B, và #8D887Ftrong kết cấu đá cẩm thạch.

Cài đặt vật liệu đá không gian

Làm thế nào nó hoạt động:

  1. Bắt đầu bằng cách tạo một icosahedron đơn giản ( bpy.ops.mesh.primitive_ico_sphere_add()).
  2. Vào chế độ chỉnh sửa ( bpy.ops.object.mode_set(mode='EDIT')) và áp dụng bóng mượt để các mặt riêng lẻ hòa trộn với nhau ( bpy.ops.mesh.faces_shade_smooth()).
  3. Chọn một tập hợp con ngẫu nhiên của các đỉnh của đối tượng ( bpy.ops.mesh.select_random()).
  4. Chia tỷ lệ chúng ngẫu nhiên theo các hướng X, Y và Z ( bpy.ops.transform.resize()).
  5. Chọn toàn bộ đối tượng ( bpy.ops.mesh.select_all(action='SELECT')) và áp dụng phân chia mịn để thêm các đỉnh mới bằng cách nội suy trơn tru trên đối tượng bị biến dạng ( bpy.ops.mesh.subdivide(smoothness=1)).
  6. (Lặp lại các bước 3 Ném5 một vài lần nữa.)
  7. Kéo dài đối tượng theo hướng X để làm cho nó ít hình cầu hơn ( bpy.ops.transform.resize(value=(stretch,1,1)))
  8. Áp dụng một biến đổi xoay ngẫu nhiên ( bpy.ops.transform.rotate())
  9. Cuối cùng, thoát chế độ chỉnh sửa và để đối tượng được chọn ( bpy.ops.object.mode_set(mode='OBJECT')).

Ví dụ khác:

Tiểu hành tinh 1Tiểu hành tinh 2Tiểu hành tinh 3Tiểu hành tinh 4


2
Thánh Bajeezus! .
kẻ lừa đảo rủ rê
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.