กราฟิกการ์ดทำอะไรกับองค์ประกอบที่สี่ของเวกเตอร์เป็นตำแหน่งสุดท้าย


25

จากคำถามนี้ปรากฏว่าคุณต้องการเวกเตอร์ตำแหน่งสี่องค์ประกอบเนื่องจากง่ายต่อการแก้ไขตำแหน่งด้วยการคูณเมทริกซ์

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

ความสำคัญขององค์ประกอบที่สี่คืออะไรเมื่ออยู่ใน rasterizer?

แก้ไข : ในการตรวจสอบคำถามนี้เป็นคำที่ค่อนข้างต่ำ; มันจะแม่นยำมากขึ้นสำหรับย่อหน้าที่สองที่จะพูดว่า: "ถ้าค่าขององค์ประกอบที่สี่ไม่อยู่ในช่วงที่กำหนดมันจะไม่แสดงผล 'ถูกต้อง' / 'ตามที่คาดหวัง'"


vector4 ที่มีพิกัดไม่ (x, y, z, 0.5) ให้ผลลัพธ์เดียวกันของ vector4 ที่มีพิกัด (2x, 2y, 2z, 1) หรือไม่
FxIII

@FxIII ฉันไม่สามารถทำซ้ำได้อย่างแน่นอน แต่คุณพูดถูกที่เป็นคำสั่งแบบครอบคลุมที่ไม่ถูกต้องในโพสต์ดั้งเดิมของฉันหลังจากการทดลองเพิ่มเติมฉันได้อัปเดต
sebf

คำตอบ:


23

องค์ประกอบที่สี่เป็นกลอุบายในการติดตามมุมมอง เมื่อคุณฉายภาพเปอร์สเปคทีฟคุณต้องการหารด้วย z: x '= x / z, y' = y / z แต่นี่ไม่ใช่การดำเนินการที่สามารถใช้งานได้โดยเมทริกซ์ 3x3 บนเวกเตอร์ของ x y, z เคล็ดลับที่กลายเป็นมาตรฐานสำหรับการทำเช่นนี้คือการผนวกพิกัดที่สี่, w และประกาศว่า x, y, z จะถูกหารด้วย w เสมอหลังจากการแปลงทั้งหมดถูกนำไปใช้และก่อนการทำให้เป็นแรสเตอร์

การฉายภาพมุมมองนั้นสำเร็จได้โดยมีเมทริกซ์ที่ย้าย z ไปเป็น w ดังนั้นคุณจึงต้องหารด้วย z แต่ยังช่วยให้คุณมีความยืดหยุ่นในการออกจาก w = 1.0 หากคุณไม่ต้องการหาร ตัวอย่างเช่นหากคุณต้องการฉายภาพแบบขนานหรือหมุนหรืออะไรก็ตาม

ความสามารถในการเข้ารหัสตำแหน่งเป็น w = 1, เส้นทางเป็น w = 0 และใช้แถว / คอลัมน์ที่สี่ของเมทริกซ์สำหรับการแปลเป็นประโยชน์ด้านดี แต่ไม่ใช่เหตุผลหลักสำหรับการผนวก w เราสามารถใช้การแปลงเลียนแบบ (เมทริกซ์ 3x3 บวกเวกเตอร์การแปล 3 องค์ประกอบ) เพื่อให้การแปลสำเร็จโดยไม่ต้องมองเห็นใด ๆ (หนึ่งจะต้องติดตามตำแหน่งและทิศทางและใช้ฟังก์ชั่นการเปลี่ยนแปลงที่แตกต่างกันไปในแต่ละอันนั้นค่อนข้างไม่สะดวก แต่ไม่ใช่เรื่องใหญ่เลย)

(BTW, คณิตศาสตร์, เวกเตอร์ที่เติมด้วย w เป็นที่รู้จักกันว่าพิกัดที่เป็นเนื้อเดียวกันและพวกมันอาศัยอยู่ในสถานที่ที่เรียกว่าprojective spaceอย่างไรก็ตามคุณไม่จำเป็นต้องเข้าใจคณิตศาสตร์ที่สูงขึ้นในการทำกราฟิก 3 มิติ)


อีกครั้งไม่ถูกต้องเล็กน้อยที่จะพูดคุยเกี่ยวกับเวกเตอร์และจุดในข้อตกลงเหล่านั้นเนื่องจากมีมอร์ฟิซึ่มส์ระหว่างจุดและเวกเตอร์ (จุดและเวกเตอร์ที่ย้ายต้นกำเนิดไปยังจุดนั้นเป็นนิติบุคคลเดียวกัน) จะถูกต้องมากขึ้นในการพูดคุยเกี่ยวกับจุด / เวกเตอร์ (w! = 0) และ (projective) ทิศทาง (w = 0) อย่างไรก็ตามการใช้คำว่า "vector" ในทางที่ผิดนั้นเป็นมาตรฐานที่ค่อนข้างรวมในภาษาของไลบรารี 3 มิติ
FxIII

