วิธีการตรวจสอบขับดันที่จะเปิดเพื่อหมุนเรือ?


47

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

http://i.stack.imgur.com/GSBSH.png

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

http://i.stack.imgur.com/ZzNzi.png

น่าเสียดายที่ฉันไม่ได้ไกลขนาดนั้น


7
คุณกำลังมุ่งหน้าไปในทิศทางที่ถูกต้องด้วยเวกเตอร์แรง ลองค้นหาสูตรสำหรับความเร็วของ ANGULAR เนื่องจากคุณพยายามหมุนยานรอบจุดศูนย์กลางมวล
Amplify91

ฉันลืมวิธีการว่าจะทำมัน แต่โดยทั่วไปกองกำลังเพียงแค่ในแต่ละจุดen.wikipedia.org/wiki/Center_of_massและโดยเฉพาะอย่างยิ่งen.wikipedia.org/wiki/Parallel_axis_theorem
CobaltHex

1
ฉันมีความคิดเดียวกัน! เคล็ดลับหนึ่งที่อาจทำให้คุณง่ายขึ้นคือคุณต้องคำนวณการเร่งความเร็วเชิงมุมและเชิงเส้นหนึ่งครั้งสำหรับแต่ละทรัสเตอร์ดังนั้นการคำนวณอาจซับซ้อนตามที่คุณต้องการ
Markus von Broady

@ Amplify91 ความคิดเห็นของคุณช่วยให้ฉันคิดออกใหม่ขอบคุณ!
migimunz

1
@migimunz ฉันค่อนข้างคิดที่จะคำนวณการเร่งความเร็วต่อ thruster ไม่ใช่การกดคีย์ (กลุ่ม thrusters) นอกจากนี้การให้ผู้เล่นมีทางเลือกที่ควรเปิดใช้งาน thrusters ซึ่งการกดคีย์อาจน่าสนใจ (บางคนจะแลกเปลี่ยนการหมุนได้เร็วขึ้นสำหรับการหมุนในสถานที่)
Markus von Broady

คำตอบ:


22

ที่ประสบความสำเร็จ! นี่คือและมันหมุนตามที่ควร: ป้อนคำอธิบายรูปภาพที่นี่

สิ่งที่ฉันทำคือสิ่งต่อไปนี้สำหรับแต่ละทรัสเตอร์ฉันคำนวณขนาดของแรงบิดที่สัมพันธ์กับศูนย์กลางของมวล

private function thrustTorque():Float
{
    // distToCom is the distance vector between the thruster and center of mass
    // fire angle is a unit vector representing the direction of the thruster
    var distAngle = Math.atan2(distToCOM.y, distToCOM.x);
    var fireAngle = Math.atan2(dir.y, dir.x);
    var theta = fireAngle - distAngle;
    var torque = distToCOM.length * Math.sin(theta);
    return torque;
}

สมการของสมการกำลังบิดตามวิกิพีเดียคือT = rF sin(theta)ที่:

  • r คือระยะห่างระหว่างทรัสเตอร์กับ COM
  • F คือขนาดของแรงที่นำไปใช้ (ฉันปล่อยมันออกไปทำท่าว่ามันแค่อันเดียวเพราะฉันสนใจแค่สัญญาณ)
  • theta คือมุมระหว่างเวกเตอร์สองตัว

เมื่อผู้เล่นกดซ้ายฉันจะตรวจสอบสัญลักษณ์ของแรงบิดสำหรับทรัสเตอร์นั้น - ถ้ามันน้อยกว่าศูนย์ฉันจะยิงทรัสเตอร์ มันตรงกันข้ามกับการหมุนตามเข็มนาฬิกา

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

สุดท้ายนี่คือการสาธิตสด


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

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

@ TrevorPowell อย่างแน่นอน เพื่อความเรียบง่าย (และความสนุกเนื่องจากประสิทธิภาพของเรือของคุณจะขึ้นอยู่กับว่าคุณออกแบบมันได้ดีแค่ไหน) ฉันจึงตัดสินใจว่าเครื่องขับดันเปิดหรือปิด ฉันอาจจะรวมถึงเกณฑ์เพื่อให้ผู้ที่ก่อให้เกิดแรงบิดน้อยเกินไป (และดังนั้นการเคลื่อนไหวด้านข้างมากเกินไป) ไม่ได้เปิด แต่แน่นอนว่า "มากเกินไป / น้อย" อาจจะถูกกำหนดโดยการทดลองและข้อผิดพลาด
migimunz

