OpenGL - Tìm hiểu mối quan hệ giữa Mô hình, Chế độ xem và Ma trận Thế giới


8

Tôi gặp một chút khó khăn khi hiểu cách thức các ma trận này hoạt động và cách thiết lập chúng liên quan đến nhau để có được một hệ thống phù hợp.

Theo hiểu biết của tôi, Ma trận mô hình là ma trận của một đối tượng, ví dụ như hình khối hoặc hình cầu, sẽ có nhiều trong số này trong ứng dụng / trò chơi.

Ma trận thế giới là ma trận xác định nguồn gốc của thế giới 3D. điểm băt đâu.

Và View Matrix là "máy ảnh" mọi thứ được dịch với điều này để đảm bảo bạn có ảo ảnh về một chiếc máy ảnh thực tế khi thực tế mọi thứ đang chuyển động thay vì ma trận này?

Tôi có một chút mất ở đây. Vì vậy, tôi đã hy vọng ai đó ở đây có thể giúp tôi hiểu điều này đúng.

Có phải mọi modelMatrix đều được dịch / nhân với ma trận thế giới và worldMatrix sau đó với viewMatrix không? Hay mọi modelMatrix đều được dịch / nhân với viewMatrix và sau đó với worldMatrix?

Làm thế nào để tất cả các ma trận này liên quan và làm thế nào để bạn thiết lập một thế giới với nhiều đối tượng và một "máy ảnh"?

BIÊN TẬP:

Cảm ơn rất nhiều cho các thông tin phản hồi đã. Tôi đã làm một số aswel googling và tôi nghĩ rằng bây giờ tôi đã hiểu nó tốt hơn một chút, tuy nhiên liệu có thể nhận được một số lời khuyên mã giả?

projectionMatrix = Matrix;
makePerspective(45, width, height, 0.1, 1000.0, projectionMatrix);

modelMatrix = Matrix;
identity(modelMatrix);
translate(modelMatrix, [0.0, 0.0, -10.0]);  // move back 10 on z axis

viewMatrix = Matrix;
identity(viewMatrix);
// do some translation based on input with viewMatrix;

Tôi có nhân hoặc dịch viewMatrix với modelMatrix hay ngược lại không? và sau đó thì sao? Tôi hiện đang có một phương thức vẽ theo cách mà nó chỉ cần 2 ma trận cho các đối số để vẽ.

Đây là phương pháp vẽ của tôi:

draw(matrix1 matrix2) {

            bindBuffer(ARRAY_BUFFER, cubeVertexPositionBuffer);
            vertexAttribPointer(shaderProgram.getShaderProgram().vertexPositionAttribute, cubeVertexPositionBuffer.itemSize, FLOAT, false, 0, 0);

            bindBuffer(ARRAY_BUFFER, cubeVertexColorBuffer);
            vertexAttribPointer(shaderProgram.getShaderProgram().vertexColorAttribute, cubeVertexColorBuffer.itemSize, FLOAT, false, 0, 0);

            bindBuffer(ELEMENT_ARRAY_BUFFER, cubeVertexIndexBuffer);

            setMatrixUniforms(shaderProgram, matrix1, matrix2);

            drawElements(TRIANGLES, cubeVertexIndexBuffer.numItems, UNSIGNED_SHORT, 0);


}

Những ma trận giả sử là gì? Cảm ơn rất nhiều trước một lần nữa các bạn.


1
Bạn có biết ma trận là gì không? Bạn có biết làm thế nào để nhân ma trận / vectơ? Bạn có biết, ma trận nào đại diện (biến đổi tuyến tính / affine)? Nếu bạn không, tốt nhất bạn nên bắt đầu với một số môn Toán trước.
Ivan Kuckir

Có lẽ là một ý tưởng tốt để tập trung vào đó. bất kỳ ý tưởng nào để tìm kiếm hoặc bất kỳ nguồn tốt mà bạn biết về trực tuyến?
Sam

1
Làm việc theo cách của bạn đến đại số tuyến tính, sau đó tìm kiếm kết xuất 3D cơ bản và sau đó hướng dẫn. Các intertubes có đầy đủ các nguồn tốt nhưng bạn phải thực hiện từng bước một hoặc như bạn đã nhận thấy, bạn hoàn toàn bị lạc.
Patrick Hughes

Câu trả lời:


19

