Làm thế nào để làm hiệu ứng trọng lực Geometry Wars


11

Tôi không nói về lưới nền ở đây, tôi đang nói về các hạt xoáy xung quanh Gravity Wells! Tôi luôn thích hiệu ứng này và quyết định đây sẽ là một thử nghiệm thú vị để sao chép nó, tôi biết rằng GW sử dụng luật của Hooke ở mọi nơi, nhưng tôi không nghĩ rằng hiệu ứng Hạt to-Well được thực hiện bằng lò xo, nó trông giống như một hàm bình phương khoảng cách.

Đây là video chứng minh hiệu ứng: http://www.youtube.com/watch?v=YgJe0YI18Fg

Tôi có thể thực hiện hiệu ứng lò xo hoặc trọng lực trên một số hạt tốt, điều đó thật dễ dàng. Nhưng tôi dường như không thể có được hiệu ứng trông giống với hiệu ứng GW. Khi tôi xem hiệu ứng trong trò chơi, có vẻ như các hạt được phát ra thành từng chùm từ chính Giếng, chúng xoay tròn ra ngoài quanh giếng, và cuối cùng bị đẩy ra ngoài, rơi trở lại giếng và lặp lại.

Làm thế nào tôi có thể làm cho các hạt xoắn ốc ra bên ngoài khi sinh sản? Làm thế nào tôi có thể giữ các chùm hạt lại với nhau khi ở gần Giếng nhưng lại cách xa nhau khi chúng bay ra ngoài? Làm thế nào tôi có thể giữ các hạt được gắn chặt vào Giếng?

EDIT:
http://www.youtube.com/watch?v=1eEPl8kOXN8 <- Video
https://dl.dropbox.com/u/49283213/gw.gif <- GIF của đường dẫn hạt

Tôi đã vô hiệu hóa tính ngẫu nhiên trong GW để làm cho hiệu ứng hạt dễ nhìn hơn, đây là video một phút mà bạn có thể thấy một cống màu xanh lam gửi ra các hạt. Các hạt màu đỏ là từ các vụ nổ thường xuất hiện ở khắp mọi nơi. Một số quan sát tôi đã thực hiện từ video:

  • Các hạt được phát ra từ trung tâm (hoặc gần trung tâm) của cống
  • Tất cả các hạt đang bị buộc vào một chuyển động theo chiều kim đồng hồ quanh tâm nên một số chuyển động tiếp tuyến đang được áp dụng, bạn có thể dễ dàng thấy điều này khi các hạt nổ đỏ tiến gần đến cống.

Câu trả lời:


7

Từ video cho thấy nó dường như là lực hấp dẫn đơn giản đối với tôi. Hầu hết mọi người nghĩ rằng trọng lực làm cho mọi thứ bay xuống dưới, nhưng nhìn nó từ một góc nhìn xa hơn, nó làm cho mọi thứ bay theo một dạng chuyển động hình elip hoặc xoắn ốc xung quanh trung tâm. Các hạt luôn được gia tốc về phía trung tâm, tuy nhiên bay xa hơn cho đến khi trọng lực buộc nó quay trở lại, lặp đi lặp lại. Một số hạt bay xa đến mức trọng lực không ảnh hưởng đến chúng nữa và cuối cùng bị đốt cháy trước khi đổi hướng.

Mỗi hạt có vận tốc X và Y, theo đó mỗi khung sẽ thêm trọng lực, tùy thuộc vào góc và khoảng cách đến tâm. Trọng lực luôn thêm vận tốc vào hướng (góc) của tâm.

Vì vậy, bạn có cho các hạt: vị trí, vận tốc
Đối với trọng lực tốt bạn có: vị trí, sức mạnh

Từ các vị trí bạn có thể tính toán góc giữa hạt và trọng lực tốt. Để tính góc, bạn sẽ cần các vùng đồng bằng giữa hai tọa độ.

dx = particle.x - gravity.x; dy = particle.y - gravity.y
angle = atan2(dy, dx)

Góc này là góc của vectơ vận tốc cần được thêm vào.

Lượng lực được áp dụng phụ thuộc vào khoảng cách. Chính xác là nó giảm theo bình phương khoảng cách. Vì vậy, nếu một cái gì đó xa gấp đôi, chỉ một phần tư lực được áp dụng. Đối với khoảng cách các đồng bằng cũng được yêu cầu.

distance = sqrt(dx*dx + dy*dy)
force = gravity.strength / distance*distance

Bây giờ bạn có lực và góc bạn chỉ cần áp dụng chúng:

particle.velocity.x += force * sin(angle)
particle.velocity.y += force * cos(angle)

giải pháp của bạn khá giống với tôi, nhưng nó sử dụng atan, sin, cos, sqrt, ... vì vậy nó có thể trở nên rất chậm. tốt hơn hết là tránh phần atan / sin / cos, xem bài đăng của tôi để tìm một phần (có thể không phải là tốt nhất) làm cho nó nhanh hơn.
GameAlchemist

Nó không được tối ưu hóa nên dễ hiểu hơn.
API-Beast

