ฉันจะสมมติว่าคุณมีการเคลื่อนไหวที่ถูกต้องสำหรับเรือของคุณมิฉะนั้นการวิเคราะห์นี้จะไม่ถือ คุณต้องการบางสิ่งที่แข็งแกร่งกว่าประสิทธิภาพเพื่อแก้ไขปัญหานี้อย่างถูกต้อง
แต่ละทรัสเตอร์จะสร้างเอฟเฟกต์สองอย่างต่อการเคลื่อนไหวของเรือ: แบบเชิงเส้นและเชิงมุม สิ่งเหล่านี้สามารถพิจารณาได้อย่างอิสระ หากทรัสเตอร์สร้างแรงไปf
ในทิศทางdir
หนึ่งและถูกชดเชยจากจุดศูนย์กลางมวลโดยเวกเตอร์r
(ไม่ใช่ศูนย์กลางเรขาคณิตหรือศูนย์กลางของสไปรต์!) ดังนั้นเอฟเฟกต์ต่อองค์ประกอบเชิงเส้นจะเป็น:
t = f * dir // f is a scalar, dir is unit length
ผลกระทบของความเร็วเชิงมุมนั้นเกิดจากแรงบิด:
tau = f * <dir.x, dir.y, 0> CROSS <r.x, r.y, 0> // cross product
t
เป็นเวกเตอร์แรง (เช่นแรงผลักดันเชิงเส้น) tau
เป็นเซนต์คิตส์และเนวิสซึ่งเมื่อหารด้วยโมเมนต์ความเฉื่อยจะทำให้ความเร่งเชิงมุมเพิ่มขึ้น สิ่งสำคัญคือdir
และr
อยู่ในพื้นที่พิกัดเดียวกันนั่นคือทั้งในพิกัดท้องถิ่นหรือทั้งสองในพิกัดโลก
การเร่งความเร็วเชิงเส้นโดยรวมของเรือนั้นได้มาจากผลรวมของt
's สำหรับแต่ละทรัสเตอร์หารด้วยมวลของเรือ ในทำนองเดียวกันการเร่งความเร็วเชิงมุมเป็นเพียงผลรวมของแรงบิดหารด้วยโมเมนต์ความเฉื่อย (ซึ่งเป็นสเกลาร์อื่น) เรือจะไม่หมุนหากแรงบิดทั้งหมดเป็นศูนย์ ในทำนองเดียวกันมันจะไม่เคลื่อนที่ถ้าแรงขับรวมเป็นศูนย์ Recall บิดเป็นสเกลาร์ แต่แรงขับ (ผลรวมของt
) เป็นเวกเตอร์ 2 มิติ
จุดของการแสดงออกนี้ก็คือว่าตอนนี้เราสามารถเขียนปัญหาของเราเป็นโปรแกรมเชิงเส้น พูดแรกที่เราต้องการเรือของเราที่จะเปิดโดยไม่ต้องเคลื่อนย้าย เรามีตัวแปรสำหรับแต่ละ thruster, $ x_1, x_2, ... $, ซึ่งเป็นจำนวนของ thrust ที่ thruster จะให้ ข้อ จำกัด หนึ่งชุดคือ:
0 <= x_i < fmax_i //for each i
ที่fmax
เป็นแรงสูงสุดสำหรับรัสที่ (นี้จะช่วยให้เรามีคนที่แข็งแกร่งหรืออ่อนแอ) ต่อไปเราจะพูดว่าความเท่าเทียมกันทั้งสอง:
0 = Sum_i x_i * dir_i.x
0 = Sum_i x_i * dir_i.y
นี่เป็นการเข้ารหัสข้อ จำกัด ที่เราจะไม่ใช้การเร่งความเร็วเชิงเส้นโดยบอกว่าแรงขับทั้งหมดเป็นศูนย์ (แรงขับคือเวกเตอร์ดังนั้นเราบอกว่าแต่ละส่วนเป็นศูนย์)
ตอนนี้เราต้องการให้เรือของเราเลี้ยว สมมุติว่าเราต้องการให้เร็วที่สุดเท่าที่จะทำได้ดังนั้นเราจึงต้องการ:
max (Sum_i x_i * c_i)
where c_i = <dir_i.x, dir_i.y, 0> CROSS <r_i.x, r_i.y, 0>
การแก้เพื่อความx_i
พึงพอใจในความไม่เท่าเทียมกันและความเสมอภาคด้านบนในขณะที่การเพิ่มผลรวมสูงสุดข้างต้นจะทำให้เราได้แรงขับที่ต้องการ ภาษาโปรแกรมส่วนใหญ่มีไลบรารี่ LP สำหรับพวกเขา เพียงแค่ใส่ปัญหาข้างต้นลงไปและมันจะสร้างคำตอบของคุณ
ปัญหาที่คล้ายกันจะช่วยให้เราเคลื่อนไหวได้โดยไม่ต้องเลี้ยว สมมติว่าเราเขียนปัญหาของเราอีกครั้งในระบบพิกัดที่เราต้องการเคลื่อนไปในทิศทางบวก x ดังนั้นข้อ จำกัด คือ:
0 <= x_i < fmax_i //for each i
max Sum_i x_i * dir_i.x
0 = Sum_i x_i * dir_i.y
0 = (Sum_i x_i * c_i)
where c_i = <dir_i.x, dir_i.y, 0> CROSS <r_i.x, r_i.y, 0> // as before
ด้วยข้อ จำกัด ที่ thrusters สามารถสร้างแรงขับในทิศทางเดียวเท่านั้นจึงจะมีข้อ จำกัด เกี่ยวกับชนิดของการหมุนและความเร็วเชิงเส้นที่คุณจะสามารถบรรลุได้ สิ่งนี้จะแสดงให้เห็นว่าเป็นวิธีการแก้ปัญหา0 = x_1 = x_2 = ... = x_n
ซึ่งหมายความว่าคุณจะไม่เคยไปไหนมาไหน เพื่อลดสิ่งนี้ฉันแนะนำให้เพิ่มคู่ขับดันขนาดเล็กที่อ่อนแอ (พูด 5% หรือ 10%) สำหรับผู้เล่นแต่ละคนวางทรัสเตอร์ที่ 45 องศาทั้งสองด้าน สิ่งนี้จะช่วยให้การแก้ปัญหามีความยืดหยุ่นมากขึ้นเพราะสิ่งเหล่านี้สามารถใช้ในการตอบโต้ผลกระทบทุติยภูมิที่อ่อนแอของเครื่องขับดันหลัก
ในที่สุดอาจถึง 100 thrusters ทางออกของ LP นั้นเร็วพอที่จะทำต่อเฟรม อย่างไรก็ตามเนื่องจากวิธีการแก้ปัญหาไม่ได้ขึ้นอยู่กับสถานที่หรือสถานะปัจจุบันคุณสามารถคำนวณวิธีการแก้ปัญหาสำหรับการรวมอินพุตคอนโทรลเลอร์ที่เหมาะสมแต่ละชุดเมื่อใดก็ตามที่มีการเปลี่ยนแปลงรูปร่าง (รวมถึงการเพิ่มที่ไม่ใช่ขับดัน เพราะเมื่อนั้นเครื่องขับดันจะอยู่ในตำแหน่งที่ต่างกันเมื่อเทียบกับศูนย์กลางของมวล!) นี่คือ 24 ความเป็นไปได้ (เช่น 8 ทิศทางครั้ง {หมุนซ้ายไม่มีการหมุนหมุนขวา})