ทำไมเอ็นจิ้นเกมจึงแปลงแบบจำลองเป็นรูปสามเหลี่ยมแทนที่จะใช้สี่คน


47

ฉันเคยทำงานกับมายาสำหรับแอนิเมชั่นและโครงการที่เน้นภาพยนตร์มากกว่า แต่ฉันก็มุ่งเน้นไปที่การศึกษาของฉันในการพัฒนาวิดีโอเกม อย่างไรก็ตามฉันได้พูดคุยกับหนึ่งในอาจารย์ของฉันและเราไม่สามารถเข้าใจได้ว่าทำไมเครื่องมือเกมทั้งหมด (ที่ฉันรู้) แปลงเป็นรูปสามเหลี่ยม

ทุกคนรู้ว่าทำไมเอ็นจิ้นเกมเปลี่ยนเป็นรูปสามเหลี่ยมเมื่อเทียบกับการวางโมเดลเป็นรูปหลายเหลี่ยมสี่ด้าน? ข้อดีและข้อเสียของการทำเช่นนี้มีอะไรบ้าง


1
ค่อนข้างเกี่ยวข้องกับ NVidia NV1 ใช้การทำแผนที่พื้นผิวรูปสี่เหลี่ยมจตุรัส (ซึ่งใช้สี่คน) แทนที่จะเป็นรูปสามเหลี่ยม / รูปหลายเหลี่ยม มันไม่ได้เป็นเรื่องใหญ่ที่จะพูดน้อย ดูen.wikipedia.org/wiki/NV1
Macke

5
@Macke: สมการกำลังสองใน "สมการกำลังสอง" ไม่เป็นกำลังสองในขณะที่ "รูปสี่เหลี่ยม" มันไม่ได้ใช้สี่คน แต่เป็นเส้นโค้งกำลังสองที่กำหนดโดย 9 คะแนน stason.org/TULARC/pc/3d-graphics-cards-faq/…

9
+1 สำหรับคำถามของคุณ แต่มีค่ามากสำหรับศาสตราจารย์ของคุณ นี่เป็นสิ่งพื้นฐานที่เขาควรจะรู้จักและเขารู้หลังมือของเขาเองและเป็นสัญญาณว่าเขาไม่ได้สัมผัสกับพัฒนาการในช่วง 15 ปีที่ผ่านมา
Maximus Minimus

1
ในการป้องกันของอาจารย์ของฉันเขาไม่ได้อยู่ในด้านการพัฒนาเกม แต่เขาก็เป็นนักเคลื่อนไหว / ผู้สร้างโมเดลมากกว่า เขารู้ว่ามันเปลี่ยนเป็นทริสเรทติ้ง แต่ไม่รู้เหตุผลทางคณิตศาสตร์ว่าทำไมต้องเรนเดอร์ แต่ใช่ว่าเขาน่าจะรู้
อนุญาต

คำตอบ:


56

บรรทัดล่างคือ Triangle Rasterization ซึ่งเป็นวิธีที่คอมพิวเตอร์แสดงวัตถุบนหน้าจอ แม้ว่าคนอื่นจะพูดอย่างละเอียดมากกว่าฉัน:

วัตถุ 3 มิติทั้งหมดที่เราเห็นบนหน้าจอคอมพิวเตอร์นั้นจริง ๆ แล้วทำจากวัตถุเรขาคณิตเล็ก ๆ น้อย ๆ ที่มักจะเรียกว่าดั้งเดิม Quadrilaterals, triangles, n-gons เป็นต้นเป็นตัวอย่างของการใช้แบบดั้งเดิม เราจะจดจ่อกับรูปสามเหลี่ยมส่วนใหญ่เนื่องจากเหตุผลหลักหนึ่งข้อ: วัตถุทุกชิ้นสามารถแยกออกเป็นรูปสามเหลี่ยมได้ แต่รูปสามเหลี่ยมไม่สามารถแยกออกเป็นส่วนอื่นได้นอกจากรูปสามเหลี่ยม ด้วยเหตุนี้การวาดรูปสามเหลี่ยมจึงง่ายกว่าการวาดรูปหลายเหลี่ยมที่มีลำดับสูงกว่า สิ่งที่น้อยกว่าที่จะจัดการกับ นี่คือเหตุผลที่สามเหลี่ยมเหล่านั้นถูกใช้โดยทั่วไปในคอมพิวเตอร์กราฟิก

เน้นการขุด ที่มา: http://www.devmaster.net/articles/software-rendering/part3.php


2
! น่ากลัว นั่นทำให้รู้สึกมากเมื่อคุณคิดเกี่ยวกับมัน ขอบคุณสำหรับคำตอบ!
แกรนท์

