ในการแปลเวคเตอร์ 10 หน่วยในทิศทาง X ทำไมเราต้องใช้เมทริกซ์
เราสามารถเพิ่ม 10 ลงในเสื่อ [0] [0] และเราก็ได้ผลลัพธ์เดียวกัน
ในการแปลเวคเตอร์ 10 หน่วยในทิศทาง X ทำไมเราต้องใช้เมทริกซ์
เราสามารถเพิ่ม 10 ลงในเสื่อ [0] [0] และเราก็ได้ผลลัพธ์เดียวกัน
คำตอบ:
ใช่คุณสามารถเพิ่มเวกเตอร์ในกรณีของการแปล เหตุผลที่ใช้เมทริกซ์เดือดลงเพื่อให้มีวิธีที่เหมือนกันในการจัดการการเปลี่ยนแปลงแบบรวมที่แตกต่างกัน
ตัวอย่างเช่นการหมุนมักจะทำโดยใช้เมทริกซ์ (ตรวจสอบความคิดเห็น @MickLH สำหรับวิธีอื่น ๆ ในการจัดการกับการหมุน) ดังนั้นเพื่อจัดการกับการแปลงหลายครั้ง (การหมุน / การแปล / การปรับขนาด / การฉายภาพ ... ฯลฯ ) ในลักษณะที่สม่ำเสมอ คุณต้องเข้ารหัสพวกมันในเมทริกซ์
ดีกว่าพูดทางเทคนิค การแปลงคือการทำแผนที่จุด / เวกเตอร์ไปยังอีกจุด / เวกเตอร์
p` = T(p);
โดยที่ p` คือจุดเปลี่ยนและ T (p) คือฟังก์ชันแปลงรูป
เนื่องจากเราไม่ได้ใช้เมทริกซ์ที่เราต้องทำเพื่อรวมการแปลงหลายอย่าง:
p1 = T (p);
p final = M (p1);
เมทริกซ์ไม่เพียง แต่สามารถรวมการแปลงหลายประเภทไว้ในเมทริกซ์เดียว (เช่น affine, linear, projective)
การใช้เมทริกซ์ทำให้เรามีโอกาสที่จะรวมกลุ่มของการแปลงและจากนั้นแบทช์คูณพวกเขา สิ่งนี้ช่วยให้เราประหยัดค่าใช้จ่ายได้มากถึงหนึ่งรอบโดย GPU (ขอบคุณ @ChristianRau ที่ชี้ให้เห็น)
T final = T * R * P; // แปลโครงการหมุนเวียน
p final = T final * p;
นอกจากนี้ยังเป็นการดีที่จะชี้ให้เห็นว่า GPU และแม้แต่ CPU บางตัวได้รับการปรับให้เหมาะสมสำหรับการทำงานของเวกเตอร์ ซีพียูที่ใช้ SIMD และ GPU เป็นข้อมูลที่ขับเคลื่อนด้วยโปรเซสเซอร์แบบขนานโดยการออกแบบดังนั้นการใช้เมทริกซ์จึงเหมาะอย่างยิ่งกับการเร่งความเร็วด้วยฮาร์ดแวร์ (อันที่จริงแล้ว GPU ได้รับการออกแบบให้เหมาะสมกับการทำงานของเมทริกซ์ / เวกเตอร์)
หากสิ่งที่คุณกำลังทำอยู่คือขยับไปตามแกนเดียวและไม่เคยใช้การแปลงแบบอื่นใดแล้วสิ่งที่คุณแนะนำคือไม่เป็นไร
พลังที่แท้จริงของการใช้เมทริกซ์คือคุณสามารถต่อเชื่อมชุดของการดำเนินการที่ซับซ้อนเข้าด้วยกันได้อย่างง่ายดายและนำชุดการดำเนินการชุดเดียวกันไปใช้กับวัตถุหลายชิ้น
กรณีส่วนใหญ่นั้นไม่ง่ายและถ้าคุณหมุนวัตถุก่อนและต้องการแปลงตามแกนท้องถิ่นของมันแทนแกนโลกคุณจะพบว่าคุณไม่สามารถเพิ่ม 10 ถึงหนึ่งในตัวเลขและทำให้มันถูกต้อง .
เพื่อตอบคำถาม "ทำไม" อย่างชัดเจนนั่นเป็นเพราะเมทริกซ์ 4x4 สามารถอธิบายการหมุนการแปลและการปรับสเกลได้ทั้งหมดในครั้งเดียว ความสามารถในการอธิบายสิ่งเหล่านี้ในลักษณะที่สอดคล้องกันทำให้สิ่งต่าง ๆ ง่ายขึ้นมาก
การแปลงรูปแบบต่าง ๆ สามารถแสดงได้ง่ายขึ้นด้วยการดำเนินการทางคณิตศาสตร์ที่แตกต่างกัน ตามที่คุณทราบการแปลสามารถทำได้เพียงแค่เพิ่ม ปรับขนาดโดยการคูณด้วยสเกลาร์ แต่เมทริกซ์ 4x4 ที่ออกแบบมาอย่างเหมาะสมสามารถทำอะไรก็ได้ ดังนั้นการใช้ 4x4 อย่างสม่ำเสมอจึงทำให้รหัสและอินเตอร์เฟสง่ายขึ้นมาก คุณจ่ายความซับซ้อนในการทำความเข้าใจ 4x4 เหล่านี้ แต่จากนั้นมีหลายสิ่งที่ง่ายขึ้นและเร็วขึ้นเพราะมัน
เหตุผลที่จะใช้เมทริกซ์ 4x4 เพื่อให้การดำเนินงานเป็นแปลงเชิงเส้น นี้เป็นตัวอย่างของพิกัดที่เป็นเนื้อเดียวกัน สิ่งเดียวกันนี้ทำในเคส 2d (ใช้เมทริกซ์ 3x3) เหตุผลในการใช้พิกัดที่เป็นเนื้อเดียวกันคือเพื่อให้สามารถแทนค่าทางเรขาคณิตทั้ง 3 แบบได้โดยใช้การดำเนินการเดียว ไม่เช่นนั้นเราจะต้องคูณเมทริกซ์ 3x3 กับการบวกเมทริกซ์ 3x3 (สำหรับการแปล) นี้การเชื่อมโยงจาก cegprakash เป็นประโยชน์
เมทริกซ์ 3 มิติไม่สามารถแสดงการแปลได้
อาร์กิวเมนต์ง่าย ๆ คือการแปลนั้นสามารถนำเวกเตอร์กำเนิด:
0
0
0
ห่างจากแหล่งกำเนิดพูดกับx = 1
:
1
0
0
แต่นั่นจะต้องมีเมทริกซ์เช่นนั้น:
| a b c | |0| |1|
| d e f | * |0| = |0|
| g h i | |0| |0|
แต่นั่นเป็นไปไม่ได้
อีกข้อโต้แย้งคือทฤษฎีบทการสลายตัวของมูลค่าเอกเทศซึ่งกล่าวว่าทุกเมทริกซ์สามารถสร้างขึ้นด้วยการหมุนสองครั้งและการดำเนินการปรับขนาดหนึ่งครั้ง ไม่มีคำแปล
ทำไมจึงต้องใช้การฝึกอบรม?
วัตถุจำลองหลายตัว (เช่นตัวถังรถ) หรือชิ้นส่วนของวัตถุจำลอง (เช่นยางรถยนต์ล้อขับ) เป็นของแข็งระยะทางระหว่างจุดสุดยอดไม่เคยเปลี่ยนแปลง
การแปลงเพียงอย่างเดียวที่เราต้องการจะทำคือการหมุนและการแปล
การคูณเมทริกซ์สามารถเข้ารหัสทั้งการหมุนและการแปล
เมทริกซ์การหมุนมีสูตรที่ชัดเจนเช่น: เมทริกซ์การหมุน 2D สำหรับมุมa
เป็นแบบ:
cos(a) -sin(a)
sin(a) cos(a)
มีสูตรคล้ายเป็น3 มิติแต่ทราบว่า3D หมุนใช้เวลา 3 พารามิเตอร์แทนเพียง 1
การแปลมีความสำคัญน้อยกว่าและจะมีการหารือในภายหลัง นี่คือเหตุผลที่เราต้องการเมทริกซ์ 4D
ทำไมมันถึงเจ๋งที่จะใช้เมทริกซ์?
เพราะองค์ประกอบของการฝึกอบรมหลายได้ก่อนคำนวณโดยคูณเมทริกซ์
เช่นถ้าเราจะแปลหนึ่งพันเวกเตอร์v
ของตัวถังรถของเราด้วยเมทริกซ์T
แล้วหมุนด้วยเมทริกซ์R
แทนที่จะทำ:
v2 = T * v
แล้ว:
v3 = R * v2
สำหรับแต่ละเวกเตอร์เราสามารถคำนวณล่วงหน้าได้:
RT = R * T
จากนั้นทำการคูณหนึ่งครั้งสำหรับทุกจุดยอด:
v3 = RT * v
ยิ่งไปกว่านั้นถ้าเราต้องการวางจุดสุดยอดของยางและล้อขับเมื่อเทียบกับรถเราแค่คูณเมทริกซ์ก่อนหน้านี้RT
ด้วยเมทริกซ์เทียบกับตัวรถเอง
สิ่งนี้นำไปสู่การรักษาเมทริกซ์แบบซ้อน :
การเพิ่มมิติเดียวแก้ปัญหาได้อย่างไร
ลองพิจารณากรณีจาก 1D ถึง 2D ซึ่งง่ายต่อการมองเห็น
เมทริกซ์ใน 1D เป็นเพียงตัวเลขเดียวและอย่างที่เราเห็นในแบบ 3 มิติมันไม่สามารถทำการแปลได้
แต่ถ้าเราเพิ่มมิติพิเศษเป็น:
| 1 dx | * |x| = | x + dx |
| 0 1 | |1| | 1 |
และจากนั้นเราลืมเกี่ยวกับมิติพิเศษใหม่ที่เราได้รับ:
x + dx
ตามที่เราต้องการ
การเปลี่ยนแปลงนี้ 2D เป็นสิ่งสำคัญเพื่อให้มีชื่อ: การเปลี่ยนแปลงเฉือน
มันเจ๋งที่เห็นภาพการเปลี่ยนแปลงนี้:
สังเกตว่าการแปลทุกบรรทัดในแนวนอน (คงที่y
) นั้นเป็นเพียงแค่อะไร
เราเพิ่งจะรับบรรทัดy = 1
เป็นบรรทัด 1D ใหม่ของเราและแปลมันด้วยเมทริกซ์ 2D
ทุกอย่างคล้ายกันในรูปแบบ 3 มิติด้วยเมทริกซ์เฉือนแบบ 4 มิติ:
| 1 0 0 dx | | x | | x + dx |
| 0 1 0 dy | * | y | = | y + dy |
| 0 0 1 dz | | z | | z + dz |
| 0 0 0 1 | | 1 | | 1 |
และการหมุน / การปรับ 3D แบบเก่าของเราตอนนี้อยู่ในรูปแบบ:
| a b c 0 |
| d e f 0 |
| g h i 0 |
| 0 0 0 1 |
วิดีโอการสอนของ Jamie Kingนี้น่าดูด้วยเช่นกัน
เลียนแบบพื้นที่
Affine space คือพื้นที่ที่สร้างโดยการแปลงเชิงเส้น 3 มิติของเรา (การคูณเมทริกซ์) พร้อมกับ 4D shear (การแปล 3 มิติ)
หากเราคูณเมทริกซ์เฉือนและการแปลงเชิงเส้น 3D เราจะได้รูปแบบเสมอ:
| a b c dx |
| d e f dy |
| g h i dz |
| 0 0 0 1 |
นี่คือการแปลงเลียนแบบทั่วไปที่เป็นไปได้มากที่สุดซึ่งเป็นการหมุน / ปรับขนาดและการแปล 3D
คุณสมบัติที่สำคัญอย่างหนึ่งคือถ้าเราคูณเมทริกซ์เลียนแบบ 2:
| a b c dx | | a2 b2 c2 dx2 |
| d e f dy | * | d2 e2 f2 dy2 |
| g h i dz | | g2 h2 i2 dz2 |
| 0 0 0 1 | | 0 0 0 1 |
เราได้เมทริกซ์รูปแบบอีกรูปแบบหนึ่งเสมอ :
| a3 b3 c3 (dx + dx2) |
| d3 e3 f3 (dy + dy2) |
| g3 h3 i3 (dz + dz2) |
| 0 0 0 1 |
นักคณิตศาสตร์เรียกการปิดคุณสมบัตินี้และจำเป็นต้องกำหนดช่องว่าง
สำหรับเรามันหมายความว่าเราสามารถทำการคูณเมทริกซ์เพื่อคำนวณการเปลี่ยนแปลงขั้นสุดท้ายได้อย่างมีความสุขซึ่งเป็นเหตุผลที่ใช้เมทริกซ์ที่ใช้ตั้งแต่แรกโดยไม่ต้องมีการแปลงเชิงเส้น 4D ทั่วไปที่ไม่เลียนแบบ
การฉายภาพ Frustum
แต่เดี๋ยวก่อนมีการเปลี่ยนแปลงที่สำคัญอีกอย่างหนึ่งที่เราทำอยู่ตลอดเวลาglFrustum
ซึ่งทำให้วัตถุ 2x ยิ่งขึ้น
ก่อนอื่นให้รับปรีชาญาณเกี่ยวกับglOrtho
vs glFrustum
ที่: https://stackoverflow.com/questions/2571402/explain-the-usage-of-glortho/36046924#36046924
glOrtho
สามารถทำได้ด้วยการแปล + การปรับ แต่เราจะนำไปใช้glFrustum
กับเมทริกซ์ได้อย่างไร?
สมมติว่า:
z = -1
นั่นคือความยาว 2z = -2
หากเราอนุญาตให้พิมพ์ 4 เวกเตอร์ทั่วไปมากขึ้น:
(x, y, z, w)
ด้วยw != 0
และนอกจากนี้เราระบุทุก ๆ(x, y, z, w)
ด้วย(x/w, y/w, z/w, 1)
แล้วการแปลง frustum กับเมทริกซ์จะเป็น:
| 1 0 0 0 | | x | | x | | x / -z |
| 0 1 0 0 | * | y | = | y | identified to | y / -z |
| 0 0 1 0 | | z | | z | | -1 |
| 0 0 -1 0 | | w | | -z | | 0 |
ถ้าเราทิ้งz
และw
ท้ายที่สุดเราจะได้:
x_proj = x / -z
y_proj = y / -z
ซึ่งเป็นสิ่งที่เราต้องการ! เราสามารถตรวจสอบว่าสำหรับบางค่าเช่น:
z == -1
บนเครื่องบินที่เราคาดหวังx_proj == x
และy_proj == y
z == -2
เช่นนั้นx_proj = x/2
: วัตถุมีขนาดครึ่งหนึ่งโปรดสังเกตว่าการglFrustum
แปลงไม่ได้อยู่ในรูปแบบเลียนแบบ: ไม่สามารถนำไปใช้กับการหมุนและการแปลได้
"กลอุบาย" ทางคณิตศาสตร์ของการเพิ่มw
และหารด้วยมันเรียกว่าพิกัดที่เป็นเนื้อเดียวกัน
ดูเพิ่มเติม: คำถาม Stack Overflow ที่เกี่ยวข้อง: https://stackoverflow.com/questions/2465116/understanding-opengl-matrices
ดูวิดีโอนี้เพื่อทำความเข้าใจแนวคิดของแบบจำลองมุมมองและเส้นโครง
เมทริกซ์ 4x4 ไม่เพียงใช้สำหรับการแปลวัตถุ 3 มิติ แต่ยังเพื่อวัตถุประสงค์อื่น ๆ อีกมากมาย
ดูสิ่งนี้เพื่อทำความเข้าใจว่าจุดยอดในโลกแสดงเป็นเมทริกซ์ 4D และวิธีการเปลี่ยน