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, glTranslate
và glRotate
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, 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ể glTranslate
từ ma trận hiện nằm ở 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 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!