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

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

4
ฉันจะตรวจสอบได้อย่างมีประสิทธิภาพว่าจุดอยู่ภายในสี่เหลี่ยมหมุนอย่างไร
ส่วนหนึ่งเพื่อประโยชน์ในการเพิ่มประสิทธิภาพส่วนหนึ่งเพื่อจุดประสงค์ในการเรียนรู้ฉันจะกล้าถาม: ฉันจะตรวจสอบได้อย่างมีประสิทธิภาพมากที่สุดว่าจุด 2D นั้นPอยู่ในสี่เหลี่ยมหมุนรอบสองมิติXYZWโดยใช้ C # หรือ C ++ อย่างไร ขณะนี้สิ่งที่ฉันกำลังทำคือการใช้อัลกอริทึม "จุดเป็นรูปสามเหลี่ยม" ที่พบในหนังสือการตรวจหาการชนกันแบบเรียลไทม์และเรียกใช้สองครั้ง (สำหรับสามเหลี่ยมสองรูปที่ประกอบเป็นสี่เหลี่ยมพูด XYZ และ XZW): bool PointInTriangle(Vector2 A, Vector2 B, Vector2 C, Vector2 P) { // Compute vectors Vector2 v0 = C - A; Vector2 v1 = B - A; Vector2 v2 = P - A; // Compute …

