VPython xoay xi lanh

Xin chào các bạn,

Tôi đang phát triển một thuật toán để mô phỏng một số lượng lớn hình trụ (Khoảng 900 hình trụ) tương tác với nhau, chỉ sử dụng phép quay và dịch trên trục XY. Chương trình tính toán từng va chạm và cập nhật các góc quay và vị trí của các đối tượng theo thời gian thực
Nhưng hình ảnh động đang chạy rất chậm. Hiện tại, hoạt hình chỉ hoạt động tốt khi tôi giảm số lượng hình trụ xuống 100 hoặc 200, nhưng tôi cần ít nhất 900 đối tượng. Khi tôi sử dụng 300 đối tượng, chương trình gần như bị treo
Tôi đã thử sử dụng điểm thay vì hình trụ, nhưng  điểm không có cùng thuộc tính như hình trụ. Tôi cũng đã thử các hộp, nhưng không thành công, tôi gặp vấn đề tương tự
Các bạn có ý tưởng gì về những gì tôi có thể làm để giải quyết vấn đề này không?

Cảm ơn,

Gabriel Luân

rotate() Một đối tượng B có thể được xoay bằng B. xoay (góc=theta, trục=a, gốc=org). Theo mặc định, trục là B. trục. và gốc tọa độ là B. tư thế

frame Đặt đối tượng này vào một khung xác định, như trong ball = sphere(frame = f1) LƯU Ý. khung chưa có sẵn trong GlowScript

canvas Khi bạn bắt đầu chương trình VPython, để thuận tiện, VPython tạo một canvas và đặt tên cho nó là cảnh. Theo mặc định, các đối tượng bạn tạo sẽ đi vào canvas đó. Bạn có thể chọn đặt một đối tượng trong một canvas khác như thế này

cảnh2 = canvas( title = "Màn IV, Cảnh 2")
thanh = xi lanh ( canvas = cảnh2 )

make_trail Bạn có thể chỉ định rằng một dấu vết được để lại phía sau một đối tượng mũi tên, hình hộp, hình nón, hình trụ, hình elip, hình chóp, hình nhẫn hoặc hình cầu đang di chuyển. Để biết chi tiết, xem Rời khỏi một dấu vết

Đang thực thi myscene = canvas. get_selected() trả về một tham chiếu đến khung vẽ trong đó các đối tượng hiện đang được tạo. Đưa ra một khung vẽ cụ thể có tên là cảnh2, cảnh2. select() làm cho cảnh2 trở thành "bức vẽ được chọn", để các đối tượng sẽ được vẽ vào cảnh2 theo mặc định

Xem Kiểm soát một hoặc nhiều VPython Canvas để biết thêm thông tin về cách tạo và thao tác với các đối tượng hiển thị

Hiện tại tôi có tất cả các Hành tinh và Vành đai quỹ đạo, tuy nhiên, quỹ đạo thực tế là điều tôi đang rất khó khăn

GlowScript 2.7 VPython
from visual import *



# Declaring Celestial Body Objects
Sun     = sphere(pos =     vec(0, 0, 0), radius =   10, color = color.yellow)
Mercury = sphere(pos =    vec(25, 0, 0), radius =    2, color =  color.green)
Venus   = sphere(pos =    vec(40, 0, 0), radius =  2.5, color =    color.red)
Earth   = sphere(pos =    vec(50, 0, 0), radius = 2.65, color =   color.blue)
Mars    = sphere(pos =    vec(70, 0, 0), radius =  2.3, color =    color.red)
Jupiter = sphere(pos =    vec(90, 0, 0), radius =    3, color = color.orange)
Saturn  = sphere(pos =   vec(105, 0, 0), radius =  2.9, color = color.orange)
Uranus  = sphere(pos = vec(117.5, 0, 0), radius =  2.9, color = color.orange)
Neptune = sphere(pos =   vec(135, 0, 0), radius =  2.8, color =   color.blue)
Pluto   = sphere(pos =   vec(165, 0, 0), radius =  1.5, color =  color.white)



# Declaring Orbital Rings of Celestial Body Objects
Mercury.ring = ring(pos = vec(0, 0, 0), axis = vec(0, 1, 0), size = vec(0.1, Mercury.pos.x * 2, Mercury.pos.x * 2))
Venus.ring   = ring(pos = vec(0, 0, 0), axis = vec(0, 1, 0), size = vec(0.1, Venus.pos.x * 2, Venus.pos.x * 2))
Earth.ring   = ring(pos = vec(0, 0, 0), axis = vec(0, 1, 0), size = vec(0.1, Earth.pos.x * 2, Earth.pos.x * 2))
Mars.ring    = ring(pos = vec(0, 0, 0), axis = vec(0, 1, 0), size = vec(0.1, Mars.pos.x * 2, Mars.pos.x * 2))
Jupiter.ring = ring(pos = vec(0, 0, 0), axis = vec(0, 1, 0), size = vec(0.1, Jupiter.pos.x * 2, Jupiter.pos.x * 2))
Saturn.ring  = ring(pos = vec(0, 0, 0), axis = vec(0, 1, 0), size = vec(0.1, Saturn.pos.x * 2, Saturn.pos.x * 2))
Uranus.ring  = ring(pos = vec(0, 0, 0), axis = vec(0, 1, 0), size = vec(0.1, Uranus.pos.x * 2, Uranus.pos.x * 2))
Neptune.ring = ring(pos = vec(0, 0, 0), axis = vec(0, 1, 0), size = vec(0.1, Neptune.pos.x * 2, Neptune.pos.x * 2))
Pluto.ring   = ring(pos = vec(0, 0, 0), axis = vec(0, 1, 0), size = vec(0.1, Pluto.pos.x * 2, Pluto.pos.x * 2))



# Infinite Loop
while 1 == 1:

    Mercury.rotate(angle = radians(360), axis = vec(Mercury.pos.y, Mercury.pos.x, 0), origin = vec(0, 0, 0))
    rate(50)

print("Error! Escaped While Loop!")

Khi tôi tắt phương pháp xoay với Mercury.rotate(angle = 0.0174533, axis = vec(0, Mercury.pos.x, 0), origin = vec(0, 0, 0)), nó sẽ xoay đúng cách. nhưng chỉ trong một phần tư vòng quay. Tôi đã đọc về mọi thứ liên quan đến điều này, nhưng N/A

Sau cuộc cách mạng một phần tư, hành tinh đôi khi quyết định "co giật" dữ dội khi góc là một số lớn hơn. Nó giống như một loại rào cản

Các vật thể hình trụ, mũi tên, hình nón, hình chóp, hình cầu, hình nhẫn, hình hộp và hình elip (nhưng không phải hình cong hoặc hình lồi) có thể quay quanh một gốc tọa độ xác định

sự vật. xoay (góc=pi/4. , trục=trục, gốc=vị trí)

Hàm xoay áp dụng một phép biến đổi cho đối tượng đã chỉ định (hình cầu, hộp, v.v. ). Phép biến đổi là phép quay góc radian, ngược chiều kim đồng hồ quanh đường xác định bởi gốc tọa độ và gốc tọa độ + trục. Theo mặc định, các phép quay quanh vị trí và trục của chính đối tượng

Trục trong VPython là gì?

Thuộc tính axis cung cấp hướng cho chiều dài của hộp và ở đây chiều dài, chiều cao và chiều rộng của hộp được đưa ra .

Thuộc tính nào được sử dụng để thay đổi độ dài hình trụ trong Visual Python?

axis Trục chỉ từ vị trí đến đầu kia của hình trụ, mặc định = vector(1,0,0). Đặt trục tạo chiều dài và kích thước.