ทำไมพื้นที่คลิปใน OpenGL มี 4 มิติ


13

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

const float vertexPositions[] = {
    0.75f, 0.75f, 0.0f, 1.0f,
    0.75f, -0.75f, 0.0f, 1.0f,
    -0.75f, -0.75f, 0.0f, 1.0f,
};

ในหนังสือออนไลน์เล่มนี้มีตัวอย่างเกี่ยวกับวิธีการวาดสวัสดีชาวโลกคนแรกและคนคลาสสิกสำหรับ OpenGL เกี่ยวกับการสร้างรูปสามเหลี่ยม

โครงสร้างจุดสุดยอดสำหรับสามเหลี่ยมถูกประกาศตามที่ระบุในรหัสข้างต้น

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

ที่นี่ฉันมีคำถามของฉัน:

  • ฉันนึกภาพออกไม่ได้ใน 4D ฉันไม่คิดว่ามนุษย์จะทำอย่างนั้นได้ 4D คืออะไรสำหรับพื้นที่คลิปนี้
  • เอกสารที่มนุษย์อ่านได้มากที่สุดที่ฉันได้อ่านพูดเกี่ยวกับกล้องซึ่งเป็นเพียงนามธรรมของแนวคิดการตัดและฉันเข้าใจว่าปัญหาคือทำไมไม่ใช้แนวคิดของกล้องตั้งแต่แรก โครงสร้าง 3 มิติที่คุ้นเคย? ปัญหาเดียวของคอนเซปต์ของกล้องคือคุณต้องกำหนดผู้ที่คาดหวังในทางอื่นดังนั้นคุณต้องเพิ่มคำแถลงเกี่ยวกับประเภทของกล้องที่คุณต้องการ
  • ฉันควรจะอ่านสิ่งนี้0.75f, 0.75f, 0.0f, 1.0fอย่างไร ทั้งหมดที่ฉันได้รับคือพวกมันคือค่าลอยตัวทั้งหมดและฉันได้ความหมายของ 3 ค่าแรกมันหมายความว่าอะไรสุดท้าย

4
บทที่ 4 อธิบายสิ่งที่องค์ประกอบที่สี่ทำ จริง ๆ แล้วเกาว่า; บทที่ 1 อธิบายคลิปการ NDC เปลี่ยนในส่วนแรสเตอร์ลงครึ่งหนึ่ง
Nicol Bolas

2
@NicolBolas ผู้เขียนให้คำอธิบายของเขาในบทแรกและไม่ได้อ้างอิงใด ๆ สำหรับบทต่อไปนอกจากนี้เขายังอ้างว่าจะอธิบายสิ่งที่เกิดขึ้นต่อไปเมื่อแสดงความคิดเห็นรหัส c ++ บางส่วนและปัญหาคือถ้าเขาไม่อธิบายทุกอย่างครบถ้วนใน ตอนที่ 1 ไม่สมเหตุสมผลเลยที่จะใส่สิ่งที่ฉันควรจะรู้ในตอนแรกในบทที่ 4 โดยเฉพาะอย่างยิ่งถ้าฉันต้องการแนวคิดนี้เพื่อถอดรหัสสิ่งที่อยู่ในบทที่ 1 ฉันอ่านตอนนี้และไม่ใช่แค่ 1 ครั้งตอนนี้ฉันรู้ว่าฉันควรจะมองหาคำตอบเพิ่มเติมฉันจะไปตามบทต่าง ๆ
user827992

1
คุณไม่จำเป็นต้องถอดรหัสอะไรเลย มันบอกว่าในบทที่ 1: องค์ประกอบ W แบ่งออกเป็น 3 องค์ประกอบอื่น ๆ ซึ่งระบุไว้ในการแนะนำเช่นกัน สิ่งที่เลื่อนออกไปจนกระทั่งบทที่ 4 คือสาเหตุที่ OpenGL ทำเช่นนี้ ถูกระงับจนกว่าจะถึงเวลาต่อมาเนื่องจากไม่เกี่ยวข้องกับงานในมือ
Nicol Bolas

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

1
คำตอบนี้อาจช่วยได้
iammilind