@FxIII: แก้ไขแล้ว มันสับสนที่จะใช้ "เวกเตอร์" ในแง่คณิตศาสตร์มาตรฐานและเป็นคำพ้องสำหรับ "ทิศทาง" ในการโพสต์เดียวกัน
Nicol Bolas

@FxIII และ Nicol Bolas: ฉันไม่เห็นด้วย คุณเข้ารหัสเวกเตอร์จริงๆในฐานะ w = 0 - รวมทั้งเวกเตอร์ที่เพิ่งแสดงทิศทางและเวกเตอร์จริงที่ความยาวมีความสำคัญ ตัวอย่างเช่นคุณสามารถแปลงเวกเตอร์ความเร็วเชิงมุม (ทิศทาง = แกนหมุน, ความยาว = ความเร็ว) ของวัตถุระหว่างอวกาศท้องถิ่นและพื้นที่โลกโดยใช้เมทริกซ์ของวัตถุ คุณไม่ต้องการให้ความเร็วเชิงมุมเพิ่มการแปลของวัตถุลงไป คุณแค่อยากให้มันหมุน ดังนั้นคุณจึงตั้งค่า w = 0 ฉันไม่เห็นปัญหาหรือไม่
นาธานรีด

@NathanReed ฉันหวังว่าโพสต์ของฉันจะช่วยชี้แจงจุดนั้นส่วนใหญ่ของจุดของฉันอยู่ที่คำจำกัดความและการใช้เวกเตอร์คำในทางที่ผิดบวกกับความเป็นอันดับหนึ่งของพีชคณิตเชิงเส้นมากกว่าคำศัพท์ห้องสมุดมาตรฐาน 3 มิติ แน่นอนทั้งสองเป็นที่ถกเถียงกันเป็นทุกความหมายและการเรียกร้องความเป็นอันดับหนึ่งคือ
FxIII

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

10

พยายามตอบความคิดเห็นที่เหมาะสมของ Natan ฉันได้พิจารณาบางอย่างที่มีประโยชน์ในการเข้าใจสิ่งที่เกิดขึ้นจริง ๆ เมื่อคุณใช้เวกเตอร์ใน Affine Space เพื่อเป็นตัวแทนของเวกเตอร์ 3 มิติในอวกาศ Euclidean มาตรฐาน

ก่อนอื่นฉันจะเรียกเวกเตอร์ว่าอะไรก็ตามที่มีพิกัดดังนั้นจุดและเวกเตอร์นั้นเป็นเอนทิตีเดียวกัน คุณสามารถเห็นเวกเตอร์เป็นจุดแตกต่างของสองจุด: V = B - A ; Vย้าย ในBเพราะ+ V = + B - = B ใส่A = 0 (ต้นกำเนิด) แล้วคุณจะได้V = B - 0 = B : จุดBและเวกเตอร์ที่เคลื่อนที่0ถึงBเป็นสิ่งเดียวกัน

ฉันจะเรียกว่า"เวกเตอร์" - ในแง่ที่ใช้ในห้องสมุด 3D ส่วนใหญ่ - เมื่อเวกเตอร์ของพื้นที่เลียนแบบมี w = 0

เมทริกซ์ถูกนำมาใช้เพราะพวกมันอนุญาตให้คุณแสดงฟังก์ชันเชิงเส้นในรูปแบบกะทัดรัด / สวยงาม / มีประสิทธิภาพ แต่ฟังก์ชันเชิงเส้นมีข้อเสียที่สำคัญที่ไม่สามารถเปลี่ยนแหล่งกำเนิด: F ( 0 ) = 0ถ้า F ต้องการเป็นเชิงเส้น ( amog สิ่งอื่น ๆ เช่น F (λ X ) = λF ( X ) และ F ( A + B ) = F ( A ) + F ( B ))

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

The Affine Space เป็นพื้นที่โปรเจคในแง่ที่คุณสามารถสร้างความสัมพันธ์ที่เท่าเทียมกันระหว่างเวกเตอร์ Affine และ Euclidean เพื่อที่คุณจะได้สร้างความสับสนให้พวกเขา เวกเตอร์เลียนแบบทั้งหมดที่ทำโครงการไปยังแหล่งกำเนิดที่มีทิศทางเดียวกันสามารถมองเห็นได้เป็นเวกเตอร์แบบยุคลิดแบบเดียวกัน

นี่หมายความว่าเวกเตอร์ทั้งหมดที่มีสัดส่วนเท่ากันในพิกัดนั้นสามารถพิจารณาได้ว่าเทียบเท่ากัน:

ศาสตร์:

สมดุล

นั่นคือเวกเตอร์เลียนแบบทุกตัวสามารถลดลงเป็นรุ่นแคนนอนโดยที่ w = 1 (เราเลือกเวกเตอร์ที่เทียบเท่ากันหนึ่งอันที่เราชอบมากที่สุด)

มองเห็น (euclidean 2D - เลียนแบบ 3D):

ภาพที่เท่ากัน

