2010-03-17 66 views
17

Tôi bắt đầu tìm hiểu về dựng hình 3D và tôi đã đạt được tiến bộ tốt. Tôi đã chọn rất nhiều về ma trận và các hoạt động chung có thể được thực hiện trên chúng.Hiểu các ma trận OpenGL

Một điều tôi vẫn chưa hoàn toàn theo dõi là sử dụng ma trận của OpenGL. Tôi thấy điều này (và những thứ tương tự) khá nhiều:

x y z n 
------- 
1 0 0 0 
0 1 0 0 
0 0 1 0 
0 0 0 1 

Vì vậy, hiểu biết tốt nhất của tôi, đó là ma trận cột 4 chiều chuẩn (không có cường độ). Ngoài ra, ma trận này nói riêng được gọi là "ma trận nhận diện".

Một số câu hỏi:

  • các "thứ n" chiều là gì?
  • Được áp dụng như thế nào và khi nào?

Sự nhầm lẫn lớn nhất của tôi phát sinh từ cách OpenGL sử dụng loại dữ liệu này.

+0

Xem sách "Toán học thiết yếu cho trò chơi và ứng dụng tương tác" . –

+2

Vectơ chuẩn hóa không phải là "không có cường độ". Các vectơ chuẩn hóa có độ dài/độ lớn 1. – alesplin

+0

Cảm ơn! Tôi đoán tôi đã mang đi trong sự hiểu biết. Ít nhất tôi đã đi đúng hướng. ;) –

Trả lời

3

Câu trả lời ngắn có thể giúp bạn bắt đầu là thứ nguyên 'n', như bạn gọi, không đại diện cho bất kỳ số lượng trực quan nào. Nó được thêm vào như một công cụ thực tế để kích hoạt phép nhân ma trận gây ra dịch chiếu và phối cảnh. Một ma trận 3x3 trực quan không thể làm những điều đó.

Giá trị 3d biểu thị một điểm trong không gian luôn được thêm 1 giá trị thứ tư để làm cho mẹo này hoạt động. Giá trị 3d đại diện cho một hướng (tức là bình thường, nếu bạn quen thuộc với cụm từ đó) được 0 nối thêm ở vị trí thứ tư.

59

Trong hầu hết đồ họa 3D, điểm được biểu diễn bằng vector 4 thành phần sự kết hợp này.

Các phép biến đổi này có thể được biểu diễn bằng đối tượng toán học được gọi là "ma trận". Một ma trận áp dụng trên một vector như thế này:

[ a b c tx ] [ x ] [ a*x + b*y + c*z + tx*w ] 
| d e f ty | | y | = | d*x + e*y + f*z + ty*w | 
| g h i tz | | z | | g*x + h*y + i*z + tz*w | 
[ p q r s ] [ w ] [ p*x + q*y + r*z + s*w ] 

Ví dụ, tỉ lệ được biểu diễn dưới dạng

[ 2 . . . ] [ x ] [ 2x ] 
| . 2 . . | | y | = | 2y | 
| . . 2 . | | z | | 2z | 
[ . . . 1 ] [ 1 ] [ 1 ] 

và dịch như

[ 1 . . dx ] [ x ] [ x + dx ] 
| . 1 . dy | | y | = | y + dy | 
| . . 1 dz | | z | | z + dz | 
[ . . . 1 ] [ 1 ] [ 1 ] 

Một trong những lý do cho thành phần thứ 4 là tạo một bản dịch có thể biểu diễn bằng ma trận.

Lợi thế của việc sử dụng ma trận là nhiều phép biến đổi có thể được kết hợp thành một thông qua phép nhân ma trận.

Bây giờ, nếu mục đích đơn giản là mang bản dịch trên bàn, thì tôi muốn nói (x, y, z, 1) thay vì (x, y, z, w) và tạo hàng cuối cùng của ma trận luôn luôn [0 0 0 1], như thường được thực hiện cho đồ họa 2D. Trong thực tế, vector 4 thành phần sẽ được ánh xạ trở lại vectơ 3-vector thông thường theo công thức này:

[ x(3D) ] [ x/w ] 
| y(3D) ] = | y/w | 
[ z(3D) ] [ z/w ] 

Đây được gọi là homogeneous coordinates. Cho phép điều này làm cho phép chiếu phối cảnh có thể hiển thị bằng ma trận quá, có thể kết hợp lại với tất cả các phép biến đổi khác.

Ví dụ, kể từ khi đối tượng xa nên nhỏ hơn trên màn hình, chúng ta chuyển đổi 3D phối vào 2D sử dụng công thức

x(2D) = x(3D)/(10 * z(3D)) 
y(2D) = y(3D)/(10 * z(3D)) 

Bây giờ nếu chúng ta áp dụng ma trận chiếu

[ 1 . . . ] [ x ] [ x ] 
| . 1 . . | | y | = | y | 
| . . 1 . | | z | | z | 
[ . . 10 . ] [ 1 ] [ 10*z ] 

sau đó thực Tọa độ 3D sẽ trở thành

x(3D) := x/w = x/10z 
y(3D) := y/w = y/10z 
z(3D) := z/w = 0.1 

vì vậy chúng tôi chỉ cần cắt x -coordinate ra để dự án 2D.

+2

Tôi ước tôi có thể hiểu các ví dụ của bạn, nhưng tôi không thực sự hiểu nó. Tôi xin lỗi. –

+1

@ Omega Phần này của Sách Đỏ OpenGL có thể giúp http://www.glprogramming.com/red/appendixf.html#name1 – Swiss

+0

@Omega Có lẽ những điều cơ bản là hữu ích quá [http://en.wikipedia.org/wiki /Phép nhân ma trận]. – Luca

Các vấn đề liên quan