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

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

5
ความสามัคคี: วิธีการตรวจจับการชนที่เกิดขึ้นกับวัตถุลูกจากสคริปต์แม่?
ฉันเป็นศัตรูด้วยโครงสร้างนี้ ศัตรู ร่างกาย ศีรษะ แขนซ้าย แขนขวา และอื่น ๆ ฉันยังมี collider สำหรับแต่ละส่วนของร่างกาย ในวัตถุ "ศัตรู" ของฉันฉันได้แนบสคริปต์และในสคริปต์นั้นฉันต้องการที่จะสกัดกั้นการชนกันที่เป็นไปได้ (กระสุน) สำหรับร่างกายหัวแขนซ้าย ฯลฯ มีวิธีทำเช่นนี้หรือไม่?

1
ควอดทรีจะเป็นที่นิยมมากกว่าการแปลงพื้นที่เมื่อใด
ฉันกำลังสร้าง platformer 2d พร้อมวัตถุจำนวนมากในเวลาเดียวกัน ตรวจพบการชนของ AABB ทั้งหมด ก่อนอื่นฉันลองควอดทรีเพื่อลดจำนวนวัตถุที่จะตรวจสอบลองใช้การกำหนดค่าที่แตกต่างกันสองสามอย่าง แต่ก็ไม่ได้มีประสิทธิภาพเท่าที่ฉันต้องการ ฉันใช้แฮชเชิงพื้นที่และมันมีประสิทธิภาพมากกว่าจำนวนของวัตถุที่จะตรวจสอบการชนกันของแต่ละครั้งลดลงอย่างเห็นได้ชัด มีกรณีเมื่อทำการตรวจจับการชนกัน 2d โดยใช้ควอดทรีเป็นที่นิยมมากกว่า hashing อวกาศ? จากการทดสอบของฉันดูเหมือนว่าพื้นที่ว่างเปล่ามักจะจบลงด้วยวัตถุน้อยลงที่จะทดสอบการชนกันหรือไม่ ฉันยังไม่ได้ตั้งเวลาให้กับอัลกอริทึม แต่การทำแฮชราคาแพงมากหรือยากที่จะนำไปใช้เมื่อคุณยกตัวอย่างเช่นการเข้ารหัสใน C? เป็นที่น่าสังเกตว่าฉันกำลังเขียนเกมใน javascript ที่ซึ่งคุณมี hashing "ฟรี" นี่คือการเปรียบเทียบฉันมองข้ามบางสิ่งไปหรือเปล่า http://zufallsgenerator.github.io/2014/01/26/visually-comparing-algorithms/

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

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

2
ฉันจะทำให้การโจมตีของผู้ชายที่ดีได้เพียงแค่โจมตีคนเลวและในทางกลับกันได้อย่างไร
เกมของฉันมีคนดีหลายประเภทและผู้ชายเลวหลายประเภท พวกเขาทั้งหมดจะทำการยิงขีปนาวุธใส่กัน แต่ฉันไม่ต้องการให้เกิดความเสียหายจากหลักประกันใด ๆ ที่เกิดขึ้นสำหรับการจัดเรียงอย่างใดอย่างหนึ่ง ดังนั้นคนเลวจึงไม่สามารถตี / ทำลายคนเลวคนอื่นและคนดีไม่ควรที่จะตี / ทำความเสียหายคนดีคนอื่น วิธีที่ฉันคิดว่าการแก้ปัญหานี้คือการทำให้มันเพื่อให้Unitอินสแตนซ์ (นี่คือ javascript, BTW) มีalignmentคุณสมบัติที่สามารถเป็นได้ทั้งหรือgood badและฉันจะปล่อยให้การปะทะเกิดขึ้นถ้า class Attack boolean didAttackCollideWithTarget(target) return attack.source.alignment != target.alignment and collisionDetected(attack.source, target) นี่คือรหัสหลอกแน่นอน แต่ฉันถามคำถามนี้เพราะฉันเข้าใจว่าอาจมีวิธีที่สง่างามกว่านี้ในการออกแบบนอกเหนือจากการเพิ่มคุณสมบัติอื่นให้กับUnitชั้นเรียน ของฉัน

