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

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

5
จะกำหนดเซลล์ใดในกริดที่ตัดกับสามเหลี่ยมที่กำหนด?
ฉันกำลังเขียนแบบจำลอง AI 2D แต่ฉันไม่แน่ใจว่าจะตรวจสอบว่าตำแหน่งของตัวแทนอยู่ในมุมมองของคนอื่นหรือไม่ ปัจจุบันการแบ่งส่วนโลกของฉันคือการแบ่งเซลล์แบบง่าย (ตาราง) ฉันต้องการใช้รูปสามเหลี่ยมเพื่อแสดงเขตของมุมมอง แต่ฉันจะคำนวณเซลล์ที่ตัดกับรูปสามเหลี่ยมได้อย่างไร คล้ายกับภาพนี้: พื้นที่สีแดงเป็นเซลล์ที่ฉันต้องการคำนวณโดยตรวจสอบว่าสามเหลี่ยมตัดกับเซลล์เหล่านั้นหรือไม่ ขอบคุณล่วงหน้า. แก้ไข: เพียงเพิ่มความสับสน (หรืออาจทำให้ง่ายขึ้น) แต่ละเซลล์มี min และ max vector โดยที่ min เป็นมุมซ้ายล่างและ max เป็นมุมขวาบน

1
ในเอนจินฟิสิกส์ 2 มิติฉันจะหลีกเลี่ยงการชนที่ไร้ประโยชน์ได้อย่างไรเมื่อวัตถุเข้ามาพัก
ในเครื่องมือฟิสิกส์ที่ฉันกำลังพัฒนา (เพื่อการเรียนรู้) โดยใช้ความรัก -2dฉันใช้ความละเอียดการชนในลักษณะนี้: FixedUpdate(dt) // I use fixed timestep foreach collide c1 in allNotStaticColliders c1.integartePhysic // i.e. apply gravitational force.. foreach collider c2 "near" c1 // "near"= I use spatial hashing if collide(c1,c2) resolve collision (c1,c2) // the heavy operation collison callbacks c1 collison callbacks c2 ... อย่างที่คุณเห็นในตอนท้ายของอนิเมชั่น gif …

