สายตาในแนวทแยงมุมมีสองมุม


9

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

เส้นขอบซองสายตา

ผลลัพธ์ที่ฉันต้องการคือการเรียงต่อกันระหว่างผนังทั้งสองจะมีการทำเครื่องหมายไม่ถูกต้องเช่นกัน

ผลลัพธ์ที่ต้องการ

วิธีใดที่เร็วที่สุดในการแก้ไขอัลกอริทึมของ Bresenham เพื่อแก้ปัญหานี้ หากไม่มีทางออกที่ดีจะมีอัลกอริทึมที่เหมาะสมกว่าหรือไม่ ยินดีต้อนรับความคิดใด ๆ โปรดทราบว่าการแก้ปัญหาควรจะรองรับ 3d ได้ด้วย

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


2
มันสร้างความแตกต่างหรือไม่ถ้าคุณเปลี่ยนจุดเริ่มต้นและจุดสิ้นสุด บางทีคุณอาจยอมรับผลลัพธ์ได้หากการคำนวณทั้งสองคืนผลลัพธ์ที่ไม่เป็นอุปสรรค คุณอาจพบว่าบทความ LOS บางส่วนมีประโยชน์มากกว่าที่ RogueBasin
thalador

1
ทั้งสองวิธีบล็อกสีดำสองเส้นทแยงมุมที่ 4-5 ไม่ได้เชื่อมต่อกับผนังในสถานที่แรกและฉันพูดแบบนี้เพราะคุณอนุญาตให้มีการเคลื่อนไหวในแนวทแยงโดยปริยาย คุณจะต้องแยกออกจากกันในแนวทแยงนั้นเพื่อให้มันเป็นผนังที่ต่อเนื่องกันหรือทำให้เส้นวอล์คเกอร์ของคุณเป็นสี่เหลี่ยมจัตุรัสแทนที่จะเป็นแนวทแยงอย่างหมดจดเช่น 2-3 และ 4-5
Patrick Hughes

การพลิกฟังดูเหมือนความคิดที่ดี แต่ไม่สามารถแก้ไขปัญหาได้ สิ่งเดียวที่ฉันคิดได้คือการตรวจสอบและดูว่าหนึ่งในสองมุมว่างเปล่าหรือไม่ ดูเหมือนว่าจะมีราคาแพง
Ash Blue

5
"ดูเหมือนว่ามีราคาแพง" นั้นไม่เพียงพอที่จะให้เหตุผลที่จะไม่ลองอะไร "จะแพงเกินไป" โดยทั่วไปคือสมมติว่าคุณสามารถพิสูจน์ได้ว่าบางสิ่งจะช้าเกินไป
Mokosha

3
การเปลี่ยนอัลกอริธึมที่จำเป็นเท่านั้นคือถ้าทั้ง X และ Y กำลังเปลี่ยนไปในขั้นตอนเดียวกันก่อนอื่นให้เปลี่ยน X แล้วเปลี่ยน Y สิ่งนี้จะกำจัดเส้นทแยงมุมทั้งหมด
Patrick Hughes

คำตอบ:


7

Eric Lippert เขียนซีรีย์ยอดเยี่ยมเรื่องการสร้างแนวสายตาใน C # ด้วยShadow Castingบนตารางภาพถ่ายระนาบ ..

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

ฉันได้ดัดแปลงอัลกอริทึมของ Eric เป็นตารางหกเหลี่ยมที่นี่และใช้มันได้สำเร็จบนกริดหกเหลี่ยมขนาดใหญ่ (> 400 x 700) ด้วยรัศมีการมองเห็นที่กว้างขวาง (> 60 hexes) การติดตั้งใช้งานนี้จะคำนวณและแสดงผลมุมมองแบบสมบูรณ์โดยเร็วที่สุดเท่าที่ฉันจะกระพริบตาโดยใช้ CPU i7 ตัวเดียว เร็วพอสำหรับการใช้งานใด ๆ ที่ฉันคาดไว้