คำตอบ:


9

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


10

อ่านบทนำของหนังสือที่คุณอ่านคุณจะประหลาดใจ;)

http://arcsynthesis.org/gltut/Basics/Intro%20Graphics%20and%20Rendering.htmlภายใต้ภาพรวม Rasterization

ค่า "w" (โดยที่ 3 ค่าแรกคือ x, y และ z) โดยทั่วไปบอกว่าขนาดของพื้นที่คลิปคืออะไร เนื่องจากนี่คือค่าสเกลาร์ 1 ค่าทั้ง 3 มิติของพื้นที่คลิปมีค่าเท่ากัน (และนั่นคือสาเหตุที่พื้นที่คลิปเป็นลูกบาศก์) จุดสุดยอดทุกคนมีที่ว่างในคลิปของมันเอง (และโดยทั่วไปจำเป็นต้อง "พอดี" มิฉะนั้น CLIPS: D) ไม่มี "โลก" 1 อันที่เป็นพื้นที่คลิป (แม้ว่าพื้นที่คลิปทั้งหมดจะเหมือนกัน " โลก "ฉันคิดว่าแม้ฉันจะมีปัญหากับเรื่องนี้; P)

ดังนั้นถ้าจุดสุดยอดของคุณมีตัวอย่างเช่นพิกัด [1,1,1] ถ้าพื้นที่คลิปเป็น 1 แล้วจุดยอดอยู่ที่มุมบนขวาใกล้มุมของหน้าจอ (เมื่อทุกค่าเริ่มต้นฉันไม่รู้ว่าทิศทาง สามารถเปลี่ยนแปลงได้) แต่ถ้าจุดยอดมีพื้นที่คลิป 2 แล้วพิกัด [1,1,1] จะอยู่ที่ไหนสักแห่งสมมติว่า 3 ในสี่ของหน้าจอไปทางขวา 3 ในสี่ของหน้าจอไปด้านบนและมิติที่สามที่คุณ สามารถเดาได้เอง

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

x = x / w

y = y / w

z = z / w

และนั่นคือสิ่งที่ทำให้เป็นไปได้ทั้งหมด ฉันคิดว่าเหตุผลนี้มีอยู่เพื่อเปรียบเทียบง่าย หากพิกัดถูกหารด้วยมิติพื้นที่คลิปแล้วพิกัดที่มีส่วนประกอบอย่างน้อย 1 องค์ประกอบที่มีค่าสูงกว่า 1 จะมีอยู่นอกพื้นที่คลิป ดังนั้นถ้าพื้นที่คลิปของคุณสมมุติว่า 1024 แต่พิกัดคือ [2000,3, -100] ดังนั้นองค์ประกอบ x (2000) นั้นอยู่นอกพื้นที่คลิป (ซึ่งมีตั้งแต่ -1024 ถึง 1024)

การคำนวณตามเข็มนาฬิกามันง่ายที่จะบอกว่ามีบางสิ่งบางอย่างอยู่ในพื้นที่คลิปหากสิ่งที่คุณต้องทำคือ (ใส่คร่าวๆ): (x / w) <1 && (x / w)> -1 นอกจากนี้ฉันคิดว่าการมีช่องว่างคลิปของจุดยอดทั้งหมดมีขนาดเท่ากัน (ดังนั้นทุกก้อนพื้นที่คลิปตั้งแต่ -1 ถึง 1 ในทุกมิติ) ทำให้ง่ายขึ้นสำหรับทุกสิ่งที่เกิดขึ้นหลังจากกระบวนการทำให้เป็นมาตรฐาน ลอยตัวตั้งแต่ 0 ถึง 1 (ไม่สนใจสิ่งที่ถูกตัดออก)


คำถามคือทำไมพื้นที่คลิปเป็นตามที่เป็นอยู่ไม่ใช่ความหมายของพื้นที่คลิป นั่นคือสิ่งที่จุดของการหารด้วย W
Nicol Bolas

2
มันตอบคำถามที่ 3 ของ 3 จุด bullet แม้ว่า =)
dammkewl

8

