คำถามติดแท็ก raycasting

เทคนิคการใช้รังสีเพื่อกำหนดจุดตัดกัน มักใช้ในการจำลองแสง

4
ส่งเรย์เพื่อเลือกบล็อกในเกม voxel
ฉันกำลังพัฒนาเกมที่มีภูมิประเทศคล้าย Minecraft ที่ทำจากบล็อก เนื่องจากการเรนเดอร์พื้นฐานและการโหลดชิ้นข้อมูลเสร็จสิ้นแล้วฉันต้องการใช้การเลือกบล็อก ดังนั้นฉันจึงต้องค้นหาว่าบล็อกใดที่กล้องตัวแรกกำลังเผชิญอยู่ ฉันได้ยินมาแล้วว่าไม่ได้คาดเดาฉากทั้งหมด แต่ฉันตัดสินใจว่าเพราะมันฟังดูแฮ็คและไม่ถูกต้อง บางทีฉันอาจโยนรังสีไปในทิศทางที่มองเห็นได้ แต่ฉันไม่รู้วิธีตรวจสอบการชนด้วยบล็อกในข้อมูล voxel ของฉัน แน่นอนว่าการคำนวณนี้ต้องทำบน CPU เนื่องจากฉันต้องการผลลัพธ์เพื่อดำเนินการกับเกมลอจิก แล้วฉันจะรู้ได้อย่างไรว่าบล็อกไหนอยู่หน้ากล้อง? ถ้าเป็นที่ต้องการฉันจะโยนรังสีและตรวจสอบการชนได้อย่างไร