1
ฉันจะชักนำให้เกิดเหตุการณ์การชนใน LibGDX 3D ได้อย่างไร
ในรหัสด้านล่างฉันได้ยกตัวอย่างของสิ่งที่ฉันต้องการจะทำ ฉันมีกล้องถ่ายรูปและฉันต้องการให้มันหยุดเคลื่อนไหวเมื่อใดก็ตามที่กระทบกับกล่องใดกล่องหนึ่งฉันจะทำสิ่งนี้ได้อย่างไร public class Main extends ApplicationAdapter { private final ModelBuilder builder = new ModelBuilder(); private final Environment environment = new Environment(); private ModelBatch modelBatch; private PerspectiveCamera camera; private Model model; private ArrayList<ModelInstance> instance = new ArrayList<ModelInstance>(); private FirstPersonCameraController controller; private BoundingBox[] boxBounds = new BoundingBox[1000]; private BoundingBox cameraBox = …

1
การแยกทฤษฎีบทแกนด้วยหลายเหลี่ยม
ฉันพยายามที่จะใช้ทฤษฎีบทแกนแยกใน C # ฉันมีฟังก์ชั่นที่สามารถคำนวณเวกเตอร์การแปลขั้นต่ำระหว่างรูปหลายเหลี่ยมสองอัน อย่างไรก็ตามฉันไม่สามารถสร้างฟังก์ชันที่คำนวณเวกเตอร์การแปลขั้นต่ำได้ระหว่างรูปหลายเหลี่ยมหนึ่งกับรูปหลายเหลี่ยมอื่น ๆ สุจริตฉันได้ทำงานกับสิ่งนี้มาหลายเดือนแล้วและฉันก็ไม่ได้เข้าใกล้ทางออกและไม่สามารถหาวิธีแก้ปัญหาออนไลน์ได้ มีกรณีขอบบางอย่างที่ไม่ส่งคืนผลลัพธ์ที่ถูกต้องนำไปสู่ข้อบกพร่องที่มีลำดับความสำคัญสูงในเกมของฉัน นี่คือกรณีขอบทั่วไปที่ทำงานไม่ถูกต้อง: มีวิธีแก้ไขปัญหาที่รู้จักกันดีสำหรับปัญหานี้หรือไม่? ทั้งหมดที่ฉันสามารถหาได้คือคนที่พูดว่า "แค่ทำ SAT ในรูปหลายเหลี่ยมแต่ละอัน" แต่นี่ไม่ค่อยจะสร้างเวกเตอร์การแปลขั้นต่ำ ความช่วยเหลือใด ๆ จะได้รับการชื่นชมอย่างมาก

2
รับรายละเอียดการชนจาก Rectangle.Intersects ()
ฉันมีเกมฝ่าวงล้อมที่บางจุดฉันตรวจพบการชนกันระหว่างลูกบอลและไม้พายด้วยสิ่งนี้: // Ball class rectangle.Intersects(paddle.Rectangle); มีวิธีที่ฉันจะได้รับพิกัดที่แน่นอนของการปะทะกันหรือรายละเอียดใด ๆ เกี่ยวกับเรื่องนี้ด้วยการใด ๆ ในปัจจุบันXNA API? ฉันคิดถึงการคำนวณพื้นฐานบางอย่างเช่นการเปรียบเทียบพิกัดที่แน่นอนของแต่ละวัตถุในช่วงเวลาของการชน มันจะมีลักษณะเช่นนี้: // Ball class if((rectangle.X - paddle.Rectangle.X) < (paddle.Rectangle.Width / 2)) // Collision happened on the left side else // Collision happened on the right side แต่ฉันไม่แน่ใจว่านี่เป็นวิธีที่ถูกต้องที่จะทำ พวกคุณมีเคล็ดลับเกี่ยวกับเครื่องยนต์ที่ฉันอาจต้องใช้เพื่อให้บรรลุหรือไม่? หรือแม้แต่การเขียนโค้ดที่ดีโดยใช้วิธีนี้?

5
การตรวจจับการชนกันแบบ 2 มิติสำหรับเกมพินบอล
จนถึงตอนนี้ในเกมก่อนหน้านี้ฉันใช้การชนสองมิติแบบง่ายกับกล่องจากนั้นตรวจสอบที่ระดับพิกเซลเพื่อการชนกัน หากทำเกมพินบอลในเฟรมจำนวนมากลูกจะสัมผัสกับกำแพงหรือพื้นผิวอื่นดังนั้นจะมีวิธีอื่นหรือไม่?

1
gluLookAt ทำงานอย่างไร
จากความเข้าใจของฉัน gluLookAt( eye_x, eye_y, eye_z, center_x, center_y, center_z, up_x, up_y, up_z ); เทียบเท่ากับ: glRotatef(B, 0.0, 0.0, 1.0); glRotatef(A, wx, wy, wz); glTranslatef(-eye_x, -eye_y, -eye_z); แต่เมื่อฉันพิมพ์ModelViewเมทริกซ์การเรียกเพื่อglTranslatef()ดูเหมือนจะทำงานไม่ถูกต้อง นี่คือข้อมูลโค้ด: #include <stdlib.h> #include <stdio.h> #include <GL/glut.h> #include <iomanip> #include <iostream> #include <string> using namespace std; static const int Rx = 0; static const int …

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

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

4
วงกลมภายในการชนกันของวงกลม
ในโครงการหนึ่งของฉันฉันมีพื้นที่เล่นเกมในรูปวงกลม ภายในวงกลมนี้มีวงกลมเล็ก ๆ อีกวงหนึ่งกำลังเคลื่อนที่ สิ่งที่ฉันต้องการจะทำคือป้องกันไม่ให้วงกลมเล็ก ๆ เคลื่อนไปข้างนอกวงกลมที่ใหญ่กว่า ด้านล่างคุณจะเห็นว่าในกรอบที่ 2 วงกลมเล็กด้านนอกฉันต้องการวิธีย้ายมันกลับไปก่อนที่มันจะออกไปข้างนอก สิ่งนี้สามารถทำได้? นอกจากนี้ฉันต้องการจุดชนตามส่วนโค้งของวงกลมใหญ่เพื่อให้ฉันสามารถอัปเดตความเร็วของวงกลมขนาดเล็กได้ เราจะคำนวณจุดนี้อย่างไร สิ่งที่ฉันต้องการจะทำคือก่อนที่จะย้ายวงกลมเล็ก ๆ ฉันทำนายตำแหน่งต่อไปของมันและถ้ามันอยู่นอกฉันจะหาเวลาของการชนกันระหว่าง t = 0 และ t = 1 (t = 1 เต็มเวลา) ถ้าฉันมีเวลาปะทะ t ฉันก็แค่ขยับวงกลมเล็ก ๆ ในช่วง t แทนขั้นตอนเต็มเวลา แต่อีกครั้งปัญหาคือฉันไม่รู้วิธีตรวจจับในเวลานั้นการชนเกิดขึ้นเมื่อมันมาถึงวงกลมสองวงและวงหนึ่งอยู่ภายในอีกวงหนึ่ง แก้ไข: ตัวอย่างจุดปะทะ (สีเขียว) ที่ฉันต้องการค้นหา บางทีภาพอาจจะออกมาเล็กน้อย แต่คุณก็เข้าใจ

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

4
มีวิธีเพิ่มประสิทธิภาพการตรวจสอบการชนของระบบของวัตถุ n หรือไม่?
ฉันกำลังสร้างเกมที่ประกอบด้วยวัตถุบนหน้าจอจำนวนมากซึ่งหนึ่งในนั้นคือผู้เล่น ฉันจำเป็นต้องรู้ว่าวัตถุใดที่กระทบทุกการทำซ้ำ ฉันทำอะไรแบบนี้ for (o in objects) { o.stuff(); for (other in objects) if (collision(o, other)) doStuff(); bla.draw(); } นี่มี O (n ^ 2) ซึ่งฉันบอกว่าไม่ดี ฉันจะทำสิ่งนี้ได้อย่างมีประสิทธิภาพมากขึ้นเป็นไปได้ไหม ฉันกำลังทำสิ่งนี้ใน Javascript และโดยปกติแล้ว n จะต่ำกว่า 30 จะเป็นปัญหาหรือไม่หากสิ่งนี้ยังคงเหมือนเดิม

3
ฉันจะคำนวณการตอบสนองการชนระหว่างทรงกลมและระนาบได้อย่างไร
ฉันพยายามสร้างเกมสามมิติที่เรียบง่ายและจำเป็นต้อง จำกัด ผู้เล่นให้อยู่ในขอบเขตของโลกของเกม เมื่อผู้เล่นชนด้านข้างของโลกฉันต้องการให้เรือของผู้เล่นกระเด็นเล็กน้อย ผลที่ตามมาฉันพยายามดักจับผู้เล่นภายในกล่องและหยุดพวกเขาจากการหลบหนีผ่านด้านข้าง ... ฉันจัดการเพื่อกำหนดขีด จำกัด ของ gameworld เป็นชุดของเครื่องบินที่มีบรรทัดฐานและระยะทางจากแหล่งกำเนิด ผู้เล่นที่มีรูปทรงกลม bounding ทรงกลมและจากการติดตามเว็บไซต์นี้http://www.gamasutra.com/view/feature/3383/simple_intersection_tests_for_games.phpฉันมีการจัดการในการตรวจสอบการชนกัน ตอนนี้ฉันไม่สามารถบอกได้ว่าจะต้องทำอะไรเมื่อตรวจพบการชน สิ่งที่ดีที่สุดที่ฉันสามารถจัดการได้คือผู้เล่นติดอยู่ในระนาบตรงทะลุมันหรือกระเด้งออกไปในอัตราที่เร็วมาก ๆ สามัญสำนึกบอกฉันว่าฉันต้องคำนวณมุมที่สะท้อนออกจากระนาบโดยใช้แบบปกติและใช้กับความเร็วของผู้เล่น แต่ฉันคิดว่าฉันต้องดูก่อนว่าผู้เล่นผ่านระนาบซึ่งเป็นบิตที่ฉันไม่สามารถทำได้หรือไม่ ออกกำลังกาย.

3
การตรวจจับการชนกันของกระเบื้องที่มีประสิทธิภาพสำหรับสี่เหลี่ยมจำนวนมากหรือไม่
ขณะนี้ฉันกำลังทำเกมตามแบบตัวเอง (คิดว่า Terraria แต่แปลกน้อยกว่านี้ (ฉันคิดว่านั่นเป็นคำหรือไม่ขออภัยถ้าไม่ใช่) อย่างไรก็ตามตอนนี้ฉันมีระบบตรวจจับการชนกันของข้อมูลทำงานได้ดี มีบางสิ่งที่น่ายินดีเป็นอย่างยิ่งที่ได้เห็นผีสางไม่วิ่งผ่านบล็อก แต่แล้วฉันก็มีความคิดที่จะสร้างมาตรฐาน ความคิดที่ไม่ดี 1,000 สี่เหลี่ยมไม่มีปัญหา 10,000 สแควร์สำหรับ 3 ตัวอักษรเป็นความล่าช้า 100,000 squares (แผนที่ใหญ่มาก) สำหรับ 3 ตัวละครนั้นเล่นไม่ได้ ฉันมีปัญหาที่ฉันไม่ต้องการพิจารณาบล็อกที่อยู่ไกลจากผู้เล่นตัวละครไอเท็ม ฯลฯ แต่ฉันไม่ต้องการโหลดหน่วยความจำที่เหลืออยู่เหล่านั้นอย่างต่อเนื่อง นี่คืออัลกอริทึมของฉันจนถึงตอนนี้อย่าลังเลที่จะวิจารณ์ foreach (Block in level) { if (distance from block to player > a specified amount) ignore this block; else { get the intersection depth between …

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

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