TL; DR ไม่ใช่พื้นที่ 4 มิติเป็น 3 มิติพร้อมหมายเลขปรับซึ่งมักจะเป็น 1 เสมอถ้าเป็น 1 คุณสามารถละเว้นได้และตัวเลขสามตัวแรกคือ x, y, z ถ้าไม่มันจะซับซ้อนมากขึ้น

นี่คือคำอธิบายง่ายๆ จุดยอดในรูปแบบ 3 มิติควรมีสามองค์ประกอบเท่านั้น

⌈x⌉ v = |y| ⌊z⌋

ถ้าเราต้องการจัดการพวกมัน (เช่นการหมุนการปรับสเกล ฯลฯ ) เราใช้เมทริกซ์ ตัวอย่างที่พบบ่อยที่สุดของหลักสูตรคือเมทริกซ์ Model-View-Projection (MVP) ซึ่งแปลงพิกัดโลกให้เป็นพื้นที่คลิป แบบนี้:

⌈m11 m12 m13⌉ ⌈x⌉ c = |m21 m22 m23| * |y| ⌊m31 m32 m33⌋ ⌊z⌋

อย่างไรก็ตามนี่มีข้อบกพร่องใหญ่: คุณไม่สามารถทำการแปลได้ หาก[x,y,z]เป็นศูนย์ไม่ว่าmผลลัพธ์จะเป็นศูนย์เสมอเราจึงไม่มี MVP ที่มีการแปล เห็นได้ชัดว่าเราต้องการ วิธีแก้ปัญหาคือการบวก 1 ไปยังจุดสิ้นสุดของเวกเตอร์ของเราและขยายเมทริกซ์เป็น 4x4:

⌈cx⌉ ⌈m11 m12 m13 tx⌉ ⌈x⌉ |cy| = |m21 m22 m23 ty| * |y| |cz| |m31 m32 m33 tz| |z| ⌊ 1⌋ ⌊ 0 0 0 1⌋ ⌊1⌋

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

⌈cx⌉ ⌈m11 m12 m13⌉ ⌈x⌉ ⌈tx⌉ |cy| = |m21 m22 m23| * |y| + |ty| ⌊cz⌋ ⌊m31 m32 m33⌋ ⌊z⌋ ⌊tz⌋

คอมโพเนนต์ที่ 4 ถูกเรียกwและในขณะที่มันไม่จำเป็นต้องเป็น 1 มันก็เกือบจะเป็น ( ก่อนการแปลงต่อไปอย่างไรก็ตามหลังจากนั้นมันก็มักจะถูกทำให้เป็นเนื้อเดียวกันโดยการหารเวกเตอร์ทั้งหมดด้วยwดังนั้นมันจึงเป็น 1 อีกครั้ง) เป็นแฮ็คที่อนุญาตให้เมทริกซ์การแปลงรวมการแปล

แก้ไข

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


2
อธิบาย downvotes ของคุณ
Timmmm

+1 โดยถือว่าข้อมูลถูกต้องนี่เป็นคำอธิบายที่ดีและเป็นประโยชน์กับฉัน ขอบคุณ
ลุค

1

นอกจากนี้ยังมีอีกเหตุผลหนึ่งที่ฉันเห็นและไม่ได้กล่าวถึงในคำตอบก่อนหน้า

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


คุณเพียง แต่ต้อง "เวกเตอร์ 4d ภายใต้คำจำกัดความดังกล่าว 4x4 เมทริกซ์ไม่ได้มีไว้เพื่อเพิ่มเช่นเดียวกับที่ทุกคนชอบที่จะคิดและอ้างสิทธิ์ให้ผู้อื่น หากสิ่งที่คุณต้องการคือการเพิ่มการแปลหลังจากการหมุน (ไปยังจุด 3 มิติ) คุณแค่กำหนดเมทริกซ์ 4x3 มันมีประสิทธิภาพมากขึ้นถ้านั่นคือทั้งหมดที่คุณมี คุณไม่จำเป็นต้อง จำกัด ตัวเองให้อยู่ในกฎที่สร้างขึ้นมาเพื่อเหตุผลอื่น ๆ โดยรวม lol
Puddle
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.