GlLoadIdentity () làm gì trong OpenGL?


132

Tôi mới sử dụng OpenGL và tôi hơi choáng ngợp với tất cả các hàm ngẫu nhiên mà tôi có trong mã của mình. Chúng hoạt động và tôi biết khi nào nên sử dụng chúng, nhưng tôi không biết tại sao tôi cần chúng hoặc những gì chúng thực sự làm.

Tôi biết rằng glLoadIdentity()thay thế ma trận hiện tại bằng ma trận danh tính, nhưng chính xác thì nó làm gì? Nếu mọi chương trình đều yêu cầu nó, tại sao không phải là ma trận danh tính theo mặc định trừ khi có quy định khác? Tôi không muốn có các chức năng trong mã của mình trừ khi tôi biết họ làm gì. Tôi nên lưu ý rằng tôi đang sử dụng OpenGL dành riêng cho các khách hàng 2D phong phú, vì vậy, xin lỗi vì sự thiếu hiểu biết của tôi nếu đây là điều rất rõ ràng đối với 3D.

Cũng là một chút nhầm lẫn về glMatrixMode(GL_PROJECTION)VS glMatrixMode(GL_MODELVIEW).

Câu trả lời:


139

Ma trận danh tính, về mặt ma trận chiếu và ma trận mô hình, về cơ bản đặt lại ma trận trở về trạng thái mặc định.

Như bạn hy vọng biết, glTranslateglRotateluôn liên quan đến trạng thái hiện tại của ma trận. Vì vậy, ví dụ, nếu bạn gọi glTranslate, bạn đang dịch từ 'vị trí' hiện tại của ma trận, chứ không phải từ nguồn gốc. Nhưng nếu bạn muốn bắt đầu lại từ gốc, đó là khi bạn gọi glLoadIdentity(), và sau đó bạn có thể glTranslatetừ ma trận hiện nằm ở gốc hoặc glRotatetừ ma trận hiện được định hướng theo hướng mặc định.

Tôi nghĩ câu trả lời của Boon, rằng nó tương đương với 1, không chính xác. Ma trận thực sự trông như thế này:

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

Đó là ma trận danh tính. Boon là chính xác, về mặt toán học, rằng bất kỳ ma trận nào nhân với ma trận đó (hoặc ma trận trông giống như vậy; các đường chéo, tất cả các số 0 khác) sẽ dẫn đến ma trận gốc, nhưng tôi không tin rằng anh ta giải thích tại sao điều này lại quan trọng.

Lý do tại sao điều này quan trọng là vì OpenGL nhân tất cả các vị trí và xoay vòng qua từng ma trận; Vì vậy, khi bạn vẽ một đa giác ( glBegin(GL_FACE), một số điểm glEnd()), nó sẽ dịch nó thành "không gian thế giới" bằng cách nhân nó với MODELVIEW, sau đó dịch nó từ 3D sang 2D bằng cách nhân nó với ma trận DỰ ÁN và điều đó mang lại cho nó các điểm 2D trên màn hình, cùng với độ sâu (từ màn hình 'camera'), được sử dụng để vẽ pixel. Nhưng khi một trong các ma trận này là ma trận danh tính, các điểm được nhân với ma trận danh tính và do đó không bị thay đổi, do đó ma trận không có hiệu lực; nó không dịch các điểm, nó không xoay chúng, nó để nguyên như vậy.

Tôi hy vọng điều này làm rõ hơn một chút!


1
Điều đó có nghĩa là, OpenGL duy trì ma trận 'Master' hoặc 'Global' và, mỗi ma trận tiếp theo được áp dụng tương ứng với ma trận 'Master' hoặc 'Global'. Tôi có đúng không
user366312

41

Ma trận danh tính tương đương với 1 cho số. Như bạn biết bất kỳ số nào nhân với 1 là chính nó (e.g. A x 1 = A),

Điều tương tự cũng xảy ra với ma trận ( MatrixA x IdentityMatrix = MatrixA).