1
ทำไม OnCollisionEnter ของ Unity ถึงไม่ให้ค่ามาตรฐานกับฉันและวิธีที่เชื่อถือได้ที่สุดในการรับมันคืออะไร
Unity's on collision event ให้การชนวัตถุที่ให้ข้อมูลเกี่ยวกับการชนที่เกิดขึ้นกับคุณ (รวมถึงรายการContactPointsพร้อม hit normals) แต่สิ่งที่คุณไม่ได้รับคือพื้นผิวมาตรฐานสำหรับคอลไลเดอร์ที่คุณยิง นี่คือภาพหน้าจอเพื่ออธิบาย เส้นสีแดงจากและสายสีฟ้าจากContactPoint.normalRaycastHit.normal นี่เป็นตัวอย่างของ Unity ที่ซ่อนข้อมูลเพื่อให้ API ที่ง่ายขึ้นหรือไม่ หรือเทคนิคการตรวจจับการชนกันแบบเรียลไทม์มาตรฐาน 3 มิติไม่เพียงรวบรวมข้อมูลนี้หรือไม่ และในส่วนที่สองของคำถามอะไรคือวิธีที่แน่นอนและค่อนข้างมีประสิทธิภาพในการทำให้พื้นผิวเป็นปกติสำหรับการชน ฉันรู้ว่าการฉายรังสีให้ผิวหน้าของคุณเป็นปกติ แต่ดูเหมือนว่าฉันจำเป็นต้องทำ raycast หลายครั้งเพื่อทำสิ่งนี้ให้สำเร็จในทุกสถานการณ์ (อาจจะเป็นจุดติดต่อ / การรวมแบบปกติคิดถึงการชนในการโยนครั้งแรกหรือคุณอาจต้องเฉลี่ย บรรทัดฐานของจุดติดต่อเพื่อให้ได้ผลลัพธ์ที่ดีที่สุด) วิธีการปัจจุบันของฉัน: สำรองข้อมูลCollision.contacts[0].pointตามปกติของมันตี Raycast ตามปกติเมื่อตะกี้สำหรับfloat.MaxValueบนCollision.collider หากล้มเหลวให้ทำซ้ำขั้นตอนที่ 1 และ 2 โดยไม่ใช้วิธีปกติ หากล้มเหลวให้ลองขั้นตอนที่ 1 ถึง 3 ด้วย Collision.contacts[1] ทำซ้ำ 4 จนสำเร็จหรือจนกว่าจะหมดคะแนนการติดต่อ Vector3.zeroให้ขึ้นผลตอบแทน นี่ดูเหมือนจะจับทุกอย่าง แต่สิ่งที่ทำให้ฉันรู้สึกไม่สบายใจและฉันไม่แน่ใจว่าจะทดสอบว่าวิธีนี้ใช้ได้ผลในกรณีที่เพียงพอ มีวิธีที่ดีกว่า? …