1
ใน OpenGL ES ซึ่งเป็นส่วนหนึ่งของความพยายามในการทำให้ API ที่ง่ายขึ้น Quads และรูปหลายเหลี่ยมไม่ได้รับการสนับสนุน ดังนั้นเหตุผลที่เป็นประโยชน์ในการใช้รูปสามเหลี่ยมก็เพราะคุณไม่มีทางเลือกอื่น แต่เหตุผลที่ API ที่มีความคล่องตัวเช่น ES หลีกเลี่ยงประเภทดั้งเดิมอื่น ๆ นั้นเป็นเพราะเหตุผลที่อธิบายไว้ในคำตอบนี้และคำตอบอื่น ๆ
Suboptimus

5
+1 เพราะเป็นคำตอบที่ฉันสามารถใช้เป็นข้อมูลอ้างอิงได้อย่างปลอดภัยเมื่อมีคนถามฉันแบบเดียวกันกับบุ๊กมาร์กของฉัน เพียงบอกว่าฉันมักจะคิดว่าเหตุผลที่สามเหลี่ยมมีขนาดเล็กที่สุดที่เป็นไปได้เพราะด้วยความไม่แน่นอนของเลขคณิตจุดลอยทริสเป็นรูปหลายเหลี่ยมที่ปลอดภัยเท่านั้นที่คุณสามารถรับประกันได้ว่าจะเป็นภาพถ่ายในทุกกรณี ระนาบตลอดเวลา ซอฟต์แวร์การสร้างแบบจำลองอาจแสดงวัตถุเป็น quads หรือ n-gons เพื่อความสะดวกในการสร้างโมเดล แต่ใช้การแปลง / การเรนเดอร์การแบ่งรูปหลายเหลี่ยมเป็นรูปสามเหลี่ยมสองรูปหรือมากกว่า
Hatoru Hansou

56

สามเหลี่ยมมีคุณสมบัติมากมายที่ทำให้การวาดง่ายขึ้นและเร็วขึ้น

สี่จุดขึ้นไปอาจไม่ได้อยู่ในระนาบเดียวกัน แต่มีสามจุดเสมอ (ไม่สนใจเคสที่เสื่อมสภาพ) นี่เป็นคุณสมบัติที่น่าสนใจที่ค่าสเกลาร์จะแปรผันเป็นเส้นตรงบนพื้นผิวของรูปสามเหลี่ยม แม้เมื่อสามเหลี่ยมถูกฉายบนหน้าจอค่าสเกลาร์ยังคงแปรผันตามเส้นตรงของ x '/ z และ y' / z

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

tl; dr: รูปสามเหลี่ยมเป็นรูปแบบดั้งเดิมที่ง่ายที่สุดดังนั้นอัลกอริธึมที่เกี่ยวข้องกับรูปสามเหลี่ยมจึงสามารถปรับให้เหมาะสมอย่างมาก


11
+1 ฉันคิดว่าความจริงที่ว่าสามเหลี่ยมเป็นระนาบเสมอเป็นหนึ่งในเหตุผลหลัก รูปหลายเหลี่ยมที่ไม่ใช่ระนาบทำให้สิ่งซับซ้อนมากขึ้น
bummzack

2
+1 ฉันคิดว่าสามเหลี่ยมเป็นรูปหลายเหลี่ยมเพียงอย่างเดียวที่คุณสามารถรับประกันได้ว่าเป็นภาพถ่ายระนาบคือเหตุผลทางเทคนิคหลักในการทำ apis และฮาร์ดแวร์ที่ต้องใช้รูปสามเหลี่ยม ซอฟต์แวร์การสร้างแบบจำลองอาจแสดงตาข่ายเป็นสี่แถวเพื่อความสะดวกในการสร้างแบบจำลอง
Hatoru Hansou

1
การเปรียบเทียบแบบไม่ใช้ระนาบที่ดีฉันใช้ ... อุจจาระสามขาสามารถยืนบนพื้นได้เพียงทางเดียวเท้าของมันเหมือนมุมของรูปสามเหลี่ยม แต่อุจจาระสี่ขาสามารถยืนบนพื้นได้สองวิธีและโยกเยกจากตำแหน่งหนึ่งไปอีกตำแหน่งหนึ่งถ้าขาข้างหนึ่งสั้นกว่าขาอื่น
ChrisC

ฉันอยากรู้ เป็นไปได้อย่างไรที่สามเหลี่ยมมีจุดบนระนาบเดียวกันเสมอ? คุณจะวาดทรงกลมจริงๆได้อย่างไร? อย่างน้อยหนึ่งจุดต้องแปลบนระนาบอื่นมิฉะนั้นคุณจะได้พื้นผิวเรียบ
rataplan

@newbiez จุดสุดยอดสามจุดจะกำหนดระนาบเดียวเสมอ ทรงกลมทำจากสามเหลี่ยมต่างกัน สามเหลี่ยมที่อยู่ติดกันสองอันซึ่งเป็นตัวแทนของพื้นผิวของทรงกลมแบ่งเป็นสองจุดยอด แต่มันไม่ได้อยู่บนระนาบเดียวกัน ภาพนี้อาจทำให้สิ่งต่าง ๆ ชัดเจนขึ้น: cse.csusb.edu/tongyu/courses/cs420/images/icos.jpg
ggambett

8

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


