วิธีการทำ Geometry Wars แรงโน้มถ่วงมีผลดี


11

ฉันไม่ได้พูดเกี่ยวกับตารางพื้นหลังที่นี่ฉันกำลังพูดถึงอนุภาคที่หมุนวนรอบ Gravity Wells! ฉันชอบเอฟเฟกต์มาตลอดและตัดสินใจว่าจะเป็นการทดลองที่สนุกที่จะทำซ้ำฉันรู้ว่า GW ใช้กฎของฮุคไปทั่วทุกที่ แต่ฉันไม่คิดว่าเอฟเฟ็กต์อนุภาคต่อดีทำโดยใช้สปริง ดูเหมือนว่าฟังก์ชั่นระยะทางกำลังสอง

นี่คือวิดีโอสาธิตผล: http://www.youtube.com/watch?v=YgJe0YI18Fg

ฉันสามารถใช้เอฟเฟกต์สปริงหรือแรงโน้มถ่วงกับอนุภาคบางชนิดได้ดีนั่นเป็นเรื่องง่าย แต่ฉันดูเหมือนจะไม่ได้รับผลกระทบที่ดูเหมือนกับผลของ GWs เมื่อฉันดูเอฟเฟกต์ในเกมดูเหมือนว่าอนุภาคจะถูกปล่อยออกมาเป็นจำนวนมากจากหลุมของตัวเองพวกมันจะหมุนวนรอบจุดศูนย์กลางของหลุมและในที่สุดก็ถูกเหวี่ยงออกไปด้านนอกถอยกลับไปยังบ่อน้ำ

ฉันจะทำให้อนุภาคเกลียวออกมาด้านนอกได้อย่างไรเมื่อวางไข่? ฉันจะเก็บชิ้นส่วนของอนุภาคไว้ด้วยกันได้อย่างไรเมื่ออยู่ใกล้กับบ่อน้ำ แต่กระจายตัวออกจากกันเมื่อมันถูกเหวี่ยงออกไปด้านนอก ฉันจะเก็บอนุภาคเหล่านี้ไว้บนบ่อน้ำได้อย่างไร

แก้ไข:
http://www.youtube.com/watch?v=1eEPl8kOXN8 <- วิดีโอ
https://dl.dropbox.com/u/49283213/gw.gif <- GIF ของเส้นทางอนุภาค

ฉันปิดการสุ่มภายใน GW เพื่อทำให้เอฟเฟกต์ของอนุภาคดูได้ง่ายขึ้นนี่คือวิดีโอนาทีที่คุณสามารถเห็นท่อระบายน้ำสีฟ้า - เขียวส่งอนุภาคออกมา อนุภาคสีแดงมาจากการระเบิดที่ปกติจะปรากฏทั่วสถานที่ ข้อสังเกตบางอย่างที่ฉันทำจากวิดีโอ:

  • อนุภาคจะถูกปล่อยออกมาจากศูนย์กลาง (หรือใกล้ศูนย์กลาง) ของท่อระบายน้ำ
  • อนุภาคทั้งหมดถูกบังคับให้เคลื่อนที่เป็นทวนเข็มนาฬิการอบ ๆ ศูนย์กลางดังนั้นการเคลื่อนที่ของวงสัมผัสบางประเภทจะถูกนำไปใช้คุณสามารถเห็นสิ่งนี้ได้ง่ายเมื่ออนุภาคระเบิดสีแดงเข้าใกล้ท่อระบายน้ำ

คำตอบ:


7

จากวิดีโอแสดงให้เห็นว่ามันน่าจะเป็นเรื่องธรรมดาสำหรับฉัน คนส่วนใหญ่คิดว่าแรงโน้มถ่วงทำให้สิ่งต่าง ๆ ลอยลงมา แต่เมื่อมองจากมุมมองไกล ๆ มันทำให้สิ่งต่าง ๆ เคลื่อนที่ด้วยการเคลื่อนที่เป็นวงรีหรือเป็นเกลียวรอบจุดศูนย์กลาง อนุภาคจะถูกเร่งเข้าหาศูนย์กลางเสมอ แต่จะบินไปไกลกว่านั้นจนกระทั่งแรงโน้มถ่วงบังคับให้มันกลับมาซ้ำแล้วซ้ำอีก อนุภาคบางตัวบินไปจนแรงโน้มถ่วงไม่ส่งผลกระทบต่อพวกมันอีกต่อไปแล้วจบลงด้วยการเผาไหม้ก่อนที่จะเปลี่ยนทิศทาง