2
ตัวอย่าง Microsoft XNA Platformer การตรวจจับ Collsion มีการใช้งานอย่างถูกต้องหรือไม่
ตัวอย่างที่ Microsoft เตรียมไว้ให้ดูเหมือนว่าการตรวจจับการชน (จากสิ่งที่ฉันเห็น) จะมีข้อผิดพลาดเล็กน้อย เมื่อผู้ใช้ชนกับไทล์ Unpassable ความลึกของจุดตัดจะถูกคำนวณ ค่าความลึกที่น้อยกว่า X และ Y ถูกใช้เพื่อกำหนดตำแหน่งของผู้ใช้ดังนั้นจึงไม่เกิดการชนกับไทล์อีกต่อไป แต่ถ้าผู้ใช้เดินทางในแนวทแยงมุมสิ่งนี้จะส่งผลให้ผู้ใช้ไม่ได้จบลงอย่างแม่นยำในจุดที่ตัวละครจะชนกับไทล์ก่อน? ฉันอาจผิด แต่นั่นเป็นเพียงวิธีที่ฉันเห็น private void HandleCollisions() { // Get the player's bounding rectangle and find neighboring tiles. Rectangle bounds = BoundingRectangle; int leftTile = (int)Math.Floor((float)bounds.Left / Tile.Width); int rightTile = (int)Math.Ceiling(((float)bounds.Right / Tile.Width)) - 1; int topTile …

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

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

3
ฉันจะใช้การตรวจจับการชนกันแบบ 2 มิติที่รวดเร็วและแม่นยำได้อย่างไร
ฉันตระหนักดีถึงวิธีการตรวจสอบว่ามีวัตถุสองมิติขึ้นไปชนกันหรือไม่ แต่ฉันสนใจที่จะตัดสินใจว่าจะตรวจสอบการชนกันหรือไม่ ในโครงการก่อนหน้านี้ฉันเพิ่งตรวจสอบวัตถุทุกชิ้นกับวัตถุอื่น ๆ (ฉันรู้ว่าระดับความโง่เขลา O (n ^ 2)) และมันสร้างเกมเพลย์ที่ลื่นไหลน้อยกว่า ฟอรัมต่างๆยกย่องความยิ่งใหญ่ของ Quadtrees, B-Trees และต้นไม้หรือโครงสร้างอื่น ๆ ที่คุณนึกออก โครงสร้างที่มีประสิทธิภาพที่สุดสำหรับการพิจารณาว่าควรตรวจสอบการชนกันคืออะไร?

5
2D การแบ่งพาร์ติชันเป็นทางเลือกสำหรับแฮชเชิงพื้นที่และควอดทรี
ฉันกำลังพยายามใช้อัลกอริทึมการแบ่งพาร์ติชันในเกมของฉัน แต่ทั้งแฮชเชิงพื้นที่และควอดทรีไม่ใช่สิ่งที่ฉันกำลังมองหา ขนาดระดับของฉันไม่ควร จำกัด (เฉพาะ Int32 จำกัด ) ฉันต้องการอัลกอริทึมการแบ่งพาร์ติชันที่ไม่ต้องการ "ความกว้างระดับ" และ "ระดับความสูง" ฉันมีวัตถุทางกายภาพที่เคลื่อนไหวมากมาย ฉันต้องการอัลกอริทึมที่เร็วพอที่จะรองรับวัตถุมากกว่า 500+ ทางเลือกใด ๆ

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

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

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

1
ปัญหาการตรวจจับการชนวงกลม -line
ขณะนี้ฉันกำลังพัฒนาโคลนการฝ่าวงล้อมและฉันได้ตีสิ่งกีดขวางบนถนนในการตรวจจับการชนกันระหว่างลูกบอล (วงกลม) และอิฐ (รูปหลายเหลี่ยมนูน) ทำงานอย่างถูกต้อง ฉันใช้การทดสอบการตรวจจับการชนกันของข้อมูลเส้นวงกลมโดยที่แต่ละบรรทัดแสดงถึงและขอบบนก้อนอิฐรูปหลายเหลี่ยมนูน ส่วนใหญ่แล้วการทดสอบแบบ Circle-Line นั้นทำงานได้อย่างถูกต้องและจุดของการชนนั้นได้รับการแก้ไขอย่างถูกต้อง การตรวจจับการชนกันทำงานอย่างถูกต้อง อย่างไรก็ตามในบางครั้งรหัสตรวจจับการชนของฉันคืนเท็จเนื่องจากการเลือกปฏิบัติเชิงลบเมื่อลูกบอลตัดกับก้อนอิฐ การตรวจหาการชนกันล้มเหลว ฉันตระหนักถึงความไร้ประสิทธิภาพด้วยวิธีนี้และฉันใช้กล่องที่จัดเรียงตามแนวแกนเพื่อลดจำนวนอิฐที่ทดสอบ ความกังวลหลักของฉันคือถ้ามีข้อบกพร่องทางคณิตศาสตร์ในรหัสของฉันด้านล่าง /* * from and to are points at the start and end of the convex polygons edge. * This function is called for every edge in the convex polygon until a * collision is detected. */ …

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