นี่คือโพสต์ที่มีลิงก์ไปยังเอกสารเกี่ยวกับการจำลองประเภทเดียวกัน (ในบริบททางวิศวกรรม / เชิงวิชาการมากกว่าสำหรับเกม): https://gamedev.stackexchange.com/a/10350/6398
ฉันพยายามอย่างน้อยสองวิธีที่แตกต่างกันในการตรวจจับการชน + การตอบสนองสำหรับการจำลอง "wire" แบบนี้ (ตามที่เห็นในเกม Umihara Kawase); อย่างน้อยฉันคิดว่านี่คือสิ่งที่คุณตามมา - ดูเหมือนจะไม่มีคำเฉพาะสำหรับการจำลองแบบนี้ฉันแค่เรียกว่า "ลวด" มากกว่า "เชือก" เพราะดูเหมือนว่าคนส่วนใหญ่ คิดว่า "เชือก" มีความหมายเหมือนกันกับ "ห่วงโซ่ของอนุภาค" และถ้าคุณต้องการพฤติกรรม stick-ish ของเชือกนินจา (เช่นสามารถกดและดึงได้) นี่เป็นเหมือนลวดที่แข็งกว่าเชือก อย่างไรก็ตาม..
คำตอบของ Pekuja นั้นดีคุณสามารถใช้การตรวจจับการชนกันอย่างต่อเนื่องโดยการแก้ปัญหาเมื่อพื้นที่ที่เซ็นชื่อของทั้งสามจุดเป็น 0
(ฉันจำ OTOH ไม่เต็มที่ แต่คุณสามารถเข้าใกล้มันได้ดังนี้: หาเวลา t เมื่อจุด a อยู่ในบรรทัดที่ผ่าน b, c (ฉันคิดว่าฉันทำสิ่งนี้โดยการหาจุดเมื่อ (ab, cb) = 0 เพื่อค้นหาค่าของ t) จากนั้นให้เวลาที่ถูกต้อง 0 <= t <1 ค้นหาตำแหน่งพารามิเตอร์ s ของ a บนเซ็กเมนต์ bc เช่น a = (1-s) b + s c และถ้า a อยู่ระหว่าง b และ c (เช่นถ้า 0 <= s <= 1) เป็นการชนที่ถูกต้อง
AFAICR คุณสามารถเข้าใกล้มันได้เช่นกัน (เช่นแก้หา s แล้วเสียบเข้าไปหา t) แต่มันใช้งานง่ายกว่ามาก (ฉันขอโทษถ้าสิ่งนี้ไม่สมเหตุสมผลฉันไม่มีเวลาขุดบันทึกของฉันและมันก็ไม่กี่ปีที่ผ่านมา!)
ดังนั้นตอนนี้คุณสามารถคำนวณทุกครั้งที่เกิดเหตุการณ์ (เช่นควรใส่หรือลบโหนดเชือก) ประมวลผลเหตุการณ์แรกสุด (แทรกหรือลบโหนด) จากนั้นทำซ้ำ / เรียกคืนจนกว่าจะไม่มีเหตุการณ์เพิ่มเติมระหว่าง t = 0 และ t = 1
หนึ่งคำเตือนเกี่ยวกับวิธีการนี้: หากวัตถุที่เชือกสามารถพันเป็นแบบไดนามิก (โดยเฉพาะอย่างยิ่งถ้าคุณกำลังจำลองพวกเขาและผลกระทบที่มีต่อเชือกและในทางกลับกัน) อาจมีปัญหาหากวัตถุเหล่านั้นตัด / ผ่าน อื่น ๆ - ลวดสามารถพันกัน และมันจะเป็นเรื่องท้าทายอย่างยิ่งที่จะป้องกันไม่ให้การโต้ตอบ / การเคลื่อนไหว (มุมของวัตถุลื่นไถลกัน) ในการจำลองฟิสิกส์แบบ box2d .. การเจาะระหว่างวัตถุจำนวนเล็กน้อยเป็นพฤติกรรมปกติในบริบทนั้น
(อย่างน้อย .. นี่เป็นปัญหากับหนึ่งในการติดตั้ง "wire" ของฉัน)
วิธีการแก้ปัญหาที่แตกต่างกันซึ่งมีเสถียรภาพมากขึ้น แต่พลาดการชนในบางเงื่อนไขคือการใช้การทดสอบแบบคงที่ (เช่นไม่ต้องกังวลเกี่ยวกับการสั่งซื้อตามเวลาเพียงแค่แบ่งการเรียกซ้ำแต่ละส่วนในการชนกัน แข็งแกร่งมากขึ้น - ลวดจะไม่พันกันที่มุมและการเจาะเล็กน้อยจะไม่เป็นไร
ฉันคิดว่าวิธีการของ Pekuja ก็ใช้ได้เช่นกัน แต่ก็มีวิธีอื่นเช่นกัน วิธีการหนึ่งที่ฉันใช้คือการเพิ่มข้อมูลการชนกันของข้อมูล: ในแต่ละจุดยอด v ในโลก (เช่นมุมของรูปร่างที่เชือกสามารถพันได้) เพิ่มจุด u เพื่อสร้างส่วนของเส้นกำกับที่ uv จุด "ข้างในมุม" (เช่นภายในโลก, "หลัง" v; ในการคำนวณคุณสามารถโยนรังสีเข้าจาก v ไปตามปกติและหยุดระยะหนึ่งหลังจาก v หรือก่อนที่รังสีตัดกับขอบโลกและ ออกจากพื้นที่ที่เป็นของแข็งหรือคุณสามารถวาดส่วนต่างๆในโลกด้วยตนเองโดยใช้เครื่องมือแก้ไข / แสดงผลระดับภาพ)
อย่างไรก็ตามตอนนี้คุณมีชุด "corner linesegs" uv; สำหรับแต่ละ uv และแต่ละส่วน ab ในสายตรวจสอบ ab และ uv intersect (เช่น static, บูลีน lineseg-lineseg query intersection); ถ้าเป็นเช่นนั้น recurse (แยก lineseg ab เป็น av และ vb, เช่น insert v), บันทึกทิศทางของเชือกที่งอที่ v. จากนั้นสำหรับคู่ของแต่ละคู่ที่อยู่ติดกัน ab, bc ในสาย, ทดสอบว่าทิศทางโค้งงอที่ b เป็นเช่นเดียวกับเมื่อสร้างข (การทดสอบ "ทิศทางโค้ง" ทั้งหมดนี้เป็นเพียงการทดสอบพื้นที่ที่มีลายเซ็น) ถ้าไม่รวมทั้งสองส่วนเป็น ac (เช่นลบ b)
หรือบางทีฉันอาจรวมแล้วแยกฉันลืม - แต่มันใช้งานได้อย่างน้อยหนึ่งในสองคำสั่งที่เป็นไปได้! :)
เมื่อพิจารณาจากส่วนของเส้นลวดทั้งหมดที่คำนวณสำหรับเฟรมปัจจุบันคุณสามารถจำลองข้อ จำกัด ระยะทางระหว่างจุดปลายสายทั้งสอง (และคุณสามารถเกี่ยวข้องกับจุดตกแต่งภายในได้เช่นจุดเชื่อมต่อระหว่างเส้นลวดและโลก )
อย่างไรก็ตามหวังว่านี่จะเป็นการใช้งาน ... เอกสารในโพสต์ที่ฉันเชื่อมโยงด้วยควรให้แนวคิดบางอย่างแก่คุณ