2009-03-10 28 views
116

Tôi mới dùng OpenGL và tôi hơi bị choáng ngợp với tất cả các chức năng ngẫu nhiên mà tôi có trong mã. Họ làm việc 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ì họ thực sự làm.GlLoadIdentity() làm gì trong OpenGL?

Tôi biết rằng glLoadIdentity() thay thế ma trận hiện tại bằng ma trận nhận dạng, nhưng chính xác điều đó sẽ làm gì? Nếu mọi chương trình yêu cầu nó, tại sao không phải là ma trận nhận dạng theo mặc định trừ khi được quy định khác? Tôi không thích 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ú nên hãy tha thứ cho sự thiếu hiểu biết của tôi nếu đây là điều rất rõ ràng cho 3D.

Cũng hơi bối rối về glMatrixMode(GL_PROJECTION) VS glMatrixMode(GL_MODELVIEW).

Trả lời

125

Ma trận nhận dạng, về ma trận chiếu và ma trận modelview, về cơ bản đặt lại ma trận về trạng thái mặc định của nó.

Như bạn hy vọng biết, glTranslateglRotate luô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, không phải từ nguồn gốc. Nhưng nếu bạn muốn bắt đầu lại từ nguồn gốc, đó là khi bạn gọi glLoadIdentity(), và sau đó bạn có thể glTranslate từ ma trận hiện đang ở gốc hoặc glRotate từ 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 giống như sau:

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

Đó là ma trận nhận dạng. Boon là chính xác, toán học, rằng bất kỳ ma trận nhân với ma trận đó (hoặc ma trận trông giống như vậy, đường chéo, tất cả 0s khác) sẽ dẫn đến ma trận ban đầu, nhưng tôi không tin rằng ông giải thích tại sao điều này là 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à phép quay qua mỗi ma trận; do đó, ví dụ bạn vẽ một đa giác (glBegin(GL_FACE), một số điểm, glEnd()), nó chuyển nó thành "không gian thế giới" bằng cách nhân nó với MODELVIEW và sau đó dịch nó từ 3D sang 2D bằng cách nhân nó với ma trận DỰ ÁN, và cung cấp cho nó các điểm 2D trên màn hình, cùng với độ sâu (từ màn hình 'máy ảnh'), mà nó sử dụng để vẽ điểm ảnh. Nhưng khi một trong các ma trận này là ma trận nhận dạng, các điểm được nhân với ma trận nhận dạng và do đó không 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ó để lại chúng như là.

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

+0

Ví dụ rõ ràng với tôi :) – hqt

+1

Điều đó có nghĩa, OpenGL duy trì một 'Thầy' hoặc ma trận 'toàn cầu', và, mỗi ma trận tiếp theo được áp dụng tương ứng với đó là Thạc sĩ 'hoặc Ma trận 'Toàn cầu'. Tôi có đúng không? – anonymous

38

Ma trận nhận dạng tương đương với 1 cho số. Vì 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 ma trận nhận dạng là cách khởi tạo ma trận của bạn đến đú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): xử lý các ma trận được sử dụng bởi chuyển đổi phối cảnh hoặc chuyển đổi trực giao.

glMatrixMode(GL_MODELVIEW): xử lý các ma trận được sử dụng bởi chuyển đổi chế độ xem mô hình. Nghĩa là, để biến đổi đối tượng của bạn (hay còn gọi là mô hình) thành không gian tọa độ xem (hoặc không gian camera).

2

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

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

5

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ì đôi mắt của bạn cho phép bạn nhìn thấy. Nếu bạn là một con cá ví dụ bạn thấy mọi thứ rộng hơn một chút. Vì vậy, khi chúng ta nói rằng chúng ta thiết lập ma trận chiếu, chúng ta có nghĩa là chúng ta thiết lập những gì chúng ta muốn thấy từ cảnh mà chúng ta tạo ra. Tôi có nghĩa là bạn có thể vẽ các đối tượng ở bất cứ đâu trên 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ì cả. 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 cắt để xác định trường xem 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 bạn một lần và sau đó dịch nó hoặc xoay nó hoặc mở rộng 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 bạn để đặt âm lượng chế độ xem. Sau đó, bạn vẽ đối tượng của bạn 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 để 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ả) rồi thay đổi lại thành ma trận modelview.

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

Hope Tôi đã làm sáng tỏ

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