คำถามติดแท็ก collision-detection

การตรวจจับการชนกันคือการพิจารณาว่าเอนทิตีสองคนหรือมากกว่านั้นทำการติดต่อกันระหว่างการเล่นเกม

3
การตอบสนองการปะทะกันของเกม 2D: SAT และการเคลื่อนที่ขั้นต่ำตามแกนที่กำหนดหรือไม่
ฉันพยายามนำระบบการชนมาใช้ในเกม 2D ที่ฉันทำ ทฤษฎีแกนการแยก (ตามที่อธิบายโดยบทช่วยสอนการชนของ metanet ) ดูเหมือนจะเป็นวิธีที่มีประสิทธิภาพและมีประสิทธิภาพในการจัดการการตรวจจับการชน แต่ฉันไม่ชอบวิธีการตอบสนองการชนที่พวกเขาใช้ ด้วยการแทนที่แกนอย่างเหลื่อมซ้อนกันอย่างสุ่ม ๆ อัลกอริธึมก็เพิกเฉยตำแหน่งก่อนหน้าของวัตถุที่เคลื่อนที่ซึ่งหมายความว่ามันจะไม่ชนกับวัตถุเคลื่อนที่มากเท่าที่มันเข้ามาแล้วก็เด้งออกมา นี่คือตัวอย่างของสถานการณ์ที่สำคัญ: ตามวิธี SAT อธิบายข้างต้นสี่เหลี่ยมจะโผล่ออกมาจากสามเหลี่ยมตั้งฉากกับด้านตรงข้ามมุมฉากของมัน: อย่างไรก็ตามตามความเป็นจริงสี่เหลี่ยมควรหยุดที่มุมล่างขวาของรูปสามเหลี่ยมซึ่งจะเป็นจุดที่เกิดการชนครั้งแรกถ้ามันเคลื่อนไหวอย่างต่อเนื่องตามเวกเตอร์การกระจัด: ตอนนี้สิ่งนี้อาจไม่สำคัญในระหว่างการเล่นเกม แต่ฉันชอบที่จะรู้ว่ามีวิธีการที่มีประสิทธิภาพ ฉันเก็บสมองของฉันไว้สองสามวันที่ผ่านมาและฉันยังไม่อยากยอมแพ้! (ข้ามโพสต์จาก StackOverflow หวังว่าจะไม่ผิดกฎ!)

5
การตรวจจับการชนเชือก 2D
ฉันต้องการสร้างเชือกที่สามารถชนกับวัตถุอย่างในวิดีโอ youtube ต่อไปนี้: เชือกฟิสิกส์เกม 2 มิติ ฉันคิดว่าคุณใช้การรวม verlet ซึ่งใช้จุดและเชื่อมต่อจุดเหล่านี้กับเส้น ฉันกำลังพยายามหาว่าคุณจะใช้การตรวจจับการชนประเภทใดกับเชือกเพื่อให้ได้ผลในวิดีโอ ฉันคิดว่าคุณจะต้องทำซีดีให้แต่ละจุด ฉันต้องการใช้ box2D ดังนั้นฉันสงสัยว่าแต่ละจุดจะทำงานอย่างมีประสิทธิภาพหรือไม่ คำแนะนำใด ๆ ที่จะได้รับการชื่นชม.