อัปเดต - แนวสายตาด้วยระดับความสูง:
การใช้ตารางฐานสิบหกที่เชื่อมโยงกับด้านบนจะคำนวณแนวสายตาด้วยระดับความสูงไม่ใช่แค่อุปสรรค หมายเหตุเอกสารประกอบยังกล่าวถึงการตัดสินใจเพิ่มเติมซึ่งจะต้องดำเนินการเกี่ยวกับการคำนวณระดับความสูง: ความสูงเป้าหมายและความสูงของผู้สังเกตการณ์ การเลือกเริ่มต้นคือการทำให้ทั้งสองเท่ากันซึ่งสร้างสมมาตร field-of-view แต่สามารถเลือก alse จากพื้นสู่พื้นและจากพื้นสู่พื้นได้ (รหัสคือโอเพ่นซอร์สภายใต้ MIT License)


ฉันกำลังขุด Shadow Casting จริงๆ แต่ฉันพบปัญหา มีปัญหาในการค้นหาข้อมูลใด ๆ เกี่ยวกับการปรับอัลกอริทึมในการทำงานกับแกน z ขออภัยที่จะพูดถึงเรื่องนี้ แต่คุณมีทรัพยากรที่แนะนำสำหรับการทำงานในแบบ 3 มิติหรือไม่?
Ash Blue

@AshBlue: ดูภาคผนวกด้านบน
Pieter Geerkens

ฉันกำลังดู codebase ของคุณ มีสิ่งที่ดีอยู่ในนั้น แต่ฉันไม่พบอัลกอริทึมการวาดเส้นเหมือน Bresenham ที่ดัดแปลงมาเป็น hexes คุณทำกับ LOS หรือไม่?
MLProgrammer-CiM

@EfEs: FieldOfView เป็นวัตถุที่ส่งคืน ShadowCastingFov * .cs สร้าง field-of-view โดยการคัดเลือกเงา หากคุณมีคำถามเฉพาะเกี่ยวกับรหัสคำถามเหล่านั้นอาจถูกถามอย่างดีที่สุดในส่วนการสนทนาของไซต์ คำถามทั่วไปเพิ่มเติมฉันยินดีที่จะตอบที่นี่
Pieter Geerkens

@PieterGeerkens คุณสามารถค้นหาคำถามได้ที่นี่gamedev.stackexchange.com/questions/57087/…
MLProgrammer-CiM

1

จะเกิดอะไรขึ้นหากการคำนวณ LOS คุณมีตาราง "ความละเอียดสูง" แยกต่างหากที่เติมในช่องว่างของมุม ฉันกำลังคิดบางอย่างเช่นนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ด้านซ้ายเป็นส่วนบล็อกดั้งเดิมของ 4 สี่เหลี่ยม

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

หมายความว่าพื้นที่พิกัดนั้นเพิ่มเป็นสี่เท่า แต่ฉันไม่คิดว่าเป็นปัญหาด้านประสิทธิภาพที่สำคัญ


ค่อนข้างแน่ใจว่าความละเอียดที่สูงกว่าจะมีลักษณะเหมือนกับต้นฉบับ เมื่อแบ่งตารางออกเป็นกริดที่เล็กกว่าคุณจะได้ภาพที่เหมือนกันเพียงแค่กริดที่เล็กกว่า แต่ละสี่เหลี่ยมจัตุรัสจะกลายเป็นสี่เหลี่ยมเล็ก ๆ 4 อันในจุดเดียวกัน
MichaelHouse

@ Byte56 ถูกต้องฉันหมายความว่าตรรกะเพิ่มเติมจะถูกนำไปใช้หลังจากการแบ่งเพื่อเพิ่มในบล็อกพิเศษในการคัดลอกที่ ตรรกะที่ต้องทำนั่นคือแบบฝึกหัดที่เหลือไว้สำหรับผู้อ่าน
Davy8

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