Vì vậy, tải một ma trận danh tính là một cách để khởi tạo ma trận của bạn về đúng trạng thái trước khi bạn nhân các ma trận tiếp theo vào ngăn xếp ma trận.

glMatrixMode(GL_PROJECTION) : liên quan đến các ma trận được sử dụng bởi chuyển đổi phối cảnh hoặc biến đổi trực giao.

glMatrixMode(GL_MODELVIEW): giao dịch với ma trận được sử dụng bởi phép biến đổi mô hình-xem. Đó là, để chuyển đổi đối tượng của bạn (còn gọi là mô hình) sang không gian tọa độ xem (hoặc không gian camera).


6

Ma trận chiếu được sử dụng để tạo khối lượng xem của bạn. Hãy tưởng tượng một cảnh trong thế giới thực. Bạn không thực sự nhìn thấy mọi thứ xung quanh bạn, chỉ những gì mắt bạn cho phép bạn nhìn thấy. Nếu bạn là một con cá chẳng hạn, bạn sẽ thấy mọi thứ rộng hơn một chút. Vì vậy, khi chúng tôi nói rằng chúng tôi thiết lập ma trận chiếu, chúng tôi có nghĩa là chúng tôi thiết lập những gì chúng tôi muốn thấy từ cảnh mà chúng tôi tạo ra. Ý tôi là bạn có thể vẽ đồ vật ở bất cứ đâu trong thế giới của bạn. Nếu chúng không nằm trong khối lượng xem, bạn sẽ không thấy gì. Khi bạn tạo khối lượng xem, hãy tưởng tượng rằng bạn tạo 6 mặt phẳng cắt xác định trường nhìn của bạn.

Đối với ma trận modelview, nó được sử dụng để thực hiện các phép biến đổi khác nhau cho các mô hình (đối tượng) trong thế giới của bạn. Như thế này, bạn chỉ phải xác định đối tượng của mình một lần và sau đó dịch nó hoặc xoay nó hoặc thu nhỏ nó.

Bạn sẽ sử dụng ma trận chiếu trước khi vẽ các đối tượng trong cảnh của mình để đặt âm lượng xem. Sau đó, bạn vẽ đối tượng của mình và thay đổi ma trận modelview cho phù hợp. Tất nhiên, bạn có thể thay đổi ma trận giữa chừng khi vẽ các mô hình của mình nếu ví dụ bạn muốn vẽ một cảnh và sau đó vẽ một số văn bản (với một số phương pháp bạn có thể làm việc dễ dàng hơn trong phép chiếu chính tả), sau đó đổi lại thành ma trận mô hình.

Đối với modelviewview, nó phải được thực hiện với tính hai mặt của mô hình hóa và xem các biến đổi. Nếu bạn vẽ lại camera 5 đơn vị, hoặc di chuyển đối tượng 5 đơn vị về phía trước thì về cơ bản là giống nhau.

Hy vọng tôi đã làm sáng tỏ


2

Ma trận danh tính được sử dụng để "khởi tạo" một ma trận thành mặc định lành mạnh.

Một điều quan trọng để nhận ra là phép nhân ma trận có ý nghĩa, phụ gia. Ví dụ: nếu bạn lấy một ma trận bắt đầu bằng ma trận danh tính, nhân nó với ma trận xoay, sau đó nhân nó với ma trận chia tỷ lệ, bạn kết thúc với một ma trận xoay và chia tỷ lệ các ma trận mà nó được nhân lên.


0

Chỉ cần tóm tắt lại những gì người khác đã nói, ma trận danh tính là một ma trận sao cho khi bạn nhân một vectơ / ma trận với nó, kết quả là cùng một vectơ / ma trận. Nó tương đương với số 1 với phép nhân hoặc số 0 có thêm.

glLoadIdentity () là một hàm không dùng nữa và bạn được khuyến khích quản lý ma trận của riêng mình.


-1

glLoadIdentity() Hàm đảm bảo rằng mỗi lần chúng ta vào chế độ chiếu, ma trận sẽ được đặt lại thành ma trận nhận dạng, để các tham số xem mới không được kết hợp với ma trận trước.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.