เหตุใดเราใช้ 4x4 เมทริกซ์เพื่อเปลี่ยนสิ่งต่าง ๆ ในแบบ 3 มิติ


36

ในการแปลเวคเตอร์ 10 หน่วยในทิศทาง X ทำไมเราต้องใช้เมทริกซ์

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

เราสามารถเพิ่ม 10 ลงในเสื่อ [0] [0] และเราก็ได้ผลลัพธ์เดียวกัน

คำตอบ:


28

ใช่คุณสามารถเพิ่มเวกเตอร์ในกรณีของการแปล เหตุผลที่ใช้เมทริกซ์เดือดลงเพื่อให้มีวิธีที่เหมือนกันในการจัดการการเปลี่ยนแปลงแบบรวมที่แตกต่างกัน

ตัวอย่างเช่นการหมุนมักจะทำโดยใช้เมทริกซ์ (ตรวจสอบความคิดเห็น @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 ได้รับการออกแบบให้เหมาะสมกับการทำงานของเมทริกซ์ / เวกเตอร์)


ใช่ฉันรู้ว่าเมทริกซ์นั้นมีประโยชน์สำหรับการหมุน แต่ทุกบทช่วยสอนฉันใช้เมทริกซ์เพื่อทำการคำนวณอย่างง่าย: D
ngoaho91

1
การบอกว่าการหมุนสามารถทำได้ "กับ" ด้วยเมทริกซ์ไม่ถูกต้องส่วนหัว Quaternions และตรีโกณมิติก็ทำงานได้ดีเช่นกัน
MickLH

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

1
@ concept3d ใช่ฉันรู้คำตอบนั้นดี แต่ข้อได้เปรียบที่ยิ่งใหญ่กว่าที่ได้รับจากวิธีการใช้เมทริกซ์ที่สม่ำเสมอนั้นไม่เพียง แต่ความสม่ำเสมอเท่านั้น แม้ว่ามันอาจจะบอกเป็นนัย แต่ฉันก็พบว่ามันไม่ชัดเจนและมีความสำคัญพอที่จะพูดถึงมันอย่างชัดเจน แต่คำตอบก็ยังดีอยู่ดีมันไม่ใช่คำวิจารณ์
คริสพูดว่า Reinstate Monica

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

6

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

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

กรณีส่วนใหญ่นั้นไม่ง่ายและถ้าคุณหมุนวัตถุก่อนและต้องการแปลงตามแกนท้องถิ่นของมันแทนแกนโลกคุณจะพบว่าคุณไม่สามารถเพิ่ม 10 ถึงหนึ่งในตัวเลขและทำให้มันถูกต้อง .


5

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

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


2
นี่ควรเป็นคำตอบที่เลือก
วิศวกร

4

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


2
คุณควรทำอย่างละเอียด คำอธิบายสั้น ๆ ดีกว่าเพียงการเชื่อมโยงไปยังวิกิพีเดีย
Seth Battin

3

เมทริกซ์ 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 ยิ่งขึ้น

ก่อนอื่นให้รับปรีชาญาณเกี่ยวกับglOrthovs glFrustumที่: https://stackoverflow.com/questions/2571402/explain-the-usage-of-glortho/36046924#36046924

glOrthoสามารถทำได้ด้วยการแปล + การปรับ แต่เราจะนำไปใช้glFrustumกับเมทริกซ์ได้อย่างไร?

สมมติว่า:

  • ตาของเราอยู่ที่จุดเริ่มต้นดูที่ -z
  • หน้าจอ (ระนาบใกล้) อยู่ที่z = -1นั่นคือความยาว 2
  • ระนาบไกลของฟรัสตัมอยู่ที่ z = -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


@ ผู้ลงคะแนนเสียงโปรดอธิบายเพื่อให้ฉันสามารถเรียนรู้และปรับปรุง
Ciro Santilli 新疆改造中心法轮功六四事件

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

@ JoshPetrie ขอบคุณสำหรับข้อเสนอแนะ! ฉันคิดว่าคนที่ไม่เข้าใจจะมีแนวโน้มที่จะเข้าใจคำตอบของฉันมากกว่าเพราะมันเป็นแบบอย่างและเป็นภาพมากขึ้น หากคุณพบข้อผิดพลาดหรือจุดเฉพาะที่ไม่เกี่ยวข้องอย่างสมบูรณ์ชี้ให้พวกเขาเพื่อให้ฉันสามารถปรับปรุง ไชโย
Ciro Santilli 新疆改造中心法轮功六四事件

ดังที่ฉันพูดฉันคิดว่าคำตอบส่วนใหญ่ไม่เกี่ยวข้อง คำถามถามว่า "ทำไมต้องใช้การฝึกอบรม 4x4 ทำไมเราไม่สามารถเพิ่มได้?" คำตอบที่ครอบคลุมอย่างดีพร้อมคำอธิบายเช่น "ใช่คุณสามารถเพิ่ม แต่เมทริกซ์ช่วยให้คุณแปล / หมุน / สเกลได้เช่นกัน แต่เนื่องจากวิธีการทางคณิตศาสตร์เมทริกซ์ทำงาน 3x3 ไม่สามารถเข้ารหัสการแปล แต่ 4x4 คนหนึ่งทำได้ " หากคุณพูดถึงเรื่องนี้ในกำแพงข้อความนี้มันหายากมาก ส่วนที่เหลือของมันเป็นไพรเมอร์ในคณิตศาสตร์เมทริกซ์ที่ไม่ได้ถามเกี่ยวกับและในขณะที่มันอาจจะปรับเป็นคำตอบสำหรับคำถามอื่นผมไม่คิดว่ามันเป็นแบบที่ดีกับนี้คำถาม
Josh

1
ฉันชื่นชมความสนใจในรายละเอียด เพื่อแก้ไขข้อกังวลของผู้ใช้ก่อนหน้านี้คำตอบควรจะจัดใหม่ให้เริ่มต้นที่ "matrices 3D ไม่สามารถแสดงได้" นี่เป็นคำตอบของคำถามในทันทีและ OP สามารถดำเนินการต่อไปยังรายละเอียดที่เป็นลายลักษณ์อักษรและมีความกระตือรือร้นต่อไป รายละเอียดปลีกย่อยเหล่านั้นเป็นสิ่งที่ฉันสนใจที่นี่ดังนั้นฉันอาจจะลำเอียง แต่นี่ไม่ใช่ "การท่องเที่ยว"
dskinner

1

ดูวิดีโอนี้เพื่อทำความเข้าใจแนวคิดของแบบจำลองมุมมองและเส้นโครง

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

ดูสิ่งนี้เพื่อทำความเข้าใจว่าจุดยอดในโลกแสดงเป็นเมทริกซ์ 4D และวิธีการเปลี่ยน


1
สิ่งนี้ไม่ตอบคำถาม OP จริง ๆ
คอนเซปต์ 3

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