1
การปะทะกันบนต้นไม้รูปสี่เหลี่ยม / ตาราง - นำตรรกะไปปฏิบัติ
ก่อนอื่นฉันเพิ่งเขียนตรรกะเกมของตัวเองในระยะเวลาหนึ่งดังนั้นฉันต้องขออภัยถ้าสิ่งนี้อาจดูตรงไปตรงมา ฉันอ่านเกี่ยวกับต้นไม้สี่ต้นและการตรวจจับการชนกันของกริดเป็นอย่างมาก ฉันเข้าใจตรรกะ - โดยทั่วไปจะไม่ตรวจสอบการชนยกเว้นว่าวัตถุอยู่ใกล้พื้น แต่มันก็ไม่เคยถูกกล่าวถึงว่ามันใช้งานจริงอย่างไร ฉันมีวิธีที่เป็นไปได้สองสามอย่างในหัว แต่ก็ไม่แน่ใจว่าวิธีไหนดีที่สุด การทดสอบการชนทั่วไป - ไม่มีการเพิ่มประสิทธิภาพ for(var i:int = 0; i < objects.length; i++){ //find object A var objectA = objects[i]; for(var j:int = i + 1; j < objects.length; j++){ //find object B var objectB = objects[j]; if(objectA.collidesWith(objectB){ //handle collision logic } } เก็บเพื่อนบ้าน …

2
รวม Colliders ขนาดเล็กจำนวนมากเข้ากับคนที่ใหญ่
ฉันกำลังสร้างเกมโดยใช้แผนที่ย่อยที่ทำจากสี่เหลี่ยมหลายพันตาราง ในขณะนี้แต่ละสแควร์จะมี collider สแควร์สำหรับตรวจสอบการชนกัน อย่างไรก็ตามด้วยบล็อกขนาดเล็กหลายพันบล็อกการตรวจสอบพวกเขาทั้งหมดสำหรับการชนนั้นไม่มีประสิทธิภาพ หากฉันรู้ว่า tilemap จะมีลักษณะเช่นนี้ล่วงหน้าฉันสามารถใช้ colliders ขนาดใหญ่ 3 หรือ 4 ตัวแทนตัวเล็ก ๆ หลายพันตัว: มีอัลกอริธึมมาตรฐานบางประเภทสำหรับการรวมไทล์เล็ก ๆ ที่อยู่ติดกันให้ใหญ่ที่สุด? ถ้ามีใครช่วยอธิบายได้ที่นี่หรือชี้ไปที่วรรณกรรมเกี่ยวกับอัลกอริธึมดังกล่าว อีกทางหนึ่งบางทีการประมวลผลล่วงหน้าตัวสร้างไทล์ด้วยวิธีนี้อาจเป็นวิธีที่ผิด ถ้าเป็นเช่นนั้นสิ่งที่ถูกต้องที่จะจัดการกับประสิทธิภาพของ colliders จำนวนมากคืออะไร?

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

2
การจัดเก็บพิกัดของทุกวัตถุในฝั่งเซิร์ฟเวอร์ใน MMO
ใน MMORPG: เป็นเรื่องปกติหรือเป็นไปได้หรือไม่ที่จะเก็บพิกัดของต้นไม้ทุกต้นพุ่มไม้ ฯลฯ ในฝั่งเซิร์ฟเวอร์เพื่อตรวจจับการชนกันของข้อมูล? ถ้าเป็นเช่นนั้นจะมีวิธีใดในการจัดเก็บพิกัดจำนวนมาก (โครงสร้างข้อมูลและการจัดการปัญหาด้านประสิทธิภาพ) ถ้าไม่การตรวจจับการชนกันประเภทนี้ทำได้โดยสิ้นเชิงในฝั่งไคลเอ็นต์โดยที่เซิร์ฟเวอร์ไม่ได้ทำการตรวจสอบเลยหรือไม่? หรือมีพื้นกลางกับลูกค้าตรวจสอบการชนกันและการตรวจสอบเซิร์ฟเวอร์? ถ้าเป็นเช่นนั้นเซิร์ฟเวอร์จะตรวจสอบวิธีเดียวกันโดยไม่เก็บพิกัดไว้ในเซิร์ฟเวอร์ด้วยหรือไม่

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

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

2
“ ระยะทางไกล” คืออะไรและมีประโยชน์อย่างไรกับการตรวจจับการชน
ฉันกำลังดูวิธีที่มีประสิทธิภาพสำหรับการตรวจจับการชนกันในฉากที่มีวัตถุทั้งแบบคงที่และไดนามิกเมื่อฉันเจอ "ฟิลด์ระยะทาง" ฉันพยายามค้นหาและเข้าใจแนวคิดนี้ แต่ฉันสามารถค้นหาบทความที่เขียนด้วยภาษาที่ซับซ้อนมากเท่านั้น บางคนสามารถอธิบายด้วยคำพูดง่าย ๆ ว่าฟิลด์ระยะทางคืออะไรและสามารถใช้ในการตรวจจับการชนกันของข้อมูลได้อย่างไร

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

3
การตรวจจับการชนกับเส้นโค้ง
ฉันกำลังทำงานในเกม 2D ที่ฉันต้องการตรวจจับการชนกันระหว่างวงกลมที่กำลังเคลื่อนที่และเส้นโค้งคงที่บางประเภท (อาจเป็นเส้นโค้ง Bezier) ปัจจุบันเกมของฉันมีเส้นตรงเป็นรูปทรงเรขาคณิตคงที่เท่านั้นและฉันกำลังทำการตรวจจับการชนกันโดยการคำนวณระยะทางจากวงกลมไปยังเส้นต่างๆและฉายวงกลมออกจากเส้นในกรณีที่ระยะทางน้อยกว่ารัศมีวงกลม ฉันจะทำการตรวจจับการชนกันชนิดนี้ได้อย่างตรงไปตรงมาได้อย่างไร? ฉันรู้เช่นว่า Box2D มีการตรวจจับการชนกับเส้นโค้ง Bezier ฉันไม่ต้องการกลไกตรวจจับการชนกันแบบเต็มรูปแบบเพียงบางสิ่งที่สามารถทำสิ่งที่ฉันได้อธิบายไว้ อัปเดต: ขอบคุณมากสำหรับคำตอบที่ยอดเยี่ยม! ฉันจะต้องอ่านโค้ง Bezier เพื่อทำความเข้าใจวิธีการที่คุณอธิบาย จากนั้นฉันจะกลับไปหาคุณ

2
การตรวจจับการชนกันและการตอบสนองใน Entity System
สนุกยิ่งขึ้นด้วย ES ... ปัจจุบันฉันมีระบบน้อย: Renderer (แอตทริบิวต์ Renderable, แอตทริบิวต์การแปลง) การเคลื่อนไหว (แอตทริบิวต์ที่เคลื่อนย้ายได้, การแปลงแอตทริบิวต์, แอตทริบิวต์ที่แสดงผลได้ [สำหรับกล่องขอบ ฯลฯ ]) อินพุต (แอตทริบิวต์ InputReceiver) เป็นต้น ฉันกำลังเพิ่มการตรวจจับการชน ความคิดแรกของฉันคือการเพิ่มระบบใหม่ที่ดำเนินการชนกัน มันสมเหตุสมผลสำหรับฉันที่จะแยกสิ่งนี้ออกจากMotionระบบเนื่องจากไม่ใช่ทุกสิ่งที่เคลื่อนไหวหรือเป็นภาพเคลื่อนไหวจำเป็นต้องมีส่วนร่วมในการตรวจจับการชนกัน - กล้องหมอก ฯลฯ - แต่ดูเหมือนว่าCollisionและMotionมันพึ่งพาซึ่งกันและกัน เมื่อไหร่ Motionย้ายเอนทิตีการแปลงจะต้องได้รับการตรวจสอบความถูกต้องCollisionและการเคลื่อนไหวจะถูกยกเลิกหรือปรับ (การกระดอนหยุดที่ผนัง ฯลฯ ) อีกทางเลือกหนึ่งคือการสร้างแอตทริบิวต์ Collidable ที่รักษาการอ้างอิงไปยังวัตถุการชน - kd-tree, octree เป็นต้นที่ใช้ร่วมกันระหว่างเอนทิตีที่สามารถชนกัน Motionระบบแล้วจะตรวจสอบสำหรับแอตทริบิวต์นั้นและใช้มันในการตรวจสอบหรือปรับการเคลื่อนไหว จากมุมมองของรหัสนั่นเป็นทางออกที่ยอมรับได้ อย่างไรก็ตามจากมุมมองสถาปัตยกรรมของ ECS ดูเหมือนว่ามันเป็นการผลักตรรกะในMotionระบบที่ไม่สามารถใช้กับเอนทิตีทั้งหมดที่มีMovableแอตทริบิวต์ ฉันยังสามารถจัดเก็บเวคเตอร์แบบเคลื่อนไหวในMovableแอตทริบิวต์และColliderปรับระบบTransformตามต้องการ แต่จะเกี่ยวข้องกับการทำซ้ำการทำงานระหว่างMotionและColliderหรือการโทรกลับจากColliderไปยังMotionด้วยข้อมูลบางอย่างเกี่ยวกับตำแหน่งการชนและข้อมูลพื้นผิวสำหรับการตีกลับ / การสะท้อน ฯลฯ . …

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

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

5
คำถามการออกแบบ / แก้ไข / บันทึกในระดับ 2D [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้นี้ ปิดให้บริการใน5 ปีที่ผ่านมา ฉันคิดเกี่ยวกับการสร้างเกม 2D Sidescroller ง่าย ๆ เช่น SuperMario จากนั้นฉันสงสัยเกี่ยวกับวิธีบันทึกโหลดหรือสร้างระดับสำหรับเกม สิ่งแรกที่ฉันคิดคือการวาด png บล็อกที่เรียบง่ายซึ่งแสดงถึงระดับการสร้างทุกส่วนที่ผู้เล่นสามารถเดินเป็นสีพิเศษ (อาจม่วง) ฉันจะนำเข้าระดับในบล็อกหรือกระเบื้องเพื่อให้ฉันสามารถตรวจสอบการชนกัน ดังนั้นคำถามของฉันคือ: มีวิธีที่ดีกว่านี้? อะไรคือวิธีการที่เป็นมืออาชีพสำหรับสิ่งนี้ ฉันควรทำสิ่งนี้กับ Tiles และตัวแก้ไขแผนที่ตามแบบเรียงต่อกันหรือไม่ (ด้วยเหตุผลบางอย่างที่ฉันไม่ชอบ แต่ฉันคิดว่ามันเป็นวิธีที่ดีที่สุดที่ฉันจะใช้) กับระดับพื้นฐานของไพ่คุณจะตระหนักถึงความลาดชันได้อย่างไรและคุณจะตรวจสอบการชนได้อย่างไร

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