แต่ละอนุภาคมีความเร็ว X และ Y ซึ่งแต่ละเฟรมจะมีการเพิ่มแรงโน้มถ่วงขึ้นอยู่กับมุมและระยะทางไปยังศูนย์กลาง แรงโน้มถ่วงจะเพิ่มความเร็วเข้าไปในทิศทาง (มุม) ของศูนย์กลางเสมอ

ดังนั้นคุณมีอนุภาค: ตำแหน่ง, ความเร็ว
สำหรับแรงโน้มถ่วงที่ดีคุณมี: ตำแหน่ง, ความแข็งแรง

จากตำแหน่งที่คุณสามารถคำนวณมุมระหว่างอนุภาคและแรงโน้มถ่วงได้ดี ในการคำนวณมุมคุณจำเป็นต้องใช้ delta ระหว่างพิกัดทั้งสอง

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

มุมนี้เป็นมุมของเวกเตอร์ความเร็วที่ต้องเพิ่ม

ปริมาณแรงที่ใช้นั้นขึ้นอยู่กับระยะทาง แน่นอนว่ามันลดลงตามกำลังสองของระยะทาง ดังนั้นหากบางสิ่งอยู่ไกลออกไปสองเท่าจะใช้แรงเพียงหนึ่งในสี่ สำหรับระยะทางเดลต้าก็จำเป็นเช่นกัน

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

ตอนนี้คุณมีแรงและมุมที่คุณต้องใช้:

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

ทางออกของคุณค่อนข้างคล้ายกับของฉัน แต่ใช้ atan, sin, cos, sqrt, ... ดังนั้นมันอาจช้ามาก มันเป็นการดีกว่าที่จะหลีกเลี่ยงส่วน atan / sin / cos ให้ดูโพสต์ของฉันเพื่อดูสิ่งหนึ่ง (อาจไม่ใช่วิธีที่ดีที่สุด) ทำได้เร็วขึ้น
GameAlchemist

มันไม่ได้ปรับให้เหมาะสมดังนั้นจึงเข้าใจได้ดีกว่า
API-Beast

คุณมีสิทธิ์ที่จะทำเช่นนั้น แต่ฉันคิดว่าคำตอบนั้นมีประโยชน์มากขึ้นโดยเฉพาะอย่างยิ่งสำหรับผู้ที่ไม่แข็งแรงในเรื่อง cos / sin หากคุณใส่รหัสหลอก 'เพิ่มประสิทธิภาพ' หลังจากคำอธิบายทางทฤษฎี
GameAlchemist

ฉันรู้ว่ารหัสที่นี่ไม่ได้รับการปรับให้เหมาะสมที่สุด แต่ดูเหมือนว่าคุณสามารถหลีกเลี่ยงการเรียกใช้ sqrt () ในระยะทางได้เนื่องจากคุณสามารถใช้งานได้ทันทีหลังจากนั้นโดยการยกกำลังสอง
Kyle Baran

2

สำหรับฉันแล้วดูเหมือนว่าสิ่งที่ดึงดูดคือเซ็กเมนต์ไม่ใช่จุด ดังนั้นฉันเดาว่าดีดจุดหนึ่งของวงกลมด้วยความเร็วสูงและเวกเตอร์ความเร็วสัมผัสกับวงกลม และอีกจุดหนึ่งก็ถูกโยนทิ้งซึ่งเชื่อมโยงกับจุดแรกเพื่อวาดส่วน ถ้าอย่างนั้นฉันคิดว่ากฎของฟิสิกส์ (นิวตัน) ถูกนำไปใช้กับแรงโน้มถ่วงที่แข็งแกร่งซึ่งจะอธิบายการลดความเร็ว ดังนั้นฉันเดาว่าคุณต้องรวมเวลาให้ได้