bạn có quyền làm như vậy, nhưng tôi đoán câu trả lời sẽ được sử dụng nhiều hơn, đặc biệt là đối với những người không mạnh về những thứ cos / sin, nếu bạn đặt mã giả 'được tối ưu hóa' sau phần giải thích lý thuyết.
GameAlchemist

Tôi nhận ra mã ở đây không được tối ưu hóa, nhưng có vẻ như bạn có thể tránh cuộc gọi sqrt () trên khoảng cách, vì bạn ngay lập tức sử dụng nó một lát sau bằng cách bình phương nó.
Kyle Baran

2

Dường như với tôi rằng những gì được vẽ là các phân đoạn, không phải điểm. Vì vậy, tôi đoán Giếng phóng ra một điểm của vòng tròn, với tốc độ cao và vectơ tốc độ tiếp tuyến với vòng tròn. Và một điểm khác được ném ngay sau đó, được liên kết với điểm đầu tiên để vẽ một đoạn. Sau đó, tôi nghĩ rằng các định luật vật lý (Newton) được áp dụng với lực hấp dẫn mạnh, điều này giải thích cho việc giảm tốc độ. Vì vậy, tôi đoán bạn phải tích hợp đúng thời gian để làm điều này.

với: C tâm của giếng, R bán kính của nó.
P1 điểm chúng tôi đang xem
K là một hằng số 'lớn' mà bạn chọn với một số thử nghiệm (khối lượng của giếng).
vel0 là vectơ vận tốc ban đầu, tiếp tuyến với đường tròn.
vel0 phải cao (làm thử quá)
pos0 vị trí ban đầu, trên vòng tròn, tại thời điểm t0.
: d khoảng cách giữa C và P1
: Vn vectơ định mức C P1

accx= - Vnx * K * 1 / square(d)   ; accy = - Vny * K * 1/square (d)  
velx = accx*(t-t0) + vel0x   ;   vely = accy(t-t0) + vel0y  
posx= (1/2)*accx*square(t-t0) + vel0x*(t-t0) + pos0x   ;   
posy= (1/2)*accx*square(t-t0) + vel0y*(t-t0) + pos0y   

Ban đầu: Cách dễ nhất để sinh ra một điểm mới là chọn một góc A, sau đó:

  pos0x= Cx +R *cos(A)  ; pos0y = Cy + R*sin(A)  
  vel0x = v0*sin(A)   vel0y =  - v0*cos(A)     v0= float constant.

cập nhật: cho mỗi lần lặp, bạn phải tính toán:

d= square root( square(P1x-Cx)+square(P1y-Cy) )  
Vnx= (P1x-Cx)/d   ;   Vny=(P1y-Cy)/d  
acc (accx,accy) and finally pos (posx, posy)  as described above.     

không cần tính toán tốc độ.
có thể trò chơi sử dụng một số loại ma sát, sau đó phương trình sẽ khác.
Lưu ý rằng bạn sử dụng nhiều lần cos (A) và sin (A), vì vậy hãy lưu trữ chúng.

Vì vậy, nếu bạn sinh ra rất nhiều điểm được liên kết hai với nhau và đồng thời bạn thay đổi góc A ban đầu để nguồn phân khúc xoay quanh giếng, bạn đến khá gần với giải pháp tôi đoán.

Chỉnh sửa: tôi nghĩ bạn nên thử cái này trước mà không có ma sát, nó có thể ổn. ma sát là một lực tỷ lệ thuận với tốc độ, nhưng có hướng vectơ ngược. vì vậy phương trình trở thành:

    Acc = Gravity force + Friction Force.

với Lực ma sát = - không đổi * Vel. Điều này tôi không biết cách tích hợp, vì vậy tôi sẽ tiến hành tích hợp từng bước:

   Vel(t+dt) = vel(t) + acc(t)*dt,   
   pos(t+dt)= pos(t)+ vel(t)*dt.  

SILL có vấn đề ổn định bằng số, nhưng vì thời gian sống của các hạt ngắn, nên đây không phải là vấn đề.


Điều gì sẽ phải thay đổi về phương trình dưới ảnh hưởng của ma sát? Tôi có một vài giải pháp cho vấn đề đó nhưng tôi rất muốn nghe bạn.
Mykel Stone

0

Cuối cùng tôi đã làm điều đó, một bản sao thỏa đáng của hành vi hạt.

http: //www.open Processing.org/sketch/73624

Hiệu ứng IS là hiệu ứng trọng lực tiêu chuẩn với một vòng xoắn, khi các hạt nằm trong một phạm vi nhất định, một lực được tác dụng lên tiếp tuyến bình thường. điều này làm cho các hạt "quỹ đạo" theo một cách khá không ổn định. Các hạt trong bản phác thảo xử lý không bị cháy hết, nhưng ở đỉnh của quỹ đạo của chúng, đây là lúc chúng bị cháy và một bó khác sẽ được giải phóng. Cảm ơn tất cả sự giúp đỡ của bạn, ngay cả khi nó không thực sự cung cấp cho tôi bất kỳ thông tin mới nào, chúng tôi đánh giá cao rằng bạn đã dành thời gian và công sức bạn đã làm cho câu trả lời của mình. Cảm ơn một lần nữa!

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.