3
สิ่งที่คุณต้องการทำเพื่อหลีกเลี่ยงการคำนวณมุมคือการใช้ผลิตภัณฑ์ดอทฉาก (มาจากคำนิยามของผลิตภัณฑ์ไขว้ของแรงบิด T = r cross F ถ้าคุณใช้เวกเตอร์ 3 มิติที่มี z = 0) คุณใช้เวกเตอร์ (-ry, rx) ซึ่งตั้งฉากกับ r ที่มีขนาดเท่ากันและคุณคำนวณผลคูณดอทของเวกเตอร์นั้นด้วย F ผลลัพธ์คือ T = rx * Fy - ry * Fx จากนั้น abs (T) คือขนาดของแรงบิดและเครื่องหมายของมันบ่งบอกถึงทิศทาง: T> 0 คือทวนเข็มนาฬิกา T <0 คือทวนเข็มนาฬิกา
Joren

1
เหตุผลที่ทำให้การทำงานง่ายต่อการมองเห็นอย่างสังหรณ์ใจ: r dot F = r F cos θ ถ้าคุณหมุนRทวนเข็มนาฬิกา 90 องศาและใช้ผลิตภัณฑ์จุดคุณจะได้รับ R F บาปเพราะθ cos (θ - 90˚) = sin (θ)
Joren

14

การแสดงออก 3D ทั่วไปของแรงบิดเป็นผลิตภัณฑ์ข้ามรางและแรง: T = R ⨯ F ในสองมิติค่าสเกลาร์สำหรับแรงบิดจะเพียงพอและด้วยทิศทางการหมุนมุมฉากเพียงสี่แนวสำหรับขับดันเราสามารถเขียนในรูปแบบตามเข็มนาฬิกา:

  • บังคับในทิศทาง + x: T = F * (-ry)
  • บังคับไปในทิศทาง -x: T = F * (ry)
  • บังคับในทิศทาง + y: T = F * (rx)
  • บังคับไปในทิศทาง -y: T = F * (-rx)

ที่นี่ F คือขนาดของแรงที่สร้างขึ้นโดย thrusters, rx และ ry คือองค์ประกอบ x และ y ของเวกเตอร์จากจุดหมุนไปจนถึงทรัสเตอร์ แรงบิดเชิงบวกมีแนวโน้มที่จะหมุนทวนเข็มนาฬิกา การใช้สูตรทั้งสี่ด้านบนเป็นเรื่องเล็กน้อยที่จะอนุมานเครื่องหมายของแรงบิดที่ทรัสเตอร์แต่ละตัวผลิต

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

ยานอวกาศ

พลังที่เต็มไปด้วยขับดัน B, D และ E จะเพิ่มการหมุนได้สูงสุด แต่จะเร่งเรือไปทางขวาด้วย การปิดระบบ D จะป้องกันสิ่งนี้ หากมีการเร่งความเร็วทางขวา แต่การหมุนตามเข็มนาฬิกาไม่ใช่วิธีที่มีประสิทธิภาพที่สุดคือการเปิดใช้งานทั้ง C และ F ที่สองในสามของพลังงานเต็มพร้อมกับ D

หากสิ่งนี้ไม่ได้อยู่นอกเหนือขอบเขตของสิ่งที่คุณพยายามทำคุณจะต้องเขียนคำตอบสำหรับสมการการเคลื่อนที่ไม่ใช่งานง่าย ๆ อย่างชัดเจน


7

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

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

ประการที่สามถ้าคุณต้องการคำนวณว่า thruster บางอย่างจะมีผลต่อการหมุนอย่างไรคุณทำได้ถูกต้องแม้ว่าคุณจะใช้สูตรที่ไม่มีประสิทธิภาพก็ตาม แรงบิดสามารถคำนวณได้ซึ่งมีขนาดr x F r*F*sin(theta)อย่างไรก็ตามการคำนวณมุมในกรณีนี้เป็นวิธีที่ไม่มีประสิทธิภาพ คุณควรใช้การกำหนดแรงบิดแบบไขว้โดยตรงเนื่องจากจะง่ายกว่ามากเมื่อใช้การแทนแบบที่คุณมี เนื่องจากเวกเตอร์ทั้งหมดของคุณไม่มีองค์ประกอบ z สูตรสำหรับผลิตภัณฑ์ครอสจึงลดความซับซ้อนลงอย่างมาก

เราสามารถอัปเดตโค้ดของคุณได้โดยไม่ต้องเปลี่ยนผลลัพธ์ของการคำนวณของคุณเลย

private function thrustTorque():Float
{
    var torque = distToCOM.x*dir.y-distToCOM.y*dir.x;
    return torque;
}

มันดีกว่ามาก (และเร็วกว่า)

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

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

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

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

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


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

1
คุณสามารถคำนวณแรงบิดได้จากจุดอ้างอิงโดยพลการ จำนวนผลลัพธ์จะเปลี่ยนไป แต่ตราบใดที่คุณหมุนเรือรอบจุดนี้ซึ่งไม่จำเป็นต้องเป็นจุดศูนย์กลางของมวลพฤติกรรมทางกายภาพจะไม่ ในความเป็นจริงหากไม่มีข้อมูลเกี่ยวกับการกระจายมวลศูนย์กลางของมวลนั้นเองและไม่สามารถคำนวณได้
Marcks Thomas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.