ด้วย: C ศูนย์กลางของบ่อน้ำ, R รัศมีของมัน
P1 ประเด็นที่เรามองว่า
K เป็นค่าคงที่ 'ใหญ่' ที่คุณเลือกด้วยการทดลอง (มวลของบ่อน้ำ)
vel0 คือเวกเตอร์ความเร็วเริ่มต้น, แทนเจนต์กับวงกลม
vel0 ต้องสูง (ทำการทดลองด้วย)
pos0 ตำแหน่งเริ่มต้นบนวงกลม ณ เวลา t0
: d ระยะห่างระหว่าง C และ P1
: Vn เวกเตอร์ normed 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   

เริ่มต้น: วิธีที่ง่ายที่สุดในการไปวางไข่จุดใหม่คือการเลือกมุม A จากนั้น:

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

อัปเดต: สำหรับการวนซ้ำแต่ละครั้งคุณต้องคำนวณ:

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.     

ไม่จำเป็นต้องคำนวณความเร็ว
บางทีเกมอาจใช้แรงเสียดทานบางอย่างจากนั้นสมการจะแตกต่างกัน
สังเกตว่าคุณใช้ cos (A) และ sin (A) หลายครั้งดังนั้นควรเก็บไว้

ดังนั้นถ้าคุณวางจุดจำนวนมากเชื่อมโยงสองต่อสองและในเวลาเดียวกันคุณเปลี่ยนมุมเริ่มต้น A เพื่อให้ที่มาเซ็กเมนต์หมุนรอบบ่อน้ำคุณจะเข้าใกล้การแก้ปัญหา

แก้ไข: ฉันคิดว่าคุณควรลองสิ่งนี้โดยไม่เสียดสีก่อนอาจจะโอเค แรงเสียดทานคือแรงซึ่งเป็นสัดส่วนกับความเร็ว แต่กลับทิศทางของเวกเตอร์ ดังนั้นสมการจะกลายเป็น:

    Acc = Gravity force + Friction Force.

พร้อมแรงเสียดทาน = - คงที่ * Vel สิ่งนี้ฉันไม่ทราบวิธีการรวมดังนั้นฉันจะไปทีละขั้นตอนการรวม:

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

จะมีปัญหาเสถียรภาพเชิงตัวเลข แต่เนื่องจากอายุการใช้งานของอนุภาคสั้นจึงไม่น่าเป็นปัญหา


สิ่งที่จะต้องเปลี่ยนเกี่ยวกับสมการภายใต้อิทธิพลของแรงเสียดทาน? ฉันมีวิธีแก้ไขปัญหาสองสามข้อ แต่ฉันสนใจที่จะรับฟังความเห็นของคุณ
Mykel Stone

0

ในที่สุดฉันก็ทำแบบจำลองที่น่าพอใจของพฤติกรรมของอนุภาค

http://www.openprocessing.org/sketch/73624

เอฟเฟกต์ IS เป็นเอฟเฟกต์แรงโน้มถ่วงมาตรฐานพร้อมเกลียวเมื่ออนุภาคอยู่ในช่วงที่กำหนดจะมีการใช้แรงแทนเจนต์ตามปกติ สิ่งนี้ทำให้อนุภาค "โคจร" ในแบบที่ไม่เสถียร อนุภาคในร่างการประมวลผลไม่ได้เผาไหม้ แต่ที่จุดสูงสุดของวงโคจรของพวกเขานี่คือเมื่อพวกเขาจะเผาไหม้และอีกกลุ่มจะได้รับการปล่อยตัว ขอบคุณทุกคนสำหรับความช่วยเหลือของคุณแม้ว่ามันจะไม่ได้ให้ข้อมูลใหม่กับฉัน แต่ก็เป็นที่น่ายินดีอย่างยิ่งที่คุณใช้เวลาและความพยายามในการตอบคำถามของคุณ ขอบคุณอีกครั้ง!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.