การสร้างข้อมูลคำนามสามเหลี่ยม


9

เมื่อระบุรายการของดัชนีสามเหลี่ยมเราจะแปลงมันไปยังรายการของดัชนีด้วยการใช้คำคุณศัพท์สำหรับ shader เรขาคณิตได้อย่างไร

โปรดทราบว่าเรากำลังพูดถึงดัชนีที่นี่อย่างเคร่งครัด- มีจุดยอด แต่เราจะมุ่งเน้นไปที่ดัชนีเพียงอย่างเดียวเพราะเราสามารถใช้เพื่อจับคู่จุดยอดที่ซ้ำกันโดยไม่ต้องไปเปรียบเทียบจุดลอยตัวและ epsilons - งานนั้นมี เสร็จเรียบร้อยแล้ว

ฉันรู้ว่าสำหรับสามเหลี่ยมใด ๆ ที่ระบุในรายการดัชนี {0, 1}, {1, 2} และ {2, 0} (หรือ {n, n + 1}, {n + 1, n + 2}, { n + 2, n} หากคุณต้องการ) มันเป็นขอบ รายการดัชนีมีรูปแบบที่ดีและเคารพลำดับการหมุนอย่างถูกต้อง

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

ฉันรู้ว่าในรายการคำคุณศัพท์แต่ละรูปสามเหลี่ยมดั้งเดิมนั้นแทนด้วย 6 ดัชนีดัชนีดั้งเดิมเข้าสู่ช่อง 0, 2, 4; ดัชนีใหม่เพื่อให้ adjacency เสร็จสมบูรณ์เข้าไปในสล็อต 1, 3, 5 ดัชนีที่ทำให้สมบูรณ์สำหรับ edge {0, 1} จะเข้าสู่ slot 1, ดัชนีที่จะทำให้สมบูรณ์สำหรับ edge {1, 2} เข้าไปใน slot 3, index เพื่อให้สมบูรณ์สำหรับขอบ {2, 1} จะเข้าสู่สล็อต 5

ฉันลองทำอะไร

ฉันได้ลองใช้วิธีการเดรัจฉานและใช่ว่ามันจะได้ผล แต่ฉันก็ใช้วิธีที่หรูหรากว่านี้

ฉันลองตัวสร้างรายการขอบของ Eric Lengyel แต่ (1) ดูเหมือนจะไม่เคารพลำดับสามเหลี่ยมดั้งเดิม (2) ดูเหมือนจะไม่เคารพคำสั่งที่คดเคี้ยว (3) มันชัดเจนเหมือนโคลนที่จะไป ถัดไปหลังจากที่คุณสร้างรายการขอบและ (4) ฉันสงสัยรหัสตัวอย่างที่มีข้อผิดพลาดที่เห็นได้ชัดอย่างชัดเจนเช่น "triangleIndex" เทียบกับ "faceIndex" - ผู้เขียนได้รวบรวมรหัสแล้ว ยืนยันหรือไม่

ดังนั้น - ข้อเสนอแนะหรือตัวชี้จากที่นี่หรือไม่


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

คำตอบ:


11

ฉันจะลองใช้ตารางแฮชสำหรับสิ่งนี้ (เช่นstd::unordered_mapถ้าคุณอยู่ใน C ++) สร้างตารางแฮชที่แมปจากครึ่งขอบ (แสดงเป็นคู่ของดัชนีตามลำดับ) ไปยังดัชนีที่สามของสามเหลี่ยมที่เป็นขอบครึ่ง

สิ่งนี้สามารถสร้างได้โดยเพียงแค่วนซ้ำในรายการสามเหลี่ยมและเพิ่มครึ่งสามของสามเหลี่ยมแต่ละสามเหลี่ยมลงในตารางแฮช หากรายการดัชนีเริ่มต้นของคุณมีรูปสามเหลี่ยมที่อยู่ติดกันคู่หนึ่ง (0, 1, 2, 2, 1, 3) คุณจะพบกับตารางแฮชที่ประกอบด้วย:

(0, 1) -> 2
(1, 2) -> 0
(2, 0) -> 1
(2, 1) -> 3
(1, 3) -> 2
(3, 2) -> 1

โปรดทราบว่าขอบ (1, 2) และ (2, 1) ทั้งคู่ปรากฏขึ้นในตารางซึ่งเป็นตัวแทนของขอบทั้งสองด้านและชี้ไปยังจุดสุดยอดที่สามของสามเหลี่ยมสองรูปแต่ละอัน

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


1
เยี่ยมการค้นหาขอบที่มีลำดับตรงข้ามเป็นส่วนสำคัญของข้อมูลที่ขาดหายไป ทำงานแชมป์; +1 และยอมรับ
Maximus Minimus

2

ดูที่โครงสร้างข้อมูลครึ่งขอบ

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

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

ดูเพิ่มเติมบล็อกโพสต์เหล่านี้ ฉันเชื่อว่าโครงสร้างและอัลกอริทึมนั้นอยู่ในการตรวจจับการชนกันแบบเรียลไทม์ แต่ฉันจำไม่ได้แน่นอนและไม่มีสำเนาที่สำนักงาน


-1, ขอโทษ, แต่นั่นไม่ได้ให้ข้อมูลใด ๆ ที่ฉันยังไม่ได้และมุ่งเน้นไปที่การใช้งานบน CPU แทนที่จะสร้างรายการที่มีคำคุณศัพท์เพื่อใช้ใน GS
Maximus Minimus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.