2
การคาดการณ์แบ่งการตรวจจับการชนกัน
ก่อนที่จะใช้การคาดการณ์กับการเคลื่อนไหวของสไปรต์การชนของฉันทำงานได้อย่างสมบูรณ์ อย่างไรก็ตามหลังจากที่ใช้การคาดการณ์กับการเคลื่อนไหวของสไปรต์ของฉัน (เพื่อทำให้สิ่งต่าง ๆ เรียบ) การชนจะไม่ทำงานอีกต่อไป นี่คือสิ่งที่ทำงานก่อนการคาดการณ์: อย่างไรก็ตามหลังจากที่ฉันใช้การคาดการณ์ของฉันแล้ว ฉันถือว่านี่เป็นเพราะมันทำหน้าที่ประสานงานใหม่ที่ได้รับการผลิตโดยขั้นตอนการอนุมาน (ซึ่งตั้งอยู่ในการเรียกของฉัน) หลังจากที่ฉันใช้การคาดการณ์ของฉัน วิธีแก้ไขพฤติกรรมนี้ ฉันลองใส่การตรวจสอบการชนกันเพิ่มเติมหลังจากการคาดการณ์ - นี่ดูเหมือนจะเคลียร์ปัญหาจำนวนมาก แต่ฉันได้ตัดออกเพราะการวางตรรกะในการแสดงผลของฉันไม่เป็นไปตามคำถาม ฉันได้ลองทำสำเนาตำแหน่ง spriteX โดยคาดการณ์และวาดภาพโดยใช้สิ่งนั้นแทนที่จะเป็นแบบดั้งเดิมดังนั้นการปล่อยให้แบบดั้งเดิมยังคงอยู่เพื่อตรรกะในการรับ - นี่ดูเหมือนจะเป็นตัวเลือกที่ดีกว่า แต่ก็ยังสร้างผลแปลก ๆ เมื่อชนกับผนัง ฉันค่อนข้างแน่ใจว่านี่ไม่ใช่วิธีที่ถูกต้องในการจัดการกับเรื่องนี้ ฉันพบคำถามที่คล้ายกันสองสามข้อที่นี่ แต่คำตอบไม่ได้ช่วยฉัน นี่คือรหัสการคาดการณ์ของฉัน: public void onDrawFrame(GL10 gl) { //Set/Re-set loop back to 0 to start counting again loops=0; while(System.currentTimeMillis() > nextGameTick && loops < maxFrameskip){ …

2
บล็อกล้มและรูปร่างที่ซับซ้อน
ขณะนี้ฉันมีเกมเหมือน Tetris ที่เรียบง่ายและพบปัญหาที่ฉันไม่สามารถแก้ไขได้ ซึ่งแตกต่างจาก Tetris ที่มีรูปทรงล้มเดียวฉันมีรูปทรงหลายรูปที่เชื่อมต่อกันที่อาจต้องตก ฉันต้องคำนวณตำแหน่งสุดท้ายของพวกเขา พิจารณาสิ่งต่อไปนี้: ในการคำนวณตำแหน่งสุดท้ายของรูปร่างสีเขียวฉันเพียงแค่สแกนหาทุก ๆ ตารางจนกว่าฉันจะไปถึงอีกสี่เหลี่ยมจัตุรัสหรือขอบของกระดาน เสร็จสิ้น สำหรับรูปร่างที่เรียบง่ายหลาย ๆ แบบฉันกำลังไต่ขึ้นบอร์ด ดังนั้นสีแดงจึงไม่จำเป็นต้องเคลื่อนไหวสีส้มจะลดลงทีละหนึ่งสีเขียวลดลงสาม เสร็จสิ้น ฉันไม่รู้วิธีรักษารูปร่างสีเขียวและสีแดงที่เชื่อมต่อกัน การใช้ตรรกะของ # 2 เราจะท้าย "ติด" ลอยกลางอากาศ หากฉันสแกนหารูปร่างสีเขียวฉันจะพบกับสีแดงและไม่เคลื่อนไหวและในทางกลับกันสำหรับสีแดง วิธีแก้ปัญหาอาจใช้รูปร่างสองแบบเป็นหนึ่งเดียว คล้ายกับ # 3 ในสถานการณ์นี้ฉันสามารถประสบความสำเร็จได้ด้วยการปฏิบัติต่อวัตถุเป็นหนึ่งเดียว แตกต่างจาก # 3 และ # 4 ฉันไม่สามารถรักษารูปร่างเป็นหนึ่งเป็นรูปร่างสีส้มจะจบลงหนึ่งตารางลอยสูงเกินไป ... อีกรูปแบบของปัญหา # 6 อาจมีสถานการณ์อื่น ๆ ที่ฉันมีหลายรูปร่างที่คลุกเคล้าในสถานการณ์ที่ซับซ้อนมากขึ้น แต่ฉันคิดว่าข้างต้นครอบคลุมส่วนพื้นฐานที่สุดของปัญหา ฉันรู้สึกว่ามีวิธีการแก้ปัญหาที่สง่างามที่ฉันยังไม่ได้พบ / คิดและจะขอบคุณมากที่ข้อมูลเชิงลึกความคิดหรือทรัพยากรใด ๆ สารละลาย …

3
อัลกอริทึมตรวจจับการชนกันของเฟสแคบ
การตรวจจับการชนมีสามขั้นตอน Broadphase : มันวนลูประหว่าง objec ทั้งหมดที่สามารถโต้ตอบบวกได้รับอนุญาตถ้ามันจะเร่งความเร็ววน Narrowphase : พิจารณาว่าพวกเขาชนกันและบางครั้งอย่างไรไม่มีผลบวกปลอม การแก้ไข : แก้ไขการชน คำถามที่ฉันถามเป็นเรื่องเกี่ยวกับเฟสแคบ มีอัลกอริธึมหลายอย่างแตกต่างกันในความซับซ้อนและความแม่นยำ Hitbox intersection : นี่เป็นอัลกอริทึม a-posteriori ที่มีความซับซ้อนต่ำที่สุด แต่ก็ไม่แม่นยำเกินไป จุดตัดสี : จุดตัด Hitbox สำหรับแต่ละพิกเซล, a-posteriori, พิกเซลสมบูรณ์แบบ, ไม่แม่นยำในเรื่องของเวลา, ความซับซ้อนสูงขึ้น การแยกทฤษฎีบทแกน : มันถูกใช้บ่อยกว่า, แม่นยำสำหรับรูปสามเหลี่ยมอย่างไรก็ตาม, a-posteriori, เนื่องจากมันหาขอบไม่ได้, เมื่อพิจารณากรอบสุดท้ายในบัญชี, มันมีเสถียรภาพมากขึ้น Linear raycasting : อัลกอริทึม A-Priori ซึ่งเป็นประโยชน์สำหรับฟิสิกส์กึ่งที่สมจริงมองหาจุดตัดที่แม่นยำยิ่งกว่า SAT แต่มีความซับซ้อนมากขึ้น การแก้ไขเส้นโค้ง: A-Priori, แม่นยำยิ่งขึ้นกว่ารังสีเชิงเส้น, coplexity …

2
เรือแล่นผ่านใต้สะพานใน RTS ที่อิงกับไทล์ 2 มิติ
ฉันกำลังเขียน RTS ที่อิงกับไทล์ และฉันต้องการเพิ่มฟีเจอร์ 'หลอก 3D' ลงไป - เชื่อมข้ามแม่น้ำ ฉันยังไม่ได้เริ่มการเข้ารหัสใด ๆ เพียงแค่พยายามคิดว่ามันเหมาะกับรูปแบบการตรวจจับการชนกันของข้อมูลอย่างไร เรือแล่นผ่านใต้สะพานและหน่วยเคลื่อนที่ข้ามสะพานในที่สุดจะครอบครองเซลล์เดียวกันบนแผนที่ วิธีการจัดลำดับพวกเขาจากการชน? มีวิธีการทั่วไปในการแก้ปัญหาดังกล่าวหรือไม่? หรือฉันต้องใช้โลก 3 มิติเพื่อทำสิ่งนี้?

4
การตอบสนองรูปสี่เหลี่ยมผืนผ้าชนกัน
ฉันมีปัญหาในการรับสี่เหลี่ยมที่เคลื่อนย้ายได้เพื่อชนกับสี่เหลี่ยมมากกว่าหนึ่ง ฉันกำลังใช้SFMLและมันมีฟังก์ชั่นintersectsที่ใช้งานง่ายที่เรียกว่าซึ่งใช้เวลา 2 สี่เหลี่ยมและส่งกลับจุดตัด ฉันมีเวกเตอร์ที่เต็มไปด้วยรูปสี่เหลี่ยมผืนผ้าซึ่งฉันต้องการให้สี่เหลี่ยมที่เคลื่อนย้ายได้ของฉันชนกัน ฉันวนลูปผ่านสิ่งนี้โดยใช้รหัสต่อไปนี้ (p คือสี่เหลี่ยมที่เคลื่อนที่ได้) IsCollidingWithส่งกลับค่าบูล แต่ยังใช้ SFML intersectsเพื่อหาจุดแยก while(unsigned i = 0; i!= testRects.size(); i++){ if(p.IsCollidingWith(testRects[i]){ p.Collide(testRects[i]); } } และCollide()รหัสจริง: void gameObj::collide( gameObj collidingObject ){ printf("%f %f\n", this->colliderResult.width, this->colliderResult.height); if (this->colliderResult.width < this->colliderResult.height) { // collided on X if (this->getCollider().left < collidingObject.getCollider().left ) { this->move( -this->colliderResult.width …

2
Breakout Collision: ตรวจจับด้านข้างของการชน
ฉันกำลังเขียนโคลน breakout (เกมแรกของฉัน) และฉันติดอยู่กับวิธีที่ฉันคิดออกว่าด้านใดของก้อนอิฐที่ถูกกระแทก ฉันมีวิธีตรวจจับการชนกันที่มีลักษณะดังนี้: DetectCollision(Object a, Object b) x = distance(a.x, b.x); y = distance(a.y, b.y); if (x is smaller than the combined width & y is smaller is than combined height { return true; } return false; มันใช้งานได้ดี แต่ฉันต้องรู้ด้านของการชนและตำแหน่งที่สัมพันธ์กับศูนย์กลางเพื่อตอบสนองอย่างถูกต้อง ฉันใช้เวลาสองสามวันที่ผ่านมาสอดแนม แต่ก็หายไป

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

2
เทคนิคการตรวจจับการชนของเครื่องยนต์ฟิสิกส์อย่างต่อเนื่อง
ฉันกำลังทำงานกับเอนจินฟิสิกส์แบบต่อเนื่องล้วนๆและฉันต้องเลือกอัลกอริทึมสำหรับการตรวจจับการชนกันของเฟสกว้างและแคบ "ต่อเนื่องอย่างหมดจด" หมายถึงฉันไม่เคยทำการทดสอบทางแยก แต่ต้องการหาวิธีที่จะจับการชนกันทุกครั้งก่อนที่มันจะเกิดขึ้นและวางลงในสแต็ก "การชนกันตามแผน" ที่จัดทำโดย TOI ช่วงกว้าง วิธีเดียวในช่วงกว้างอย่างต่อเนื่องที่ฉันสามารถนึกได้คือการห่อหุ้มร่างกายแต่ละดวงในวงกลมและทดสอบว่าแต่ละวงกลมจะทับซ้อนกันหรือไม่ อย่างไรก็ตามเรื่องนี้ดูเหมือนว่าจะไม่มีประสิทธิภาพอย่างน่ากลัวและขาดการคัดเลือกใด ๆ ฉันไม่มีความคิดว่า analogs แบบต่อเนื่องอาจมีอยู่สำหรับวิธีการคัดแยกการชนกันของวันนี้เช่นต้นไม้สี่ต้นอย่างใดอย่างหนึ่ง ฉันจะป้องกันการทดสอบในวงกว้างที่ไม่เหมาะสมและไม่มีจุดหมายได้อย่างไรเช่นเครื่องยนต์ไม่ต่อเนื่องทำอย่างไร ฉันต้องการเห็นการชนกันมากกว่า 1 เฟรมก่อนหน้า Narrow Phase ฉันพยายามปรับ SAT แคบ ๆ ให้เป็นการตรวจสอบอย่างต่อเนื่องมากกว่าที่จะแยก แต่ฉันแน่ใจว่ามีอัลกอริธึมอื่นที่ดีกว่าในเอกสารหรือเว็บไซต์ที่คุณอาจเจอ คุณแนะนำให้ฉันใช้อัลกอริทึมแบบเร็วและแม่นยำแบบใดและข้อได้เปรียบ / ข้อเสียของแต่ละข้อคืออะไร? หมายเหตุสุดท้าย: ฉันพูดถึงเทคนิคและไม่ใช่อัลกอริธึมเพราะฉันยังไม่ได้ตัดสินใจว่าฉันจะเก็บรูปหลายเหลี่ยมหลายรูปแบบได้อย่างไรซึ่งอาจเป็นเว้านูนกลมหรือมีรู ฉันวางแผนที่จะตัดสินใจบนพื้นฐานของสิ่งที่อัลกอริทึมต้องการ (เช่นถ้าฉันเลือกอัลกอริทึมที่แบ่งรูปหลายเหลี่ยมออกเป็นรูปสามเหลี่ยมหรือรูปทรงนูนฉันจะเก็บข้อมูลรูปหลายเหลี่ยมในรูปแบบนี้)

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

1
มีอัลกอริทึมที่รู้จักกันดีในการปรับรูปหลายเหลี่ยมให้เหมาะสมกับรูปร่างหรือไม่?
ฉันใช้เครื่องยนต์ฟิสิกส์ Chipmunk เพื่อสร้างระดับสำหรับเกม 2D C ฉันต้องการให้พอดีกับรูปหลายเหลี่ยมกับรูปร่างที่กำหนดเองเพื่อใช้เป็นหน้ากากปะทะกัน ให้รูปแบบการชนสีดำและสีขาวสำหรับวัตถุระดับโดยพลการดังนี้ มีอัลกอริทึมที่รู้จักกันดีสำหรับการรับนี้: ฉันสามารถใช้รูปหลายเหลี่ยมสีแดงเพื่อสร้างวัตถุฟิสิกส์เพื่อไปกับภาพ

4
วิธีที่มีประสิทธิภาพมากที่สุดในการค้นหาจุดตัดของขีปนาวุธและภูมิประเทศบิตแมปคืออะไร
การติดตามคำถามก่อนหน้านี้ของฉันเกี่ยวกับการค้นหาความชันของภูมิประเทศบิตแมป 2Dตอนนี้ฉันจำเป็นต้องรู้วิธีที่ดีที่สุดในการค้นหาจุดบนภูมิประเทศ 2D ที่ขีปนาวุธตี เห็นได้ชัดว่าฉันสามารถดูว่ามีพิกเซลใด ๆ ภายใต้ภูมิประเทศที่เป็นขีปนาวุธหรือไม่ แต่บอกว่ามันเคลื่อนที่ลึกเข้าไปในภูมิประเทศ วิธีที่ดีที่สุดในการย้อนกลับไปหาที่ที่มันชนกันในตอนแรกคืออะไร? ฉันสามารถเลื่อนพิกเซล X ย้อนกลับทีละจุดไปยังตำแหน่งก่อนหน้าของขีปนาวุธ แต่สิ่งที่เป็นค่าที่ดีของ X? และมีวิธีที่ฉลาดกว่านี้ไหม? อาจจะย้ายครึ่งทางแล้วก็ไตรมาส ฯลฯ ?

4
ใน Cocos2D ฉันจะตรวจสอบการชนกับรูปร่างที่ผู้ใช้วาดเองตามอำเภอใจได้อย่างไร
ฉันต้องการตรวจจับการปะทะกันระหว่างสไปรต์และรูปร่างที่ผู้ใช้สร้างขึ้นของการจัดเรียงบางอย่าง ตัวอย่างเช่น. มี 3 วัตถุบนหน้าจอ ผู้ใช้ใช้นิ้วของพวกเขาและวาดรูปร่างผิดปกติประมาณ 2 ของวัตถุ ฉันต้องการตรวจจับวัตถุ 2 ชิ้นนั้น ฉันจะใช้วิธีนี้อย่างมีประสิทธิภาพโดยใช้ Cocos2D ได้อย่างไร

3
การตรวจจับการชนกันแบบ 3 มิติที่เร็วที่สุดระหว่างกล่องขอบเขตสองตัว (OBBs)
ฉันอยู่ในจุดที่เกมของฉันที่ฉันต้องการเพิ่มระบบการปะทะกัน ฉันลอง jBullet และในขณะที่ใช้งานได้มันก็ไม่ใช่สิ่งที่ฉันกำลังมองหา ฉันแค่ต้องการวิธีง่ายๆในการทดสอบว่าต้นไม้สองเส้นที่มุ่งเน้นกล่อง (OBB) ชนกันหรือไม่ ฉันจะไปชนกันโดยใช้ต้นไม้ สร้าง AABB สำหรับบรอดเฟสจากนั้นถ้าผ่านการทดสอบว่า OBB แต่ละต้นในต้นไม้ชนกับต้นไม้อื่นหรือไม่ ฉันพบบางสิ่งบนอินเทอร์เน็ต แต่ฉันไม่สามารถเข้าใจได้อย่างสมบูรณ์ สิ่งที่ฉันขอคือเว็บไซต์หรือแหล่งข้อมูลที่อธิบายการชนแบบ 3D OBB ได้ดี? ฉันได้เรียนรู้ว่า GJK นั้นเร็วกว่า SAT และดูเหมือนจะสามารถบอกฉันได้ว่ากล่องนั้นทะลุกันได้ไกลแค่ไหน ฉันพบบางสิ่งที่ GJK แต่พวกเขาไม่ใช่กล่อง สิ่งที่ซับซ้อนและสับสนแทน ฉันแค่ต้องการสร้าง OBB จาก 3 เวกเตอร์: ศูนย์กลางขนาดและการหมุนของแต่ละแกน จากนั้นสามารถทดสอบการชนกับสิ่งเหล่านั้นได้ ขอบคุณล่วงหน้าสำหรับทุกสิ่งที่คุณโพสต์

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

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