2
ในความเป็นจริง 4 คะแนนแบบสุ่มมีแนวโน้มที่จะไม่ได้อยู่บนเครื่องบินดังนั้นคุณจะต้องวิเคราะห์สามเหลี่ยม
ChrisF

นี่เป็นเรื่องจริงเฉพาะในกรณีที่คะแนนไม่ตรงกัน
notlesh

1
แม้ว่าจุดต่าง ๆ จะตรงกัน แต่ก็เป็น coplanar กับจำนวนอนันต์ของเครื่องบิน
3

เป็นระนาบเดียวกันไม่ได้“เสมอกำหนดระนาบแบน”
sam hocevar

6

ไม่ใช่ "เกมเอ็นจิ้น" ที่ทำสิ่งนี้ - ซอฟต์แวร์ 3D ทั้งหมดที่คุณใช้ทำสิ่งนี้ มันไม่ได้บอกคุณเกี่ยวกับเรื่องนี้และอาจารย์ของคุณก็ดูมีคุณสมบัติไม่ดีพอหากเขาไม่รู้สิ่งนี้ มีอยู่ในหน่วยความจำของคอมพิวเตอร์แม้ว่าซอฟต์แวร์จะซ่อนจากคุณ โปรแกรม 3D ทั้งหมดมีตัวเลือกที่จะทำให้สามเหลี่ยมนั้นปรากฏ พวกเขาจะมีตัวเลือกที่แยกพวกมันออกเป็นขอบที่แก้ไขได้เพื่อให้คุณสามารถเล่นกับพวกเขาได้ แต่พวกเขาอยู่ที่นั่นเสมอเพื่อเริ่มต้นและมันไร้เดียงสาของคุณศาสตราจารย์ที่จะสอนเรื่องนี้และยังคงสงสัยว่า "สามเหลี่ยมอะไรสำหรับ"

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


3

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

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

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

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

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

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

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


2

มีเพียงวิธีเดียวในการหาสามเหลี่ยมสามเหลี่ยมกับวิธี 'n - 2' สำหรับรูปหลายเหลี่ยมด้าน n ดังนั้นสามเหลี่ยมในที่สุดจึงเป็นวิธีที่คลุมเครือน้อยที่สุดในการกำหนดรูปทรงหลายเหลี่ยม นอกจากนี้ตามที่ผู้โพสต์คนอื่น ๆ ระบุไว้มีหลายวิธีในการเร่งสามเหลี่ยม (แทนที่จะเป็นสี่เหลี่ยมจัตุรัสหรือสูงกว่า) การแรสเตอร์แบบนิ่ง (ค่าคงที่ z เป็นหนึ่งในรายการโปรดของฉัน) นอกจากนี้ยังง่ายต่อการปรับการทดสอบการตัดกันของรูปสามเหลี่ยมรังสีให้ง่ายกว่าการทดสอบจุดตัดรูปหลายเหลี่ยมแบบเรย์โดยพลการ ในความเป็นจริงการดำเนินการหลายอย่างในรูปหลายเหลี่ยมด้าน n ได้ประโยชน์จากการมีรูปสามเหลี่ยมแทนมือ ไม่ได้หมายความว่ารูปหลายเหลี่ยมด้าน n นั้นไม่ดี - มันมีประโยชน์มาก แต่ในที่สุดคุณจะต้องใช้สามเหลี่ยมในการปฏิบัติการตาข่ายหลายแบบ


2

ตราบใดที่รูปสามเหลี่ยมถูกกำหนดโดยจุดยอดที่ไม่ใช่ colinear สามจุด (อ่าน: ไม่มีมุมใดที่ตรงกับ Pi) จากนั้นจุดยอดจะกำหนดระนาบที่ไม่ซ้ำกัน

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

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

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

อะไรในโลกที่จะเป็นจุดร่วมทำงานกับคณะสี่คน

หากคุณต้องการรูปสี่เหลี่ยมใส่สามเหลี่ยมสองรูปเข้าด้วยกัน


2

หากเราคิดว่าการได้รับ 4 คะแนนจากการเป็นระนาบร่วมนั้นไม่ใช่ปัญหา (เป็นอย่างที่คนอื่น ๆ ชี้ แต่ทนกับฉัน) จากนั้นคุณจะพบว่าการสร้างรูปสี่เหลี่ยมคางหมูแบบสุ่ม (ซึ่งเป็นรูปสี่เหลี่ยมขนมเปียกปูนมักจะดูเหมือน เมื่อเปลี่ยนเป็นพื้นที่หน้าจอ) ไม่แตกต่างจากการเรนเดอร์รูปสามเหลี่ยมจริง ๆ แล้วมันจะออกมาเหมือนกันมากเมื่อคุณทำการเล็มภาพเนื่องจากสามารถแนะนำจุดยอดพิเศษได้ (อย่างน้อยในรุ่นซอฟต์แวร์ - ฮาร์ดแวร์อาจมีวิธีบังคับแบบเดรัจฉานที่เรียบง่ายกว่าในการคลิป)

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

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