ดังนั้นค่าเฉลี่ยของพื้นที่"projective" ; คุณควรสังเกตว่าที่นี่พื้นที่ยูคลิดคือ 2D (ภูมิภาคสีฟ้า)

มีเวกเตอร์เลียนแบบชุดหนึ่งที่ไม่สามารถใส่ในเวอร์ชันมาตรฐาน (อย่างง่ายดาย) ชุดที่อยู่บนระนาบ (ไฮเปอร์) w = 0

เราสามารถแสดงให้เห็นด้วยตา:

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

สิ่งที่คุณควรเห็นในขณะที่ w -> 0 จากนั้นเวกเตอร์ที่คาดการณ์ไว้ในปริภูมิแบบยุคลิดจะไปที่อนันต์ แต่ไปถึงอนันต์ในทิศทางใดทิศทางหนึ่ง

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

นี่คือเหตุผลที่คุณสามารถรวมเฉพาะ "คะแนน" เป็น "เวกเตอร์" เพราะ "เวกเตอร์" จะไม่เปลี่ยนพิกัด w ของ "จุด" ซึ่งเป็นจริงเฉพาะสำหรับ"คะแนน"โดยที่ w = 1:

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

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

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

กล่าวว่าค่อนข้างสมเหตุสมผลที่จะคิดว่า GPU สันนิษฐานว่าVector4ต้องมี w = 0 หรือ w = 1 เว้นแต่คุณจะรู้ว่าคุณกำลังทำอะไรอยู่


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

+1 สำหรับคำอธิบายที่ดี (และไดอะแกรม!) ของพื้นที่โปรเจค อย่างไรก็ตามเลียนแบบพื้นที่และพื้นที่ฉายภาพไม่เหมือนกัน (ดูคำจำกัดความ Wikipediaของเลียนแบบพื้นที่) อาจเป็นวิธีที่ดีในการพูดแบบนี้: projective 3-space และ affine 3-space สามารถฝังอยู่ใน R ^ 4 ได้ แต่งานแต่งงานนั้นไม่สอดคล้องกันทั้งหมด การเข้ารหัสเวกเตอร์จาก affine space เนื่องจาก w = 0 เป็นไปได้และมีประโยชน์ แต่ไม่มีความหมายจากมุมมองของ projective ทิศทางของ projective (จุดที่ไม่มีที่สิ้นสุด) ก็ไม่ได้มีความหมายจากมุมมองเลียนแบบ
นาธานรีด

1

สมมติเวกเตอร์ที่ชอบ (x, y, z, w) เวกเตอร์นี้มี 4 องค์ประกอบ x (x พิกัดในอวกาศ), y (y พิกัดในอวกาศ), z (z พิกัดในอวกาศ) และองค์ประกอบ w ที่น่าสนใจและลึกลับ ที่จริงแล้วเกม 3 มิติส่วนใหญ่ทำงานในพื้นที่ 4d หรือที่เรียกอีกอย่างว่าพื้นที่ 4d เป็นเนื้อเดียวกัน มีประโยชน์ชัดเจนบางประการ ->

1> มันช่วยเราในการรวมเมทริกซ์ของการแปลและการหมุนเป็นหนึ่ง แต่คุณอาจคิดว่าการใช้มันคืออะไรเราสามารถคูณเมทริกซ์การหมุนและนั่นคือมัน แต่มันไม่มีอะไรมากไปถ้าเราไม่มี ส่วนประกอบในเวกเตอร์ทุกตัวของเราจากนั้นเมื่อเราคูณ 3d เวกเตอร์ (xyz) เข้ากับเมทริกซ์รวมของการแปลและการหมุนไม่ว่าด้วยวิธีใดเราจะทำการปรับค่าโดยไม่รู้ตัวด้วย x, y หรือ z (นั่นคือวิธีคูณเมทริกซ์) อาจทำให้เมทริกซ์ตำแหน่งเสียหาย (ส่วนการแปลของเมทริกซ์รวม) เนื่องจากการปรับขนาดเมื่อต้องการแก้ไขปัญหานี้แนะนำเวกเตอร์องค์ประกอบที่ 4 และส่วนประกอบของเวกเตอร์ (w) นี้จะถือค่า 1.0 ใน 99% ของเคสส่วนประกอบที่ 4 นี้ทำให้เรา เพื่อให้มีค่าตำแหน่งที่ไม่มีการลดขนาด (การแปล) เมทริกซ์แสดงเป็น ->

 [x y z w] [rx1 rx2 rx3 1]
           [ry1 ry2 ry3 1]
           [rz1 rz2 rz3 1]
           [px  py  pz  1]

แล้วเราก็มีเมทริกซ์ที่เรียบง่าย แต่ทรงพลัง :)

2> เราคัดลอกค่า z ลงในองค์ประกอบ w ในระยะการฉายภาพเปอร์สเปคทีฟแล้วหาร x, y ด้วยวิธีนี้วัตถุจะสั้นลงเมื่อพวกมันเคลื่อนที่ออกจากหน้าจอ


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