รักษาการหมุนระหว่างวัตถุสองอย่าง


9

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

ป้อนคำอธิบายรูปภาพที่นี่

มีเคล็ดลับใดบ้างที่ฉันจะทำได้เพื่อให้บรรลุเป้าหมาย


ฉันคิดว่าวัตถุทั้งสองจะหมุนรอบแกนกลางของวัตถุอื่น
MichaelHouse

คำตอบ:


3

เท่าที่เกี่ยวข้องกับมุมเพียงแค่รักษามุมของวัตถุที่สองเช่นเดียวกับมุมของแรก สำหรับตำแหน่งเมื่อวัตถุทั้งสองชนกันให้หาระยะทางของวัตถุที่สองจากวัตถุแรกโดยใช้สูตรระยะทาง

distance = math.sqrt((x2 - x1)^2 + (y2 - y1)^2)

วิธีค้นหาตำแหน่งของวัตถุที่สองที่สัมพันธ์กับวัตถุแรก:

x2 = x1 + distance * math.cos(angle)
y2 = y1 + distance * math.sin(angle)

2

นอกจากคำตอบของ @ tesselode แล้วฉันขอแนะนำให้คุณเก็บรายการของสิ่งที่แนบมาสำหรับทุก ๆ วัตถุในเกมของคุณ List<WorldObject> AttachedObjectsสิ่งที่ตามสายของ AttachedObjectsจากนั้นเมื่อคุณต้องการตรวจสอบการชนกันของคุณจะเพิ่มสี่เหลี่ยมสีดำสีแดงหนึ่งของ หลังจากนั้นเป็นเพียงเรื่องของการอัปเดตตำแหน่งเด็กโดยใช้วิธีการของ @ tesselode ทุกครั้งที่คุณอัปเดตตำแหน่งของผู้ปกครอง


2

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

เมื่อวัตถุเข้าด้วยกันคุณควรจำความแตกต่างของมุมระหว่างทั้งสอง (ฉันจะเรียกเธต้านี้) ฉันวาดสิ่งนี้ในรูปที่ 2 พร้อมลูกศรจากรูปแรกที่วาดทับกัน จนกว่าวัตถุจะไม่ได้ซ้อนมุมของวัตถุสีแดงจะถูกกำหนดโดยมุมของ Black และ Theta ดังที่แสดงในรูปที่ 3

// When Latching:
theta = Red.angle - Black.angle;

// When retrieving Red's angle:
Red.angle = Black.angle + theta

มุมต่าง


1

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

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

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

ฉันสามารถให้รายละเอียดเพิ่มเติม (พร้อมรูปภาพและรหัสเทียมอย่างน้อยและอื่น ๆ ) หากคุณสนใจ

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