Trong cảnh hiển thị 3D, thường có ba ma trận chính được sử dụng để chuyển đổi một đối tượng từ không gian cục bộ của chính nó (không gian đối tượng / mô hình) thành một không gian đồng nhất được gọi là không gian màn hình.

Thế giới

  • Ma trận thế giới là ma trận đầu tiên, là duy nhất cho mọi đối tượng trong thế giới của bạn và chịu trách nhiệm chuyển đổi các đỉnh của một vật thể từ không gian cục bộ của nó, thành một hệ tọa độ chung gọi là không gian thế giới.

Lượt xem

  • Sau đó, ma trận xem cung cấp khái niệm về một máy ảnh di động, khi thực tế, máy ảnh thực sự là điểm tham chiếu duy nhất không đổi trên thế giới. Ma trận xem là một phép biến đổi được áp dụng cho mọi đối tượng trong cảnh (nhưng không phải là duy nhất cho mỗi đối tượng) và cung cấp ảo ảnh của máy ảnh. Ma trận xem về cơ bản là nghịch đảo của những gì có thể được coi là ma trận thế giới cho máy ảnh. Tuy nhiên, thay vì tự di chuyển máy ảnh, nó cung cấp các chuyển động ngược lại với phần còn lại của cảnh (ảo ảnh;)).

Chiếu

  • Cuối cùng, ma trận chiếu có trách nhiệm chuyển đổi một thế giới 3D thành không gian màn hình đồng nhất mà bạn nhìn thấy trên màn hình của mình. Đây là ma trận được sử dụng để thể hiện sự thất vọng về quan điểm của bạn và thường được biểu diễn dưới dạng hình chiếu chính tả hoặc phối cảnh.

Ở mức độ đơn giản nhất, mỗi đối tượng của bạn cần chứa ma trận thế giới riêng, "cảnh" của bạn hoặc bất kỳ bối cảnh nào bạn sử dụng phải chứa ma trận chế độ xem để đại diện cho máy ảnh và ma trận chiếu để chuyển đổi tọa độ thế giới sang tọa độ màn hình. Tất cả những thứ này sau đó cần được truyền cho shader đỉnh (với ma trận thế giới thay đổi cho từng đối tượng, nhưng không nhất thiết phải là chế độ xem hoặc hình chiếu) để được chuyển đổi.


Tôi đã cập nhật bài viết của mình, có lẽ bạn có thể giúp đỡ với mã giả mà tôi đã viết ra để giúp tôi hiểu câu trả lời tốt hơn?
Sam

Tôi có thể lấy văn bản chính xác của câu trả lời này mà không tạo ra bất kỳ vi phạm bản quyền nào không?
arandomguy

1
Có, bạn có thể sử dụng nó
Evan

Không nên gọi ma trận "Thế giới" là Ma trận "Mô hình" và sự kết hợp giữa Mô hình và Chế độ xem, ma trận "ModelView", có phải là ma trận "Thế giới" không?
BAR

Thuật ngữ chính xác có thể thay đổi tùy thuộc vào cơ sở mã được sử dụng. Một số đường ống kết xuất kết hợp các ma trận nhất định, trong khi những đường ống khác khiến chúng bị tách ra. Tôi đã thấy một số hệ thống sử dụng thuật ngữ mà bạn mô tả ở đây.
Evan

3

Câu trả lời hay ở đây /programming/6461740/xna-worldmatrix-and-viewmatrix

Trước hết, không có sự khác biệt thực sự giữa "Ma trận thế giới""Ma trận xem" , cả hai đều là ma trận biến đổi và sự khác biệt có phần tùy ý. Một số hệ thống thậm chí kết hợp cả hai (OpenGL đơn giản là có ma trận "ModelView" ).

Theo truyền thống, "ma trận thế giới" được sử dụng để di chuyển các mô hình riêng lẻ từ "không gian mô hình" sang "không gian thế giới". Sau đó, "ma trận xem" được sử dụng để di chuyển tất cả các mô hình từ không gian thế giới vào các vị trí tương đối của chúng ở phía trước máy ảnh (trong thực tế, "di chuyển máy ảnh"). Và cuối cùng, "Ma trận chiếu" chuyển đổi các vị trí 3D thành các vị trí 2D của chúng trên màn hình (thường có hình chiếu phối cảnh). Bởi vì chúng là ma trận, chúng có thể được nhân với nhau thành một ma trận duy nhất có thể biến đổi các điểm trong một bước duy nhất.

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.