วิธีการได้รับผลลัพธ์ที่แม่นยำด้วยอัลกอริทึมของ Painter


14

ไม่นานมานี้ฉันถามว่าจะกำหนดได้อย่างไรเมื่อใบหน้าซ้อนทับกัน คำแนะนำคือการใช้บัฟเฟอร์ Z

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

นี่คือรายการวิธีการเรียงลำดับที่ฉันได้ลองไปแล้ว:

  • ระยะทางถึงจุดกึ่งกลางของแต่ละหน้า
  • ระยะทางเฉลี่ยของแต่ละจุดยอดของใบหน้า
  • ค่าเฉลี่ย z ของแต่ละจุดยอด
  • ค่าสูงสุดของจุดยอดของแต่ละหน้าและวาดอันดับแรก
  • ค่า z ต่ำสุดของจุดยอดของแต่ละหน้าและวาดสุดท้าย

ปัญหาคือใบหน้าอาจมีระยะใกล้กว่า แต่ก็ยังอยู่ไกลออกไป วิธีการทั้งหมดนี้ดูไม่น่าเชื่อถือ

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

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

อะไรคือสิ่งที่ใช้ในอัลกอริทึมของ Painter เพื่อกำหนดลำดับของวัตถุที่ควรวาด


1
อัลกอริทึมจิตรกรเป็นเพียงภาพวาดจากด้านหลังไปด้านหน้า
Jonathan Connell

1
@ 3nixios: ใช่แน่นอน แต่ฉันจะกำหนดลำดับของ 'back to front' ได้อย่างไร?
pimvdb

1
วัตถุสามเหลี่ยมหรือจุดยอดทั้งหมดของคุณจะอยู่ห่างจากกล้องเมื่อคุณเริ่มวาด การใช้อัลกอริธึมพื้นฐาน (คุณได้รับการยอมแพ้แล้วหรือไม่) จะต้องกำหนดระยะห่างจากกล้องสำหรับแต่ละสามเหลี่ยมและวาดตามลำดับให้อยู่ใกล้ที่สุด หลังจากที่เสร็จสิ้นคุณจะต้องเริ่มมองหาทางแยกและตัดขึ้นรูปสามเหลี่ยมของคุณซึ่งเป็นเกมบอลที่แตกต่างกันทั้ง ทำไมคุณถึงใช้ Z-Buffer ไม่ได้? : P
Jonathan Connell

@ 3nixios: คุณถูกต้องทั้งหมด แต่ปัญหาที่ฉันกำลังเผชิญคือการคำนวณระยะทาง ตามที่ระบุไว้ฉันได้ลองใช้วิธีการทางไกลหลายวิธี แต่มันไม่สมบูรณ์แบบ นี้ส่งผลให้การสั่งซื้อจากระยะจุดกึ่งกลางเรียงลำดับ: i.imgur.com/AcfCm.png
pimvdb

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

คำตอบ:


14

โดยปกติระยะห่างของจุดกึ่งกลางของรูปหลายเหลี่ยมที่กล้องใช้ในการจัดเรียง z อัลกอริทึมของจิตรกรไม่สามารถแม่นยำได้ 100% โดยเป็นธรรมชาติ จะมีหลายกรณีที่การเรียงลำดับจะล้มเหลวไม่ว่าคุณจะใช้จุดอ้างอิงใด

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

พบไฟล์ Powerpointนี้ที่แสดงปัญหาได้อย่างดี ( เวอร์ชั่น PDF )


ขอบคุณสำหรับ Powerpoint นั้นช่วยฉันแก้ปัญหาได้
pimvdb

ลิงก์เสีย ใครสามารถหาสำเนาได้บ้าง
Keavon

1
@Keavon แก้ไขแล้ว ฉันพบลิงค์ที่ใช้งานได้สำหรับไฟล์
bummzack

1

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

โปรดทราบว่าการทดสอบเพื่อกำหนดด้านข้างของการจัดวางกล้องเทียบกับรูปหลายเหลี่ยมและการข้ามผ่านของ bsp-tree นั้นแตกต่างกันเล็กน้อยเมื่อจัดการกับการฉายภาพแบบออโทกราฟและมุมมอง

หากคุณไม่สามารถแยกรูปหลายเหลี่ยมเข้าได้ฉันคิดว่าคุณโชคไม่ดี

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