2
ฉันจะติดตั้งไฟในเครื่องยนต์ voxel ได้อย่างไร
ฉันกำลังสร้าง MC เหมือนเครื่องยนต์ภูมิประเทศและฉันคิดว่าแสงจะทำให้มันดูดีขึ้นมากปัญหาคือบล็อกไม่สว่างอย่างเหมาะสมเมื่อวางบล็อกที่ปล่อยแสง (ดูภาพหน้าจอที่ด้านล่าง บนหน้า จนถึงตอนนี้ฉันต้องการใช้แสง "บล็อก" ของ minecraft ดังนั้นฉันจึงสร้าง VertexFormat: struct VertexPositionTextureLight { Vector3 position; Vector2 textureCoordinates; float light; public readonly static VertexDeclaration VertexDeclaration = new VertexDeclaration ( new VertexElement(0, VertexElementFormat.Vector3, VertexElementUsage.Position, 0), new VertexElement(sizeof(float) * 3, VertexElementFormat.Vector2, VertexElementUsage.TextureCoordinate, 0), new VertexElement(sizeof(float) * 5, VertexElementFormat.Single, VertexElementUsage.TextureCoordinate, 1) ); public …
15 c#  xna  lighting  raycasting 

1
ฉันจะวาดลูกศรที่ขอบของหน้าจอที่ชี้ไปยังวัตถุที่อยู่นอกหน้าจอได้อย่างไร
ฉันต้องการทำสิ่งที่อธิบายไว้ในหัวข้อนี้: http://www.allegro.cc/forums/print-thread/283220 ฉันได้ลองวิธีการต่าง ๆ ที่กล่าวถึงที่นี่ ก่อนอื่นฉันพยายามใช้วิธีที่อธิบายโดย Carrus85: ลองหาอัตราส่วนของสามเหลี่ยมไฮโปเทนไนต์สามเหลี่ยมสองอัน (ไม่สำคัญว่าคุณจะใช้ triagle ตัวไหนสำหรับอันอื่นฉันขอแนะนำจุดที่ 1 และจุดที่ 2 ตามระยะทางที่คุณคำนวณ) นี่จะให้เปอร์เซ็นต์อัตราส่วนของสามเหลี่ยมที่มุมจากสามเหลี่ยมขนาดใหญ่ จากนั้นคุณก็คูณค่าลบด้วยค่านั้นเพื่อให้ได้ค่าพิกัด x พิกัดและเลื่อนตามค่านั้นเพื่อให้ได้ค่าชดเชยพิกัด y แต่ฉันไม่สามารถหาวิธีคำนวณว่าวัตถุอยู่ห่างจากขอบของหน้าจอมากแค่ไหน ฉันลองใช้การฉายรังสี (ซึ่งไม่เคยทำมาก่อน) แนะนำโดย 23yrold3yrold: ยิงรังสีออกจากกึ่งกลางของหน้าจอไปยังวัตถุที่อยู่นอกจอ คำนวณว่าจุดใดที่สี่เหลี่ยมผืนผ้าตัดกับแสง มีพิกัดของคุณ ฉันคำนวณด้านตรงข้ามมุมฉากของสามเหลี่ยมที่เกิดขึ้นจากความแตกต่างในตำแหน่ง x และ y ของจุดสองจุด ฉันใช้สิ่งนี้เพื่อสร้างเวกเตอร์หน่วยตามเส้นนั้น ฉันวนลูปผ่านเวกเตอร์นั้นจนกระทั่งพิกัด x หรือพิกัด y ไม่อยู่บนหน้าจอ ค่า x และ y สองค่าปัจจุบันจากนั้นสร้างค่า x และ y ของลูกศร นี่คือรหัสสำหรับวิธีการฉายรังสีของฉัน (เขียนใน …

3
ฉันจะใช้แสงที่ถูกบดบังในเกม 2D แบบบล็อกได้อย่างไร
ฉันต้องการแสง 2D ที่สามารถถูกบล็อกโดยวัตถุในเกม เกมของฉันมีมุมมองจากบนลงล่างและวัตถุในเกมทั้งหมดได้รับการอธิบายเป็นรูปสี่เหลี่ยมผืนผ้า สมมติว่าฉันมีโลก 10x10 และฉันวางแสงที่ 1x1 และผนังรอบ ๆ แสงนั้น ฉันต้องการที่จะเห็นแหล่งกำเนิดแสงที่ 1x1 แต่ไม่ใช่ที่อื่นเพราะมันถูกบล็อกโดยกำแพง ฉันเคยได้ยินว่าการฉายรังสีแสงทำงาน แต่มันทำงานอย่างไรจริง ๆ ?

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ให้ขึ้นผลตอบแทน นี่ดูเหมือนจะจับทุกอย่าง แต่สิ่งที่ทำให้ฉันรู้สึกไม่สบายใจและฉันไม่แน่ใจว่าจะทดสอบว่าวิธีนี้ใช้ได้ผลในกรณีที่เพียงพอ มีวิธีที่ดีกว่า? …

3
จะจัดการกับ RTS Click-And-Move ใน 3D Space ได้อย่างไร?
ฉันจะจัดการคลิกและย้ายในพื้นที่ 3D ที่สมบูรณ์ได้อย่างไร มันง่ายในการจัดการบนเครื่องบิน 2D ด้วยเครื่องฉายรังสีแบบเรียบง่าย แต่นี่ไม่ใช่กรณีในแบบ 3 มิติเนื่องจากไม่มีเครื่องปลายสำหรับเครื่องรับรังสีเพื่อให้ได้จุดสิ้นสุด ฉันมีความคิดสองประการในใจ: ทำ raycast จากนั้นอนุญาตให้ผู้เล่นเลือกระยะทางในรังสีโดยอินพุทอื่น (ยกตัวอย่างเช่นเมาส์โฮว) แทนที่จะเป็น 3D ที่สมบูรณ์มี "ความสูงหลายชั้น" เพื่อให้ผู้เล่นสามารถเปลี่ยนเลเยอร์ความสูงก่อนสั่งย้าย คุณคิดยังไง?

1
ฉันจะมั่นใจได้ว่ามุมมองสมมาตรใน Roguelike ได้อย่างไร
ฉันกำลังทำงานกับ Roguelike และสำหรับฉันฉันได้สร้างอัลกอริทึมการติดตามเรย์ / การคัดเลือกนักแสดงมุมมอง (FoV) ซึ่งประกอบด้วยการพล็อตเส้น Bresenham ทุกจุดในวงกลมที่เป็นของแข็ง มันเป็นสิ่งประดิษฐ์ฟรี (และมีประสิทธิภาพพอสมควร) แต่มันขาดความต้องการที่สำคัญของฉัน: สมมาตร (ถ้าคุณเห็นสัตว์ประหลาดมันจะต้องสามารถเห็นคุณได้ด้วย) นี่คือตัวอย่างของพฤติกรรมที่ไม่สมมาตรของรหัสของฉัน ในภาพด้านซ้ายฉันยืนอยู่ที่มุมหนึ่ง (บล็อก 'X' สีแดง = กำแพง) ฉันเห็นกระเบื้องด้านบนขวา อย่างไรก็ตามหากฉันย้ายไปที่หนึ่งในกระเบื้องเหล่านั้น (ภาพขวา) ฉันจะไม่เห็นไทล์ที่มาจากอีกต่อไป ฉันคิดว่าฉันอาจจะอยู่ในรูปแบบของเขตข้อมูลที่อนุญาตแต่เนื่องจากบทความ Roguebasin แนะนำว่าอนุญาตให้มีความสมมาตร มีทางเลือกอื่นในการทำให้สมมาตรไหม?

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

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

2
สายตาในแนวทแยงมุมมีสองมุม
ตอนนี้ฉันกำลังใช้อัลกอริธึมของ Bresenham สำหรับการมองเห็น ปัญหาคือฉันได้พบเคสที่ผู้เล่นสามารถมองทะลุกำแพงได้ เกิดขึ้นเมื่อผู้เล่นดูระหว่างสองมุมของกำแพงที่มีช่องว่างในอีกด้านหนึ่งในมุมที่เฉพาะเจาะจง ผลลัพธ์ที่ฉันต้องการคือการเรียงต่อกันระหว่างผนังทั้งสองจะมีการทำเครื่องหมายไม่ถูกต้องเช่นกัน วิธีใดที่เร็วที่สุดในการแก้ไขอัลกอริทึมของ Bresenham เพื่อแก้ปัญหานี้ หากไม่มีทางออกที่ดีจะมีอัลกอริทึมที่เหมาะสมกว่าหรือไม่ ยินดีต้อนรับความคิดใด ๆ โปรดทราบว่าการแก้ปัญหาควรจะรองรับ 3d ได้ด้วย แก้ไข: ทางออกที่ง่ายของฉันคือการตรวจสอบว่าทั้งสองมุมถูกปิดหรือไม่เมื่อพิกัด x และ y เปลี่ยนไป สำหรับซอร์สโค้ดที่ใช้งานได้และการสาธิตเชิงโต้ตอบของผลิตภัณฑ์ที่สมบูรณ์โปรดดูที่http://ashblue.github.io/javascript-pathfinding/

2
วิธีที่มีประสิทธิภาพมากขึ้นในการติดตั้ง Line of sight บนตาราง 2d ด้วยการฉายรังสี?
พิจารณาตารางไพ่แบบ 2d และขอบเขตของพิกัดโดยประมาณ - ซึ่งอยู่กึ่งกลางผู้เล่น - ซึ่งแสดงถึงเส้นสายตา เป้าหมายคือเพื่อป้องกันสายตาที่มองข้ามสิ่งกีดขวาง (เช่นกำแพง) มันค่อนข้างง่ายที่จะตรวจสอบว่ามีเซลล์ใดในขอบเขตของสายตาที่มองเห็นหรือไม่: ฉายรังสีจากผู้เล่นไปยังเซลล์เป้าหมายโดยใช้Bresenham's - หากหนึ่งในเซลล์ที่ทับซ้อนกันระหว่างผู้เล่นและเป้าหมายนั้นเป็นอุปสรรคเซลล์เป้าหมาย ไม่สามารถมองเห็นได้ ตอนนี้ความคิดแรกของฉันคือการวนซ้ำไปตามเซลล์กริดทั้งหมดในแนวสายตา - แต่ดูเหมือนว่าจะไม่มีประสิทธิภาพสำหรับฉัน ตัวอย่างเช่นหากผู้เล่นยืนอยู่ติดกับกำแพงและคุณกำหนดว่ามองไม่เห็นเซลล์ที่อยู่นอกกำแพงคุณสามารถระบุเซลล์ทั้งหมดบนรังสีหลังจากนั้นจะมองไม่เห็น นอกจากนี้ยังพิจารณาการส่งรังสีไปยังแต่ละเซลล์ตามแนวรัศมีของสายตาและวนเซลล์แต่ละเซลล์ตามแต่ละรังสี - แต่ฉันจะทำการประมวลผลเซลล์มากกว่าหนึ่งครั้ง มีวิธีที่มีประสิทธิภาพมากกว่านี้ไหม ในขณะที่วนซ้ำ ~ 50 เซลล์ต่อเทิร์นคือการคำนวณที่ค่อนข้างเบาฉันจะเร่งความเร็ว - เป้าหมายคือสามารถหมุนเวียนรอบ ๆ ไม่กี่รอบต่อวินาทีในการเล่นอัตโนมัติ ดังนั้นยิ่งฉันมีประสิทธิภาพมากเท่าไร
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.