Ma trận phối cảnh trong API đồ họa hay ma quỷ nằm ở chi tiết. Lập trình với DirectX9: Xoay đối tượng

Axonometry là một phép chiếu song song. Bảng 3.3 lần đầu tiên liệt kê các ma trận của phép chiếu trực giao lên mặt phẳng tọa độ thu được từ định nghĩa của chúng.

Bảng 3.3.Các ma trận biến đổi thiết kế và phép chiếu

Phép chiếu trực giao trên XOY

Phép chiếu chính tả trên YOZ

Phép chiếu trực giao trên XOZ

Phép chiếu trực giao lên mặt phẳng x=p

Ma trận biến đổi tam giác sang mặt phẳng XOY

Ma trận biến đổi đẳng cự sang mặt phẳng XOY

Ma trận chiếu đẳng cự trên mặt phẳng XOY

Ma trận chiếu xiên trên XOY

Ma trận chiếu miễn phí trên XOY

Ma trận chiếu tủ trên XOY

Ma trận biến đổi phối cảnh có một điểm biến mất (mặt phẳng ảnh vuông góc với trục x)

Ma trận biến đổi phối cảnh có một điểm biến mất (mặt phẳng ảnh vuông góc với trục y)

Ma trận biến đổi phối cảnh với một điểm biến mất (mặt phẳng ảnh vuông góc với trục ứng dụng)

Ma trận biến đổi phối cảnh có hai điểm triệt tiêu (mặt phẳng ảnh song song với trục y)

Ma trận biến đổi phối cảnh với ba điểm triệt tiêu (mặt phẳng ảnh có vị trí tùy ý)

Phép đo đẳng cự, phép đo độ nhỏ và phép đo chính xác thu được bằng cách kết hợp các phép quay theo sau là phép chiếu từ vô cực. Nếu bạn cần mô tả phép chiếu lên mặt phẳng XOY thì trước tiên bạn cần thực hiện phép biến đổi xoay theo một góc so với trục hoành rồi đến góc so với trục abscissa. Bảng 3.3 thể hiện ma trận biến đổi trimetric. Để thu được ma trận biến đổi dimetric trong đó, ví dụ, các hệ số biến dạng dọc theo trục hoành và trục tung sẽ bằng nhau thì mối quan hệ giữa các góc quay phải tuân theo mối quan hệ

Nghĩa là bằng cách chọn góc , bạn có thể tính góc và xác định ma trận chiếu dimetric. Đối với phép biến đổi đẳng cự, mối quan hệ giữa các góc này chuyển thành các giá trị được xác định chặt chẽ, đó là:

Bảng 3.3 trình bày ma trận biến đổi đẳng cự cũng như ma trận chiếu đẳng cự lên mặt phẳng XOY. Sự cần thiết của ma trận loại đầu tiên nằm ở việc sử dụng chúng trong các thuật toán loại bỏ các phần tử vô hình.

Trong các hình chiếu xiên, các đường thẳng chiếu tạo thành một góc với mặt phẳng chiếu khác 90 độ. Bảng 3.3 trình bày ma trận tổng quát của phép chiếu xiên lên mặt phẳng XOY cũng như các ma trận phép chiếu tự do và ma trận hình chiếu tủ, trong đó:

Các phép chiếu phối cảnh (Bảng 3.3) còn được thể hiện bằng các phép biến đổi phối cảnh và các phép chiếu phối cảnh trên mặt phẳng XOY. V X, V Y và V Z là các tâm chiếu - các điểm trên các trục tương ứng. –V X, -V Y, -V Z sẽ là các điểm mà tại đó các bó đường thẳng song song với các trục tương ứng hội tụ.

Hệ tọa độ của người quan sát là bên trái hệ tọa độ (Hình 3.3), trong đó trục z e hướng từ điểm nhìn về phía trước, trục x e hướng sang phải và trục y e hướng lên trên. Quy tắc này được áp dụng để đảm bảo trục x e và y e trùng với trục x s và y s trên màn hình. Việc xác định các giá trị tọa độ màn hình x s và y s cho điểm P dẫn đến việc phải chia cho tọa độ z e. Để xây dựng một hình ảnh phối cảnh chính xác, cần chia cho tọa độ độ sâu của từng điểm.

Bảng 3.4 thể hiện các giá trị của ký hiệu đỉnh S(X,Y,Z) của mô hình (Hình 2.1) chịu các phép biến đổi xoay và phép biến đổi đẳng cự.

Bảng 3.4.Mô tả đỉnh của mô hình

Mô hình ban đầu

M(R(z,90))xM(R(y,90))

Động cơ không làm tàu ​​di chuyển. Con tàu vẫn ở nguyên vị trí và động cơ di chuyển vũ trụ so với nó.

Cái này rất một phần quan trọng bài học, hãy chắc chắn rằng bạn đã đọc nó nhiều lần và hiểu rõ nó.

Toạ độ đồng nhất

Cho đến nay, chúng ta đã coi các đỉnh 3 chiều là bộ ba (x, y, z). Hãy giới thiệu một tham số khác w và hoạt động với các vectơ có dạng (x, y, z, w).

Hãy nhớ mãi rằng:

  • Nếu w == 1 thì vectơ (x, y, z, 1) là một vị trí trong không gian.
  • Nếu w == 0 thì vectơ (x, y, z, 0) là hướng.

Điều này mang lại cho chúng ta điều gì? Được rồi, đối với phép quay, điều này không thay đổi gì cả, vì cả trong trường hợp quay điểm và trong trường hợp quay vectơ chỉ phương, bạn đều nhận được kết quả như nhau. Tuy nhiên, có sự khác biệt trong trường hợp chuyển nhượng. Dịch vectơ chỉ phương sẽ cho cùng một vectơ. Chúng ta sẽ nói nhiều hơn về điều này sau.

Tọa độ đồng nhất cho phép chúng ta, sử dụng một công thức toán học hoạt động với vectơ trong cả hai trường hợp.

Ma trận chuyển đổi

Giới thiệu về ma trận

Cách dễ nhất để hình dung một ma trận là một mảng các số, với số hàng và cột được xác định chặt chẽ. Ví dụ: ma trận 2x3 trông như thế này:

Tuy nhiên, trong đồ họa 3D chúng tôi sẽ chỉ sử dụng ma trận 4x4 cho phép chúng tôi biến đổi các đỉnh của mình (x, y, z, w). Đỉnh được biến đổi là kết quả của việc nhân ma trận với chính đỉnh đó:

Ma trận x Vertex (theo thứ tự đó!!) = Biến đổi. đỉnh

Khá đơn giản. Chúng ta sẽ sử dụng tính năng này khá thường xuyên nên việc để máy tính thực hiện việc đó là điều hợp lý:

Trong C++, sử dụng GLM:

glm::mat4 myMatrix; glm::vec4 myVector; glm:: // Hãy chú ý đến thứ tự! Anh ấy rất quan trọng!

Trong GLSL:

mat4 myMatrix; vec4 myVector ; // Đừng quên điền vào ma trận và vector các giá trị cần thiết tại đây vec4 TransformVector = myMatrix * myVector ; // Vâng, nó rất giống với GLM :)

Hãy thử trải nghiệm với những đoạn này.

Ma trận chuyển giao

Ma trận chuyển giao trông như thế này:

trong đó X, Y, Z là các giá trị chúng ta muốn thêm vào vectơ của mình.

Vì vậy, nếu chúng ta muốn di chuyển vectơ (10, 10, 10, 1) đi 10 đơn vị theo hướng X, chúng ta sẽ có:

... ta được (20, 10, 10, 1) một vectơ đồng nhất! Hãy nhớ rằng số 1 trong tham số w có nghĩa là vị trí chứ không phải hướng và phép biến đổi của chúng ta không thay đổi thực tế là chúng ta đang làm việc với vị trí.

Bây giờ hãy xem điều gì xảy ra nếu vectơ (0, 0, -1, 0) biểu thị một hướng:

... và chúng ta nhận được vectơ ban đầu (0, 0, -1, 0). Như đã nói trước đó, một vectơ có tham số w = 0 không thể được truyền đi.

Bây giờ là lúc để đưa nó vào mã.

Trong C++, với GLM:

#bao gồm // sau đó glm::mat4 myMatrix = glm::translate(glm::mat4(), glm::vec3(10.0 f, 0.0 f, 0.0 f)); glm::vec4 myVector(10,0 f, 10,0 f, 10,0 f, 0,0 f); glm::vec4 TransformVector = myMatrix * myVector ;

Trong GLSL:

vec4 TransformVector = myMatrix * myVector ;

Trên thực tế, bạn sẽ không bao giờ thực hiện việc này trong trình đổ bóng, thông thường bạn sẽ thực hiện glm::translate() trong C++ để tính toán ma trận, chuyển nó tới GLSL, sau đó thực hiện phép nhân trong trình đổ bóng

Ma trận đơn vị

Đây là một ma trận đặc biệt không làm gì cả, nhưng chúng ta sẽ đề cập đến nó vì điều quan trọng cần nhớ là A nhân 1,0 bằng A:

Trong C++:

glm::mat4 myIdentityMatrix = glm::mat4(1.0 f);

Ma trận tỷ lệ

Nó trông rất đơn giản:

Vì vậy, nếu bạn muốn áp dụng tỷ lệ vectơ (vị trí hoặc hướng - không thành vấn đề) thêm 2.0 theo mọi hướng, thì bạn cần:

Lưu ý rằng w không thay đổi và cũng lưu ý rằng ma trận đẳng thức là trương hợp đặc biệt ma trận tỷ lệ có hệ số tỷ lệ bằng 1 trên tất cả các trục. Ngoài ra, ma trận nhận dạng là trường hợp đặc biệt của ma trận truyền, trong đó (X, Y, Z) = (0, 0, 0), tương ứng.

Trong C++:

// thêm #include và #include glm::mat4 myScalingMatrix = glm::scale(2.0 f, 2.0 f, 2.0 f);

Ma trận xoay

Phức tạp hơn những gì đã thảo luận trước đó. Chúng tôi sẽ bỏ qua các chi tiết ở đây vì bạn không cần biết chính xác điều này để sử dụng hàng ngày. Để có được nhiều hơn thông tin chi tiết bạn có thể theo liên kết Câu hỏi thường gặp về Ma trận và Quaternions (một tài nguyên khá phổ biến và ngôn ngữ của bạn có thể có sẵn ở đó)

Trong C++:

// thêm #include và #include glm::vec3 myRotationAxis(??, ??, ??); glm::rotate(angle_in_degrees, myRotationAxis);

Tập hợp các phép biến đổi

Vì vậy, bây giờ chúng ta có thể xoay, dịch và chia tỷ lệ vectơ của mình. Bước tiếp theo Sẽ rất tốt nếu kết hợp các phép biến đổi, được thực hiện bằng công thức sau:

TransformedVector = TranslationMatrix * RotationMatrix * ScalMatrix * OriginalVector ;

CHÚ Ý! Công thức này thực sự cho thấy rằng việc chia tỷ lệ được thực hiện trước tiên, sau đó mới thực hiện xoay và cuối cùng là dịch thuật được thực hiện. Đây chính xác là cách hoạt động của phép nhân ma trận.

Hãy nhớ nhớ tất cả những điều này được thực hiện theo thứ tự nào, vì thứ tự thực sự quan trọng, sau cùng, bạn có thể tự kiểm tra:

  • Tiến lên một bước và rẽ trái
  • Rẽ trái và tiến một bước

Sự khác biệt thực sự quan trọng để hiểu vì bạn sẽ gặp phải điều này mọi lúc. Ví dụ: khi bạn làm việc với các nhân vật trong trò chơi hoặc một số đối tượng, hãy luôn chia tỷ lệ trước, sau đó xoay và chỉ sau đó dịch.

Trên thực tế, thứ tự trên là thứ bạn thường cần cho các nhân vật trong trò chơi và các vật phẩm khác: chia tỷ lệ trước nếu cần; sau đó bạn đặt hướng của nó và sau đó di chuyển nó. Ví dụ: đối với mô hình tàu (xoay được loại bỏ để đơn giản):

  • Nhầm đường:
    • Bạn di chuyển tàu tới (10, 0, 0). Trung tâm của nó bây giờ cách điểm gốc 10 đơn vị.
    • Bạn tăng quy mô tàu của mình lên 2 lần. Mỗi tọa độ được nhân với 2 “so với gốc”, tức là xa... Vì vậy, bạn kết thúc ở một con tàu lớn, nhưng tâm của nó là 2 * 10 = 20. Không phải như bạn mong muốn.
  • Cách đúng đắn:
    • Bạn tăng quy mô tàu của mình lên 2 lần. Bạn nhận được một con tàu lớn, tập trung ở điểm gốc.
    • Bạn đang di chuyển con tàu của bạn. Nó vẫn có cùng kích thước và ở khoảng cách chính xác.

Trong C++, với GLM:

glm::mat4 myModelMatrix = myTranslationMatrix * myRotationMatrix * myScaleMatrix ; glm::vec4 myTransformedVector = myModelMatrix * myOriginalVector ;

Trong GLSL:

biến đổi mat4 = mat2 * mat1; vec4 out_vec = biến đổi * in_vec ;

Ma trận thế giới, chế độ xem và phép chiếu

Trong phần còn lại của hướng dẫn này, chúng ta sẽ giả sử rằng chúng ta biết cách kết xuất mô hình 3D yêu thích của Blender, Suzanne the Monkey.

Ma trận thế giới, chế độ xem và phép chiếu là công cụ tiện dụngđể phân biệt các phép biến đổi.

Ma trận thế giới

Mô hình này, giống như tam giác màu đỏ của chúng ta, được xác định bởi một tập hợp các đỉnh, tọa độ của chúng được cho tương ứng với tâm của đối tượng, tức là đỉnh có tọa độ (0, 0, 0) sẽ nằm ở tâm của đối tượng. sự vật.

Tiếp theo, chúng tôi muốn di chuyển mô hình của mình khi người chơi điều khiển nó bằng bàn phím và chuột. Tất cả những gì chúng tôi làm là áp dụng tỷ lệ, sau đó xoay và dịch. Những hành động này được thực hiện cho từng đỉnh, trong từng khung hình (được thực hiện trong GLSL, không phải trong C++!) và do đó mô hình của chúng ta di chuyển trên màn hình.

Bây giờ đỉnh cao của chúng tôi trong không gian thế giới. Điều này được thể hiện bằng mũi tên màu đen trong hình. Chúng ta đã chuyển từ không gian đối tượng (tất cả các đỉnh được xác định tương đối với tâm của đối tượng) sang không gian thế giới (tất cả các đỉnh được xác định tương đối với tâm của thế giới).

Điều này được thể hiện dưới dạng sơ đồ như thế này:

Xem ma trận

Để trích dẫn Futurama một lần nữa:

Động cơ không làm tàu ​​di chuyển. Con tàu vẫn ở nguyên chỗ cũ và động cơ di chuyển vũ trụ xung quanh nó.

Hãy thử tưởng tượng điều này liên quan đến một chiếc máy ảnh. Ví dụ, nếu bạn muốn chụp ảnh một ngọn núi, bạn không di chuyển máy ảnh, bạn di chuyển ngọn núi. Điều này là không thể ở đời thực, nhưng nó cực kỳ đơn giản trong đồ họa máy tính.

Vì vậy, ban đầu máy ảnh của bạn nằm ở trung tâm của hệ tọa độ thế giới. Để di chuyển thế giới, bạn cần nhập một ma trận khác. Giả sử bạn muốn di chuyển camera 3 đơn vị sang PHẢI (+X), tương đương với việc di chuyển toàn bộ thế giới 3 đơn vị sang TRÁI (-X). Trong mã nó trông như thế này:

// Thêm #include và #include glm::mat4 ViewMatrix = glm::translate(glm::mat4(), glm::vec3(-3.0 f, 0.0 f, 0.0 f));

Một lần nữa, hình ảnh dưới đây cho thấy điều này đầy đủ. Chúng tôi đã chuyển từ hệ tọa độ thế giới (tất cả các đỉnh được đặt tương đối với tâm của hệ thế giới) sang hệ tọa độ camera (tất cả các đỉnh được đặt tương đối với camera):

Và trong khi bộ não của bạn đang xử lý điều này, chúng ta sẽ xem xét chức năng mà GLM cung cấp cho chúng ta, cụ thể hơn là glm::LookAt:

glm::mat4 CameraMatrix = glm::LookAt(máy ảnhPosition, // Vị trí camera trong không gian thế giới máy ảnhMục tiêu // Cho biết nơi bạn đang tìm kiếm trong không gian thế giới upVector // Một vectơ chỉ hướng đi lên. Thông thường (0, 1, 0));

Và đây là sơ đồ cho thấy những gì chúng tôi làm:

Tuy nhiên, đây không phải là kết thúc.

Ma trận chiếu

Vì vậy, bây giờ chúng ta đang ở trong không gian máy ảnh. Điều này có nghĩa là đỉnh nhận tọa độ x == 0 và y == 0 sẽ hiển thị ở giữa màn hình. Tuy nhiên, khi hiển thị một vật thể, khoảng cách tới camera (z) cũng đóng vai trò rất lớn. Đối với hai đỉnh có cùng x và y, đỉnh có giá trị z lớn hơn sẽ xuất hiện gần hơn đỉnh kia.

Đây được gọi là phép chiếu phối cảnh:

Và thật may mắn cho chúng ta, ma trận 4x4 có thể thực hiện phép chiếu này:

// Tạo một ma trận rất khó đọc nhưng vẫn là ma trận 4x4 tiêu chuẩn glm::mat4 chiếuMatrix = glm::phối cảnh (glm::radians (FoV), // Trường nhìn dọc tính bằng radian. Thông thường từ 90° (rất rộng) đến 30° (hẹp) 4.0 f/3.0 f // Tỷ lệ khung hình. Phụ thuộc vào kích thước cửa sổ của bạn. Lưu ý rằng 4/3 == 800/600 == 1280/960 0,1 giây // Gần mặt phẳng cắt. Phải lớn hơn 0. 100,0f // Mặt phẳng cắt xa.);

Chúng tôi đã chuyển từ Không gian máy ảnh (tất cả các đỉnh được xác định tương ứng với máy ảnh) sang Không gian đồng nhất (tất cả các đỉnh đều nằm trong một khối lập phương nhỏ. Mọi thứ bên trong khối đều được hiển thị trên màn hình).

Bây giờ chúng ta hãy nhìn vào hình ảnh sau đây, để bạn có thể hiểu rõ hơn điều gì đang xảy ra với phép chiếu. Trước khi chiếu, chúng ta có các vật thể màu xanh lam trong không gian camera, trong khi hình màu đỏ hiển thị chế độ xem camera, tức là mọi thứ mà camera nhìn thấy.

Sử dụng Ma trận chiếu sẽ mang lại hiệu quả sau:

Trong hình ảnh này, chế độ xem camera là một khối lập phương và tất cả các vật thể đều bị biến dạng. Những vật thể ở gần máy ảnh hơn sẽ có vẻ lớn và những vật thể ở xa hơn sẽ có vẻ nhỏ. Giống như trong thực tế!

Nó sẽ trông như thế này:

Ảnh là hình vuông nên các phép biến đổi toán học sau đây được áp dụng để kéo dãn ảnh theo kích thước hiện tại cửa sổ:

Và hình ảnh này là những gì thực sự sẽ được xuất ra.

Kết hợp các phép biến đổi: Ma trận ModelViewProjection

... Chỉ là những phép biến đổi ma trận tiêu chuẩn mà bạn đã yêu thích!

// C++ : tính toán ma trận glm::mat4 MVPmatrix = chiếu * xem * mô hình; // Nhớ! TRONG thứ tự ngược lại!

// GLSL: Áp dụng ma trận Transform_vertex = MVP * in_vertex ;

Để tất cả chúng cùng nhau

  • Bước đầu tiên là tạo ma trận MVP của chúng tôi. Điều này phải được thực hiện cho từng mô hình bạn hiển thị.

// Ma trận ném: góc nhìn 45°, tỷ lệ khung hình 4:3, phạm vi: 0,1 đơn vị<->100 đơn vị glm::mat4 Phép chiếu = glm::perspective(glm::radians(45.0 f), 4.0 f / 3.0 f, 0.1 f, 100.0 f); // Hoặc, đối với máy ảnh trực giao glm::mat4 Xem = glm::lookAt(glm::vec3(4, 3, 3), // Camera nằm trong tọa độ thế giới (4,3,3) glm::vec3(0, 0, 0), // Và hướng về điểm gốc glm::vec3(0, 1, 0) // "Đầu" ở trên cùng); // Ma trận mô hình: ma trận nhận dạng (Mô hình ở gốc) glm::mat4 Model = glm::mat4(1.0 f); // Riêng cho từng model // Ma trận ModelViewProjection cuối cùng, là kết quả của việc nhân ba ma trận của chúng ta glm::mat4 MVP = Chiếu * Xem * Mô hình ; // Hãy nhớ rằng phép nhân ma trận được thực hiện theo thứ tự ngược lại

  • Bước thứ hai là chuyển cái này tới GLSL:

// Lấy phần xử lý biến trong shader // Chỉ một lần trong quá trình khởi tạo. GLuint MatrixID = glGetUniformLocation(programID, "MVP"); // Chuyển các phép biến đổi của chúng ta sang trình đổ bóng hiện tại // Việc này được thực hiện trong vòng lặp chính, vì mỗi mô hình sẽ có một ma trận MVP khác nhau (ít nhất là phần M) glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]);

  • Bước thứ ba là sử dụng dữ liệu nhận được trong GLSL để chuyển đổi các đỉnh của chúng ta.

// Dữ liệu đầu vào của Vertex, khác nhau đối với tất cả các lần thực thi của trình đổ bóng này. bố cục (location = 0 ) trong vec3 vertexPosition_modelspace ; // Các giá trị không đổi trên toàn bộ lưới.đồng phục mat4 MVP; khoảng trống chính ()( // Vị trí đầu ra của đỉnh của chúng tôi: MVP * vị trí gl_Position = MVP * vec4(vertexPosition_modelspace, 1); )

  • Sẵn sàng! Bây giờ chúng ta có tam giác giống như trong Bài 2, vẫn nằm ở gốc tọa độ (0, 0, 0), nhưng bây giờ chúng ta nhìn nó theo phối cảnh từ điểm (4, 3, 3).

Trong Bài học 6, bạn sẽ học cách thay đổi các giá trị này một cách linh hoạt bằng cách sử dụng bàn phím và chuột để tạo ra camera mà bạn thường thấy trong trò chơi. Nhưng trước tiên, chúng ta sẽ học cách tạo màu sắc cho mô hình (Bài 4) và họa tiết (Bài 5).

Nhiệm vụ

  • Hãy thử thay đổi giá trị glm::perspective
  • Thay vì sử dụng phép chiếu phối cảnh, hãy thử sử dụng phép chiếu trực giao (glm:ortho)
  • Sửa đổi ModelMatrix để di chuyển, xoay và chia tỷ lệ hình tam giác
  • Sử dụng tác vụ trước đó, nhưng với theo thứ tự khác nhau hoạt động. Hãy chú ý đến kết quả.

Tại một thời điểm nào đó, bất kỳ nhà phát triển nào trong lĩnh vực này đô họa may tinh Câu hỏi đặt ra là: những ma trận hứa hẹn này hoạt động như thế nào? Đôi khi rất khó tìm ra câu trả lời và như thường lệ, phần lớn các nhà phát triển bỏ cuộc giữa chừng.

Đây không phải là một giải pháp cho vấn đề! Chúng ta hãy cùng nhau tìm ra nó!

Hãy thực tế với thành kiến ​​thực tế và lấy làm đối tượng thử nghiệm Các phiên bản OpenGL 3.3. Bắt đầu từ phiên bản này, mỗi nhà phát triển được yêu cầu triển khai mô-đun một cách độc lập phép toán ma trận. Tuyệt vời, đây là những gì chúng ta cần. Hãy để chúng tôi phân tích nhiệm vụ khó khăn của chúng tôi và nêu bật những điểm chính. Một số sự kiện từ đặc tả OpenGL:

  • Ma trận được lưu trữ trong các cột (cột chính);
  • Toạ độ đồng nhất;
  • Khối lượng cắt chuẩn (CVV) trong hệ tọa độ thuận tay trái.
Có hai cách để lưu trữ ma trận: cột lớn và hàng chính. Trong các bài giảng về đại số tuyến tính, sơ đồ hàng lớn được sử dụng. Qua nhìn chung Việc biểu diễn ma trận trong bộ nhớ không thành vấn đề, vì ma trận luôn có thể được chuyển đổi từ biểu diễn này sang biểu diễn khác bằng cách hoán vị đơn giản. Và vì không có sự khác biệt nên đối với tất cả các phép tính tiếp theo, chúng ta sẽ sử dụng các ma trận hàng lớn cổ điển. Khi lập trình OpenGL có thủ thuật nhỏ, cho phép bạn từ chối chuyển vị ma trận trong khi vẫn duy trì các phép tính chính theo hàng cổ điển. Ma trận phải được chuyển sang chương trình đổ bóng như hiện tại và trong trình đổ bóng, phép nhân không được thực hiện giữa vectơ và ma trận mà giữa ma trận và vectơ.

Tọa độ đồng nhất không phải là một hệ thống quá phức tạp với một số quy tắc đơn giản về việc chuyển đổi tọa độ Descartes thông thường thành tọa độ đồng nhất và ngược lại. Tọa độ đồng nhất là ma trận hàng có chiều. Để chuyển tọa độ Descartes thành tọa độ đồng nhất, cần phải x, yz nhân với bất kỳ số thực w(trừ 0). Tiếp theo, bạn cần viết kết quả vào ba thành phần đầu tiên và thành phần cuối cùng sẽ bằng số nhân w. Nói cách khác:
- Tọa độ Descartes
w– số thực không bằng 0

- toạ độ đồng nhất

Một mẹo nhỏ: Nếu w bằng 1 thì tất cả những gì cần thiết cho việc dịch thuật là chuyển các thành phần x, yz và gán một cho thành phần cuối cùng. Tức là lấy một ma trận hàng:

Một vài lời về chất lượng bằng không w. Từ quan điểm tọa độ đồng nhất, điều này hoàn toàn có thể chấp nhận được. Tọa độ đồng nhất cho phép bạn phân biệt giữa các điểm và vectơ. Trong hệ tọa độ Descartes, việc phân chia như vậy là không thể.

- điểm ở đâu ( XYZ) – tọa độ Descartes

- vectơ, ở đâu ( XYZ) – vectơ bán kính

Việc dịch ngược một đỉnh từ tọa độ đồng nhất sang tọa độ Descartes được thực hiện như sau. Tất cả các thành phần của ma trận hàng phải được chia cho thành phần cuối cùng. Nói cách khác:

- toạ độ đồng nhất
- Tọa độ Descartes

Điều chính bạn cần biết là tất cả các thuật toán cắt và rasterization OpenGL đều hoạt động theo tọa độ Descartes, nhưng trước đó tất cả các phép biến đổi đều được thực hiện theo tọa độ đồng nhất. Việc chuyển đổi từ tọa độ đồng nhất sang tọa độ Descartes được thực hiện bằng phần cứng.

Khối lượng cắt Canonical (CVV) là một trong những phần ít được ghi lại nhất của OpenGL. Như có thể thấy từ hình. 1 CVV là một khối lập phương thẳng hàng có tâm ở gốc và có chiều dài cạnh bằng hai. Mọi thứ nằm trong khu vực CVV đều phải được rasterization, mọi thứ nằm ngoài CVV đều bị bỏ qua. Bất cứ điều gì nằm ngoài CVV một phần đều phải tuân theo thuật toán cắt tỉa. Điều quan trọng nhất bạn cần biết là hệ tọa độ CVV thuận tay trái!


Cơm. 1. Khối lượng cắt Canonical OpenGL (CVV)

Hệ tọa độ thuận tay trái? Làm sao điều này có thể xảy ra được, vì thông số kỹ thuật cho OpenGL 1.0 nêu rõ rằng hệ tọa độ được sử dụng là thuận tay phải? Hãy tìm ra nó.


Cơm. 2. Hệ tọa độ

Như có thể thấy từ hình. 2 hệ tọa độ chỉ khác nhau về hướng trục Z. OpenGL 1.0 thực sự sử dụng thuận tay phải hệ thống người dùng tọa độ Nhưng hệ tọa độ CVV và hệ tọa độ người dùng là hai thứ hoàn toàn khác nhau. Hơn nữa, kể từ phiên bản 3.3, không còn có thứ như hệ thống tiêu chuẩn Tọa độ OpenGL. Như đã đề cập trước đó, lập trình viên tự thực hiện mô-đun hoạt động ma trận. Hình thành ma trận quay, hình thành ma trận chiếu, tìm ma trận nghịch đảo, nhân ma trận đều đặt tối thiểu các hoạt động có trong mô-đun hoạt động ma trận. Hai câu hỏi hợp lý phát sinh. Nếu khối lượng hiển thị là một khối lập phương có chiều dài cạnh bằng hai, thì tại sao một cảnh có kích thước vài nghìn đơn vị lại hiển thị trên màn hình? Tại thời điểm nào hệ tọa độ người dùng chuyển đổi sang hệ tọa độ CVV? Ma trận chiếu chính xác là thực thể giải quyết những vấn đề này.

Ý tưởng chính ở trên là bản thân nhà phát triển được tự do lựa chọn loại hệ tọa độ người dùng và phải mô tả chính xác các ma trận chiếu. Điều này hoàn thiện thông tin về OpenGL và đã đến lúc kết hợp mọi thứ lại với nhau.

Một trong những ma trận phổ biến và khó hiểu nhất là ma trận biến đổi phối cảnh. Vậy nó liên quan như thế nào đến CVV và hệ tọa độ người dùng? Tại sao các vật thể trở nên nhỏ hơn khi khoảng cách của chúng với người quan sát tăng lên? Để hiểu lý do tại sao các vật thể co lại khi khoảng cách tăng lên, chúng ta hãy xem xét từng bước biến đổi ma trận của mô hình 3D. Không có gì bí mật khi bất kỳ mô hình ba chiều nào cũng bao gồm một danh sách hữu hạn các đỉnh trải qua các phép biến đổi ma trận hoàn toàn độc lập với nhau. Để xác định tọa độ của đỉnh ba chiều trên màn hình điều khiển hai chiều, bạn cần:

  1. Chuyển đổi tọa độ Descartes thành tọa độ đồng nhất;
  2. Nhân tọa độ đồng nhất với ma trận mô hình;
  3. Kết quả được nhân với ma trận khung nhìn;
  4. Nhân kết quả với ma trận chiếu;
  5. Chuyển đổi kết quả từ tọa độ đồng nhất sang tọa độ Descartes.
Việc chuyển đổi tọa độ Descartes thành tọa độ đồng nhất đã được thảo luận trước đó. Ý nghĩa hình học của ma trận mô hình là dịch mô hình từ hệ thống cục bộ tọa độ trong hệ thống toàn cầu tọa độ Hoặc, như người ta nói, di chuyển các đỉnh ra khỏi không gian mô hình vào không gian thế giới. Nói một cách đơn giản, một đối tượng ba chiều được tải từ một tệp sẽ nằm trong không gian mô hình, nơi tọa độ được đo tương ứng với chính đối tượng đó. Tiếp theo, sử dụng ma trận mô hình, mô hình được định vị, thu nhỏ và xoay. Kết quả là tất cả các đỉnh của mô hình 3D đều nhận được tọa độ đồng nhất thực tế trong cảnh 3D. Không gian mô hình so với không gian thế giới có tính chất cục bộ. Từ không gian mô hình, tọa độ được chuyển sang không gian thế giới (từ cục bộ sang toàn cầu). Với mục đích này, một ma trận mô hình được sử dụng.

Bây giờ chúng ta hãy chuyển sang bước thứ ba. Đây là nơi không gian xem phát huy tác dụng. Trong không gian này, tọa độ được đo tương ứng với vị trí và hướng của người quan sát như thể anh ta là trung tâm của thế giới. Không gian xem mang tính cục bộ so với không gian thế giới, do đó tọa độ phải được nhập vào đó (và không được lấy ra, như trong trường hợp trước). Phép biến đổi ma trận trực tiếp sẽ loại bỏ tọa độ khỏi một số không gian. Ngược lại, để đưa chúng vào trong nó phải đảo ngược phép biến đổi ma trận, do đó phép biến đổi kiểu được mô tả bằng ma trận nghịch đảo. Làm thế nào để có được điều này ma trận nghịch đảo? Đầu tiên, hãy lấy ma trận người quan sát trực tiếp. Điều gì đặc trưng cho một người quan sát? Người quan sát được mô tả bằng tọa độ nơi anh ta đang ở và các vectơ chỉ hướng quan sát. Người quan sát luôn nhìn theo hướng trục địa phương của mình Z. Người quan sát có thể di chuyển xung quanh hiện trường và thay phiên nhau. Theo nhiều cách, điều này giống với ý nghĩa của ma trận mô hình. Nhìn chung thì nó là như thế này. Tuy nhiên, đối với người quan sát, thao tác chia tỷ lệ là vô nghĩa, do đó không thể đặt dấu bằng giữa ma trận mô hình của người quan sát và ma trận mô hình của đối tượng ba chiều. Ma trận mô hình của người quan sát là ma trận trực tiếp mong muốn. Bằng cách đảo ngược ma trận này, chúng ta thu được ma trận khung nhìn. Trong thực tế, điều này có nghĩa là tất cả các đỉnh trong tọa độ đồng nhất toàn cầu sẽ nhận được tọa độ đồng nhất mới so với người quan sát. Theo đó, nếu người quan sát nhìn thấy một đỉnh nào đó thì giá trị của tọa độ đồng nhất z của một đỉnh nhất định trong không gian xem chắc chắn sẽ là một số dương. Nếu đỉnh ở phía sau người quan sát thì giá trị tọa độ đồng nhất của nó z trong không gian xem chắc chắn sẽ là số âm.

Bước bốn là bước thú vị nhất. Các bước trướcđã được thảo luận chi tiết một cách có chủ ý để người đọc có được bức tranh hoàn chỉnh về tất cả các toán hạng của bước thứ tư. Ở bước thứ tư, tọa độ đồng nhất được chuyển từ không gian xem sang không gian CVV. Một lần nữa, thực tế được nhấn mạnh là tất cả các đỉnh có khả năng nhìn thấy được sẽ có giá trị dương của tọa độ đồng nhất. z.

Xét ma trận có dạng:

Và một điểm trong không gian đồng nhất của người quan sát:

Hãy nhân tọa độ đồng nhất với ma trận được đề cập:

Hãy chuyển đổi tọa độ đồng nhất thu được thành tọa độ Descartes:

Giả sử có hai điểm trong không gian xem có cùng tọa độ xy, nhưng có tọa độ khác nhau z. Nói cách khác, một trong những điểm nằm phía sau điểm kia. Do sự biến dạng của phối cảnh, người quan sát phải nhìn thấy cả hai điểm. Thật vậy, rõ ràng từ công thức là do phép chia cho tọa độ z, quá trình nén xảy ra tại điểm gốc. Làm sao nhiều giá trị hơn z(điểm càng xa người quan sát), lực nén càng mạnh. Đây là lời giải thích cho hiệu ứng phối cảnh.

Đặc tả OpenGL nêu rõ rằng các thao tác cắt và rasterization được thực hiện theo tọa độ Descartes và quá trình chuyển đổi tọa độ đồng nhất sang tọa độ Descartes được thực hiện tự động.

Ma trận (1) là mẫu cho ma trận chiếu phối cảnh. Như đã đề cập trước đó, nhiệm vụ của ma trận chiếu bao gồm hai điểm: thiết lập hệ tọa độ người dùng (thuận tay trái hoặc tay phải), chuyển khối lượng hiển thị của người quan sát sang CVV. Hãy rút ra ma trận phối cảnh cho hệ tọa độ người dùng thuận tay trái.

Ma trận chiếu có thể được mô tả bằng bốn tham số (Hình 3):

  • Góc nhìn tính bằng radian ( lá cải);
  • Tỷ lệ khung hình ( diện mạo);
  • Khoảng cách đến mặt phẳng cắt gần nhất ( N);
  • Khoảng cách đến mặt phẳng cắt xa ( f).


Cơm. 3. Khối lượng tầm nhìn phối cảnh

Chúng ta hãy xem xét hình chiếu của một điểm trong không gian của người quan sát lên cạnh trước của điểm giới hạn của tầm nhìn phối cảnh. Để rõ ràng hơn, trong hình. 4 cho thấy một cái nhìn bên. Cũng cần lưu ý rằng hệ tọa độ người dùng trùng với hệ tọa độ CVV, tức là hệ tọa độ thuận tay trái được sử dụng ở mọi nơi.


Cơm. 4. Chiếu một điểm tùy ý

Dựa vào tính chất của các tam giác đồng dạng, các đẳng thức sau đây đúng:

Hãy biểu diễn yꞌ và xꞌ:

Về nguyên tắc, biểu thức (2) là đủ để thu được tọa độ của các điểm chiếu. Tuy nhiên, để sàng lọc chính xác các vật thể ba chiều, bạn cần biết độ sâu của từng mảnh. Nói cách khác, cần lưu trữ giá trị của thành phần z. Đây là giá trị được sử dụng cho các bài kiểm tra độ sâu OpenGL. Trong bộ lễ phục. 3 rõ ràng là giá trị zꞌ không phù hợp làm độ sâu phân đoạn, bởi vì tất cả các phép chiếu điểm có thể cùng giá trị zꞌ. Cách thoát khỏi tình huống này là sử dụng cái gọi là độ sâu giả.

Thuộc tính giả độ sâu:

  1. Độ sâu giả được tính toán dựa trên giá trị z;
  2. Điểm càng gần người quan sát thì độ sâu giả càng có ít giá trị;
  3. Tất cả các điểm nằm trên mặt phẳng phía trước của khối hiển thị đều có giá trị độ sâu giả là -1;
  4. Tất cả các điểm nằm trên mặt phẳng cắt xa của khối hiển thị đều có giá trị độ sâu giả là 1;
  5. Tất cả các mảnh nằm bên trong khối hiển thị đều có giá trị độ sâu giả trong phạm vi [-1 1].
Chúng ta hãy rút ra công thức tính toán độ sâu giả. Hãy lấy biểu thức sau làm cơ sở:

Tỷ lệ cược Mộtb cần phải được tính toán. Để làm điều này, chúng tôi sử dụng các thuộc tính của giả độ sâu 3 và 4. Chúng tôi thu được hệ hai phương trình với hai ẩn số:

Hãy cộng cả hai phần của hệ thống và nhân kết quả với sản phẩm fn, trong đó fN không thể bằng không. Chúng tôi nhận được:

Chúng ta hãy mở ngoặc và sắp xếp lại các thuật ngữ sao cho chỉ phần có MỘT, và ở bên phải chỉ với b:

Thay (6) vào (5). Hãy chuyển đổi biểu thức thành một phân số đơn giản:

Nhân cả hai vế với -2fn, trong đó fN không thể bằng không. Hãy trình bày những từ tương tự, sắp xếp lại các thuật ngữ và diễn đạt b:

Thay (7) vào (6) và biểu diễn Một:

Theo đó các thành phần Mộtbđều bằng nhau:

Bây giờ hãy thay các hệ số thu được vào ma trận phôi (1) và xem điều gì sẽ xảy ra với tọa độ z cho một điểm tùy ý trong không gian đồng nhất của người quan sát. Việc thay thế được thực hiện như sau:

Để khoảng cách đến mặt phẳng cắt phía trước N bằng 2 và khoảng cách đến mặt phẳng cắt xa f bằng 10. Xét năm điểm trong không gian đồng nhất của người quan sát:

Sắp xếp lẫn nhauđiểm và khối lượng tầm nhìn
chấm Nghĩa Sự miêu tả
1 1 Điểm nằm ở phía trước mặt phẳng cắt phía trước của khối hiển thị. Không vượt qua quá trình rasterization.
2 2 Điểm này nằm ở cạnh trước của phần giới hạn mức hiển thị. Đang trải qua quá trình rasterization.
3 5 Điểm nằm giữa cạnh cắt phía trước và cạnh cắt xa của khối hiển thị. Đang trải qua quá trình rasterization.
4 10 Điểm này nằm ở rìa xa của giới hạn mức hiển thị. Đang trải qua quá trình rasterization.
5 20 Điểm nằm ngoài rìa xa của giới hạn mức hiển thị. Không vượt qua quá trình rasterization.

Hãy nhân tất cả các điểm với ma trận (8), sau đó chuyển đổi tọa độ đồng nhất thu được thành tọa độ Descartes . Để làm được điều này, chúng ta cần tính giá trị của các thành phần đồng nhất mới .
Điểm 1:

Lưu ý rằng tọa độ đồng nhất được định vị hoàn toàn chính xác trong CVV và quan trọng nhất là giờ đây có thể thực hiện kiểm tra độ sâu OpenGL vì độ sâu giả đáp ứng đầy đủ các yêu cầu kiểm tra.

Với tọa độ z Chúng ta đã tìm ra rồi, hãy chuyển sang tọa độ xy. Như đã đề cập trước đó, toàn bộ phạm vi hiển thị phối cảnh phải phù hợp với CVV. Độ dài của cạnh CVV là hai. Theo đó, chiều cao và chiều rộng của tầm nhìn phối cảnh phải được nén thành hai đơn vị thông thường.

Chúng tôi có sẵn một góc lá cải và độ lớn diện mạo. Hãy biểu thị chiều cao và chiều rộng bằng các giá trị này.


Cơm. 5. Khối lượng hiển thị

Từ hình. 5 rõ ràng là:

Bây giờ bạn có thể nhận được cái nhìn cuối cùng ma trận chiếu phối cảnh cho hệ tọa độ thuận tay trái tùy chỉnh hoạt động với CVV OpenGL:

Điều này hoàn thành việc lấy đạo hàm của ma trận.

Đôi lời về DirectX - đối thủ cạnh tranh chính của OpenGL. DirectX chỉ khác với OpenGL ở kích thước của CVV và vị trí của nó. Trong DirectX, CVV là một hình chữ nhật song song có chiều dài dọc theo trục của nó xy bằng hai và dọc theo trục z chiều dài bằng một. Phạm vi xy là [-1 1] và phạm vi z tương đương với . Đối với hệ tọa độ CVV, DirectX, giống như OpenGL, sử dụng hệ tọa độ thuận tay trái.

Để hiển thị ma trận phối cảnh cho hệ tọa độ thuận tay phải tùy chỉnh, bạn cần vẽ lại Hình. 2, Hình 3 và Hình 4 có tính đến hướng trục mới Z. Các tính toán tiếp theo hoàn toàn tương tự, tính đến dấu. Đối với ma trận DirectX, thuộc tính giả độ sâu 3 và 4 được sửa đổi để phù hợp với phạm vi.

Tại thời điểm này, chủ đề về ma trận hứa hẹn có thể coi như đã khép lại.

Để mô tả chi tiết các phương pháp theo dõi đặc điểm điểm, hiệu chỉnh camera và tái tạo đối tượng 3D, cần giới thiệu mô hình thiết kế phối cảnh và mô tả các đặc tính hình học của phép biến đổi này. Các điểm của một số hình ảnh thu được bằng phép chiếu phối cảnh có mối quan hệ đặc biệt với nhau, được mô tả bằng hình học epipole. Các mô hình của những mối quan hệ này phải được xem xét chi tiết, bởi vì Hầu hết tất cả các phương pháp tái tạo ba chiều đều yêu cầu đánh giá các mô hình tương ứng và dựa vào các đặc tính của chúng.

Cần lưu ý riêng giả định rằng tất cả các ảnh nguồn đều chụp cùng một cảnh, tức là. mỗi hình ảnh là một khung cảnh từ một camera cụ thể. Do đó, để thuận tiện cho việc mô tả, khái niệm về một khung nhìn được giới thiệu dưới dạng một hình ảnh với một kiểu máy ảnh liên quan mà từ đó nó thu được.

Phép chiếu phối cảnh

Mô hình chiếu phối cảnh tương ứng với một máy ảnh pinhole lý tưởng. Mô hình này khá phù hợp với quy trình xây dựng hình ảnh trong hầu hết các máy ảnh và video hiện đại. Tuy nhiên, do những hạn chế của quang học hiện đại, quy trình thực tế có phần khác so với mẫu máy ảnh lỗ kim. Sự khác biệt giữa quy trình thực và mô hình được gọi là biến dạng và được mô hình hóa riêng biệt.

Mô hình máy ảnh lỗ kim đơn giản nhất thuận tiện ở chỗ nó được mô tả hoàn toàn bằng tâm chiếu và vị trí của mặt phẳng ảnh. Do đó, hình chiếu của bất kỳ điểm cảnh nào trong ảnh có thể được coi là giao điểm của tia nối tâm hình chiếu và điểm cảnh với mặt phẳng ảnh.

Mô hình chiếu phối cảnh đơn giản nhất

Hãy xem xét trường hợp đơn giản nhất khi tâm chiếu của camera (tiêu điểm) được đặt ở gốc của hệ tọa độ và mặt phẳng ảnh trùng với mặt phẳng Z=1. Gọi (X,Y,Z) là tọa độ của một điểm trong không gian 3 chiều và (x,y) là hình chiếu của điểm này lên ảnh I. Phép chiếu phối cảnh trong trường hợp này được mô tả bằng các phương trình sau:

Ở dạng ma trận sử dụng tọa độ đồng nhất, các phương trình này được viết lại như sau:

(2.2)

Mặt phẳng nằm cách tâm hình chiếu một khoảng 1 và vuông góc với trục quang học được gọi là mặt phẳng ảnh lý tưởng. Trục quang cắt mặt phẳng ảnh lý tưởng tại một điểm c, gọi là điểm chính. Một minh họa về trường hợp đơn giản nhất của phép chiếu phối cảnh được thể hiện trong Hình 2. 1.

Hiệu chỉnh camera nội bộ

Trường hợp chiếu phối cảnh đơn giản nhất hầu như luôn không tương ứng với máy ảnh thật. Khoảng cách từ tâm chiếu tới mặt phẳng ảnh, tức là tiêu cự, ký hiệu là f, thường không bằng 1. Ngoài ra, tọa độ của một điểm trong mặt phẳng ảnh có thể không trùng với tọa độ tuyệt đối. sử dụng máy ảnh kỹ thuật số, mối quan hệ giữa tọa độ của một điểm trong ảnh và tọa độ tuyệt đối của một điểm trên mặt phẳng lý tưởng, được xác định bởi hình dạng và kích thước của các pixel của ma trận.

Chúng ta hãy biểu thị kích thước pixel của ma trận máy ảnh kỹ thuật số là p x , p y , góc nghiêng của pixel là α và điểm chính là , Hình 2. Khi đó tọa độ của điểm (x,y) trong ảnh tương ứng với điểm (x R , y R) trên mặt phẳng lý tưởng được xác định bởi biểu thức:

(2.3)

Nếu f x ,f y là tiêu cự f, được đo bằng chiều rộng và chiều cao pixel và tan(α)*f/py y được ký hiệu là s, thì công thức 2.3 được chuyển thành:

(2.4)

Ma trận K được gọi là ma trận hiệu chuẩn bên trong của máy ảnh. Trong hầu hết các trường hợp, trong máy ảnh kỹ thuật số thực, góc pixel gần như thẳng, tức là. tham số s=0 và chiều rộng và chiều cao của pixel bằng nhau. Điểm chính thường nằm ở trung tâm của hình ảnh. Do đó, ma trận K có thể được viết là:

(2.5)

Giả định này về dạng ma trận K được sử dụng rộng rãi để đơn giản hóa các thuật toán xác định hiệu chuẩn bên trong của máy ảnh, cũng như trong mô hình hình ảnh tổng hợp cần thiết để đánh giá chất lượng và hiệu quả của các phương pháp tái tạo 3D.

Hiệu chỉnh máy ảnh bên ngoài

Cho M là một điểm cảnh trong không gian 3 chiều. Bất kỳ chuyển động nào cũng là một phép biến đổi không gian Euclide, do đó trong tọa độ đồng nhất, nó được biểu thị dưới dạng:

(2.6)

trong đó R là ma trận quay, T= T là vectơ tịnh tiến.

Chuyển động của máy ảnh so với cảnh tương đương với chuyển động ngược lại của các điểm trong cảnh so với máy ảnh, do đó nó bằng:

(2.7)

trong đó R, T là ma trận quay và vectơ chuyển động của camera so với cảnh. Ma trận C được gọi là ma trận hiệu chuẩn bên ngoài máy ảnh. Ma trận C -1 được gọi là ma trận chuyển động của máy ảnh. Do đó, ma trận hiệu chỉnh camera bên ngoài sẽ dịch tọa độ của các điểm cảnh từ hệ tọa độ cảnh sang hệ tọa độ liên kết với camera.

Mô hình chiếu phối cảnh hoàn chỉnh

Từ các biểu thức 2.1, 2.4, 2.7, chúng ta có thể rút ra biểu thức cho phép chiếu phối cảnh tùy ý cho bất kỳ máy ảnh nào có hướng và vị trí tùy ý trong không gian:

Ở dạng ngắn gọn hơn, có tính đến ký hiệu trước đó, công thức này có thể được viết là:

Ma trận P được gọi là ma trận chiếu camera.

Bằng cách tương tự với phép biến đổi phối cảnh tổng quát, trước tiên chúng ta hãy xem xét trường hợp đơn giản nhất về phép biến đổi phối cảnh của một mặt phẳng. Giả sử mặt phẳng p trùng với mặt phẳng Z=0 thì tọa độ ba chiều đồng nhất của bất kỳ điểm nào của nó là M=. Đối với bất kỳ máy ảnh nào có ma trận chiếu P, phép biến đổi phối cảnh của mặt phẳng được mô tả bằng ma trận 3*3:


Vì bất kỳ mặt phẳng nào trong không gian 3 chiều đều có thể được chuyển sang mặt phẳng Z = 0 bằng phép biến đổi Euclide của phép quay và tịnh tiến, tương đương với việc nhân ma trận camera P với ma trận biến đổi L, khi đó hiển thị phối cảnh của một mặt phẳng tùy ý trong không gian được mô tả bởi Chuyển đổi tuyến tính với ma trận 3*3.

Phép biến đổi mặt phẳng phối cảnh còn được gọi là sự đồng âm. Ở dạng ma trận, phép biến đổi phối cảnh của mặt phẳng được viết là m=HM.

Hình học của hai hình ảnh

Cảnh được chụp trên tất cả các ảnh nguồn được coi là bất động, do đó vị trí tương đối của hình chiếu của các điểm cảnh trên các khung khác nhau không thể thay đổi ngẫu nhiên. Các hạn chế áp đặt đối với vị trí của các điểm chiếu rõ ràng phụ thuộc vào các thông số của camera và vị trí của chúng so với nhau. Do đó, việc xác định các mô hình có những hạn chế như vậy sẽ cung cấp một số thông tin về vị trí tương đối của các camera mà từ đó hình ảnh được thu được.

Chuyển đổi mặt phẳng phối cảnh

Nếu tâm của hai camera trùng nhau thì các điểm trên mặt phẳng ảnh của cả hai camera sẽ được dịch sang nhau bằng phép biến đổi phối cảnh của mặt phẳng. Trong trường hợp này, việc chuyển đổi điểm giữa các ảnh không phụ thuộc vào hình dạng của cảnh 3 chiều mà chỉ phụ thuộc vào vị trí tương đối của các mặt phẳng ảnh.

Nếu toàn bộ khung cảnh hoặc một phần của nó là một mặt phẳng thì hình ảnh của nó trên các loại khác nhau với các trung tâm camera không trùng nhau có thể được chuyển đổi thành nhau bằng phép biến đổi đồng nhất. Gọi p là mặt phẳng quan sát, H 1 là phép biến đổi đồng nhất giữa mặt phẳng p và ảnh tôi 1, H 2 - phép biến đổi đồng âm giữa mặt phẳng p và ảnh tôi 2. Khi đó phép biến đổi đồng nhất H 12 giữa các ảnh tôi 1tôi 2 có thể được xuất ra như sau:

H 12 không phụ thuộc vào tham số hóa của mặt phẳng p nên không phụ thuộc vào hệ tọa độ trong không gian

Hầu hết các phương pháp xác định tọa độ của các điểm 3D từ các hình chiếu và phương pháp tái tạo cảnh 3D của chúng đều dựa trên giả định rằng tâm máy ảnh di chuyển giữa các khung nhìn. Vì vậy, nếu tâm của một số loại camera trùng nhau thì các phương pháp này sẽ cho kết quả không chính xác. Những cấu hình camera như vậy phải được phát hiện và xử lý theo cách đặc biệt.

Vì phép biến đổi đồng nhất được viết bằng tọa độ đồng nhất nên ma trận H được xác định theo tỷ lệ. Nó có 8 bậc tự do và được tham số hóa bởi 8 biến. Mỗi cặp điểm tương ứng đã biết tôi 1m 2 trong hình ảnh thứ nhất và thứ hai tương ứng cho 2 Các phương trình tuyến tính từ các phần tử của ma trận H. Do đó, 4 cặp điểm tương ứng đã biết là đủ để tạo thành một hệ phương trình tuyến tính gồm 8 phương trình có 8 ẩn số. Theo hệ thống này, đồng âm H có thể được xác định duy nhất nếu không có ba điểm nào nằm trên cùng một đường thẳng.

Ma trận cơ bản

Hãy xem xét trường hợp tâm của hai loại camera không trùng nhau. Cho phép C 1C 2- tâm của hai camera, M - điểm 3 chiều của cảnh, tôi 1m 2- hình chiếu của điểm M lên ảnh thứ nhất và ảnh thứ hai tương ứng. Gọi P là mặt phẳng đi qua điểm M và tâm của các camera C 1C 2. Mặt phẳng P cắt các mặt phẳng ảnh của khung nhìn thứ nhất và thứ hai dọc theo các đường thẳng tôi 1tôi 2. Vì tia C 1MC 2 M nằm trong mặt phẳng P thì hiển nhiên các điểm tôi 1m 2 nằm trên những đường thẳng tôi 1tôi 2 tương ứng. Bạn có thể cho thêm tuyên bố chung rằng hình chiếu của bất kỳ điểm M" nào nằm trong mặt phẳng P lên cả hai ảnh phải nằm trên đường thẳng tôi 1tôi 2. Những đường này được gọi là đường biểu cực. Mặt phẳng P được gọi là mặt phẳng epipole.

Hai khung nhìn của cùng một cảnh được gọi là cặp âm thanh nổi và một phân đoạn C 1 C 2, việc kết nối các tâm của camera được gọi là đế của cặp âm thanh nổi (đường cơ sở) hoặc đế âm thanh nổi. Bất kỳ mặt phẳng epi cực nào cũng đi qua đoạn C 1 C 2. Cho phép C 1 C 2 cắt ảnh thứ nhất và ảnh thứ hai tại các điểm e 1e 2 tương ứng. Điểm e 1e 2được gọi là điểm epipole hoặc epipoles. Tất cả các đường biểu cực cắt nhau tại các điểm e 1e 2 trong hình ảnh thứ nhất và thứ hai tương ứng. Tập hợp các mặt phẳng epi cực là một chùm tia giao nhau dọc theo đế âm thanh nổi C 1 C 2. Nhiều đường biểu cực trong cả hai ảnh cũng biểu thị các bó đường thẳng cắt nhau tại e 1e 2 .

Điểm tôi 1m 2được gọi là tương ứng nếu chúng là hình chiếu của cùng một điểm cảnh M. Đường biểu cực tôi 1tôi 2được gọi là tương ứng nếu chúng nằm trong cùng một mặt phẳng ngoại cực P. Nếu mặt phẳng ngoại cực P đi qua một điểm tôi 1, sau đó là các đường biểu cực tôi 1tôi 2, nằm trong đó gọi là điểm tương ứng tôi 1.

Hạn chế về vị trí của các điểm tương ứng tôi 1m 2, theo hình học epi cực, có thể được biểu diễn như sau: điểm m 2, tương ứng tôi 1, phải nằm trên đường biểu cực tôi 2, tương ứng tôi 1. Tình trạng này được gọi là ràng buộc epipole. Trong tọa độ đồng nhất, điều kiện là một điểm tôi nằm trên đường tôi Viết như l Tm=0. Đường biểu cực cũng đi qua điểm biểu cực. Phương trình đường thẳng đi qua điểm tôi 1e 1 có thể được viết như:

l 1 ∼ x m 1,

Ở đâu x- một ma trận phản đối xứng có kích thước 3*3 sao cho, x m 1- sản phẩm vectơ tôi 1e 1.

Đối với các đường biểu cực tương ứng tôi 1tôi 2 Phải:

Ở đâu P+- giả đảo ma trận P.

Ma trận F được gọi là ma trận cơ bản. Nó là một toán tử tuyến tính liên kết từng điểm tôi 1đường biểu cực tương ứng của nó tôi 2. Với mỗi cặp điểm tương ứng tôi 1m 2 Phải

m T 2 Fm 1 =0

Đây là công thức của ràng buộc epi cực thông qua ma trận cơ bản.

Ma trận cơ bản có 7 bậc tự do. Mỗi cặp điểm tương ứng tôi 1m 2định nghĩa một phương trình tuyến tính cho các phần tử của ma trận, do đó có thể tính được từ 7 cặp điểm tương ứng đã biết.

Ràng buộc epipole có giá trị đối với bất kỳ cặp điểm tương ứng nào nằm trên hai loại mặt phẳng lý tưởng. Nếu biết ma trận hiệu chuẩn bên trong K 1K2 của cả hai loại camera thì ràng buộc epipole cho các điểm tương ứng trên mặt phẳng lý tưởng được viết là:

Ma trận E được gọi là có ý nghĩa ma trận. Có thể chỉ ra rằng ma trận cơ bản cũng có thể được lấy từ các vị trí tương đối của camera.

Cho phép P 1 =(I|0)P 2 =(R|-RT)- Hai ma trận thiết kế có hiệu chuẩn K = I. Khi đó phương trình thiết kế mặt phẳng lý tưởng của cả hai camera được viết dưới dạng:

Hãy tìm đường biểu cực ở góc nhìn thứ hai tương ứng với điểm m" 1 vào ngày đầu tiên. Để làm điều này, chỉ cần chiếu lên khung nhìn thứ hai hai điểm nằm trên tia là đủ. (C 1, m" 1) sang chế độ xem thứ hai, ví dụ như trung tâm của camera thứ nhất (0,0,0,1) T và một điểm trên mặt phẳng vô cực (x" 1 ,y" 1 ,z" 1 ,0) T. Hình chiếu của các điểm này sẽ là -RT, và R(x" 1 ,y" 1 ,z" 1 ,0) T. Phương trình đường epi cực tôi 2, đi qua cả hai điểm này được cho dưới dạng tích vectơ:

l 2 =RT×R(x" 1 ,y" 1 ,z" 1) T =R(T×(x" 1 ,y" 1 ,z" 1) T)

Ở dạng ma trận, vectơ không phải là tích T×(x" 1 ,y" 1 ,z" 1) T có thể được viết bằng ma trận S:

Khi đó ràng buộc epipole trên các điểm trong mặt phẳng lý tưởng được viết là:

Biểu diễn ma trận cơ bản dưới dạng các tham số hiệu chỉnh bên ngoài của hai camera được sử dụng để tính toán vị trí tương đối của các camera.

Thuộc tính hình học của ba hình ảnh trở lên

Cho phép C 1,C 2C 3- trung tâm của ba góc nhìn của cùng một cảnh ba chiều. Trong trường hợp này, các ràng buộc ngoại cực được áp đặt lên các điểm tương ứng của bất kỳ cặp loài nào. Nếu biết hình chiếu của hai điểm tôi 1m 2đối với chế độ xem thứ nhất và thứ hai, khi đó vị trí của hình chiếu tới hình ảnh thứ ba có thể được coi là giao điểm của hai chế độ xem epipole tương ứng với các điểm tôi 1m 2.

Theo hai dự đoán đã biết tôi 1m 2 Sử dụng hai hình ảnh đã biết hiệu chuẩn, có thể xác định được vị trí của điểm M trong không gian. Do đó, nếu biết được hiệu chuẩn của hình ảnh thứ ba thì hình chiếu của điểm M lên hình ảnh thứ ba có thể được xác định bằng một phép chiếu đơn giản.

Các ràng buộc áp đặt lên vị trí của các điểm tương ứng trong nhiều hơn hai hình ảnh cũng có thể được viết bằng dạng tuyến tính. Đối với ba loại, các hạn chế này được viết dưới dạng tenxơ ba tiêu cự, đối với bốn loại - dưới dạng tenxơ bốn tiêu cự. Tuy nhiên, việc tính toán các ràng buộc này tương đương với việc tính toán thước đo của cả ba hoặc bốn khung nhìn trong không gian xạ ảnh. Những loại hạn chế này không được sử dụng trong công việc này và do đó không được thảo luận chi tiết hơn.

Tại một thời điểm nhất định, bất kỳ nhà phát triển nào trong lĩnh vực đồ họa máy tính đều đặt ra câu hỏi: những ma trận hứa hẹn này hoạt động như thế nào? Đôi khi rất khó tìm ra câu trả lời và như thường lệ, phần lớn các nhà phát triển bỏ cuộc giữa chừng.

Đây không phải là một giải pháp cho vấn đề! Chúng ta hãy cùng nhau tìm ra nó!

Hãy thực tế với thiên hướng thực tế và lấy OpenGL phiên bản 3.3 làm đối tượng thử nghiệm. Bắt đầu từ phiên bản này, mỗi nhà phát triển được yêu cầu triển khai mô-đun hoạt động ma trận một cách độc lập. Tuyệt vời, đây là những gì chúng ta cần. Hãy để chúng tôi phân tích nhiệm vụ khó khăn của chúng tôi và nêu bật những điểm chính. Một số sự kiện từ đặc tả OpenGL:

  • Ma trận được lưu trữ trong các cột (cột chính);
  • Toạ độ đồng nhất;
  • Khối lượng cắt chuẩn (CVV) trong hệ tọa độ thuận tay trái.
Có hai cách để lưu trữ ma trận: cột lớn và hàng chính. Trong các bài giảng về đại số tuyến tính, sơ đồ hàng lớn được sử dụng. Nhìn chung, việc biểu diễn ma trận trong bộ nhớ không thành vấn đề, bởi vì ma trận luôn có thể được chuyển đổi từ kiểu biểu diễn này sang kiểu biểu diễn khác bằng cách hoán vị đơn giản. Và vì không có sự khác biệt nên đối với tất cả các phép tính tiếp theo, chúng ta sẽ sử dụng các ma trận hàng lớn cổ điển. Khi lập trình OpenGL, có một mẹo nhỏ cho phép bạn tránh chuyển đổi ma trận trong khi vẫn duy trì các phép tính hàng chính cổ điển. Ma trận phải được chuyển sang chương trình đổ bóng như hiện tại và trong trình đổ bóng, phép nhân không được thực hiện giữa vectơ và ma trận mà giữa ma trận và vectơ.

Tọa độ đồng nhất không phải là một hệ thống phức tạp với một số quy tắc đơn giản để chuyển đổi tọa độ Descartes quen thuộc thành tọa độ đồng nhất và ngược lại. Tọa độ đồng nhất là ma trận hàng có chiều. Để chuyển tọa độ Descartes thành tọa độ đồng nhất, cần phải x, yz nhân với bất kỳ số thực nào w(trừ 0). Tiếp theo, bạn cần viết kết quả vào ba thành phần đầu tiên và thành phần cuối cùng sẽ bằng số nhân w. Nói cách khác:
- Tọa độ Descartes
w– số thực không bằng 0

- toạ độ đồng nhất

Một mẹo nhỏ: Nếu w bằng 1 thì tất cả những gì cần thiết cho việc dịch thuật là chuyển các thành phần x, yz và gán một cho thành phần cuối cùng. Tức là lấy một ma trận hàng:

Một vài lời về chất lượng bằng không w. Từ quan điểm tọa độ đồng nhất, điều này hoàn toàn có thể chấp nhận được. Tọa độ đồng nhất cho phép bạn phân biệt giữa các điểm và vectơ. Trong hệ tọa độ Descartes, việc phân chia như vậy là không thể.

- điểm ở đâu ( XYZ) – tọa độ Descartes

- vectơ, ở đâu ( XYZ) – vectơ bán kính

Việc dịch ngược một đỉnh từ tọa độ đồng nhất sang tọa độ Descartes được thực hiện như sau. Tất cả các thành phần của ma trận hàng phải được chia cho thành phần cuối cùng. Nói cách khác:

- toạ độ đồng nhất
- Tọa độ Descartes

Điều chính bạn cần biết là tất cả các thuật toán cắt và rasterization OpenGL đều hoạt động theo tọa độ Descartes, nhưng trước đó tất cả các phép biến đổi đều được thực hiện theo tọa độ đồng nhất. Việc chuyển đổi từ tọa độ đồng nhất sang tọa độ Descartes được thực hiện bằng phần cứng.

Khối lượng cắt Canonical (CVV) là một trong những phần ít được ghi lại nhất của OpenGL. Như có thể thấy từ hình. 1 CVV là một khối lập phương thẳng hàng có tâm ở gốc và có chiều dài cạnh bằng hai. Mọi thứ nằm trong khu vực CVV đều phải được rasterization, mọi thứ nằm ngoài CVV đều bị bỏ qua. Bất cứ điều gì nằm ngoài CVV một phần đều phải tuân theo thuật toán cắt tỉa. Điều quan trọng nhất bạn cần biết là hệ tọa độ CVV thuận tay trái!


Cơm. 1. Khối lượng cắt Canonical OpenGL (CVV)

Hệ tọa độ thuận tay trái? Làm sao điều này có thể xảy ra được, vì thông số kỹ thuật cho OpenGL 1.0 nêu rõ rằng hệ tọa độ được sử dụng là thuận tay phải? Hãy tìm ra nó.


Cơm. 2. Hệ tọa độ

Như có thể thấy từ hình. 2 hệ tọa độ chỉ khác nhau về hướng trục Z. OpenGL 1.0 sử dụng hệ tọa độ người dùng thuận tay phải. Nhưng hệ tọa độ CVV và hệ tọa độ người dùng là hai thứ hoàn toàn khác nhau. Hơn nữa, kể từ phiên bản 3.3, không còn hệ tọa độ OpenGL tiêu chuẩn nào nữa. Như đã đề cập trước đó, lập trình viên tự thực hiện mô-đun hoạt động ma trận. Hình thành ma trận quay, hình thành ma trận chiếu, tìm kiếm ma trận nghịch đảo, nhân ma trận - đây là tập hợp các phép toán tối thiểu có trong mô-đun phép toán ma trận. Hai câu hỏi hợp lý phát sinh. Nếu khối lượng hiển thị là một khối lập phương có chiều dài cạnh bằng hai, thì tại sao một cảnh có kích thước vài nghìn đơn vị lại hiển thị trên màn hình? Tại thời điểm nào hệ tọa độ người dùng chuyển đổi sang hệ tọa độ CVV? Ma trận chiếu chính xác là thực thể giải quyết những vấn đề này.

Ý tưởng chính ở trên là bản thân nhà phát triển được tự do lựa chọn loại hệ tọa độ người dùng và phải mô tả chính xác các ma trận chiếu. Điều này hoàn thiện thông tin về OpenGL và đã đến lúc kết hợp mọi thứ lại với nhau.

Một trong những ma trận phổ biến và khó hiểu nhất là ma trận biến đổi phối cảnh. Vậy nó liên quan như thế nào đến CVV và hệ tọa độ người dùng? Tại sao các vật thể trở nên nhỏ hơn khi khoảng cách của chúng với người quan sát tăng lên? Để hiểu lý do tại sao các vật thể co lại khi khoảng cách tăng lên, chúng ta hãy xem xét từng bước biến đổi ma trận của mô hình 3D. Không có gì bí mật khi bất kỳ mô hình ba chiều nào cũng bao gồm một danh sách hữu hạn các đỉnh trải qua các phép biến đổi ma trận hoàn toàn độc lập với nhau. Để xác định tọa độ của đỉnh ba chiều trên màn hình điều khiển hai chiều, bạn cần:

  1. Chuyển đổi tọa độ Descartes thành tọa độ đồng nhất;
  2. Nhân tọa độ đồng nhất với ma trận mô hình;
  3. Kết quả được nhân với ma trận khung nhìn;
  4. Nhân kết quả với ma trận chiếu;
  5. Chuyển đổi kết quả từ tọa độ đồng nhất sang tọa độ Descartes.
Việc chuyển đổi tọa độ Descartes thành tọa độ đồng nhất đã được thảo luận trước đó. Ý nghĩa hình học của ma trận mô hình là chuyển mô hình từ hệ tọa độ cục bộ sang hệ tọa độ toàn cục. Hoặc, như người ta nói, di chuyển các đỉnh ra khỏi không gian mô hình vào không gian thế giới. Nói một cách đơn giản, một đối tượng ba chiều được tải từ một tệp sẽ nằm trong không gian mô hình, nơi tọa độ được đo tương ứng với chính đối tượng đó. Tiếp theo, sử dụng ma trận mô hình, mô hình được định vị, thu nhỏ và xoay. Kết quả là tất cả các đỉnh của mô hình 3D đều nhận được tọa độ đồng nhất thực tế trong cảnh 3D. Không gian mô hình so với không gian thế giới có tính chất cục bộ. Từ không gian mô hình, tọa độ được chuyển sang không gian thế giới (từ cục bộ sang toàn cầu). Với mục đích này, một ma trận mô hình được sử dụng.

Bây giờ chúng ta hãy chuyển sang bước thứ ba. Đây là nơi không gian xem phát huy tác dụng. Trong không gian này, tọa độ được đo tương ứng với vị trí và hướng của người quan sát như thể anh ta là trung tâm của thế giới. Không gian xem mang tính cục bộ so với không gian thế giới, do đó tọa độ phải được nhập vào đó (và không được lấy ra, như trong trường hợp trước). Phép biến đổi ma trận trực tiếp sẽ loại bỏ tọa độ khỏi một số không gian. Ngược lại, để đưa chúng vào trong nó phải đảo ngược phép biến đổi ma trận, do đó phép biến đổi kiểu được mô tả bằng ma trận nghịch đảo. Làm thế nào để có được ma trận nghịch đảo này? Đầu tiên, hãy lấy ma trận người quan sát trực tiếp. Điều gì đặc trưng cho một người quan sát? Người quan sát được mô tả bằng tọa độ nơi anh ta đang ở và các vectơ chỉ hướng quan sát. Người quan sát luôn nhìn theo hướng trục địa phương của mình Z. Người quan sát có thể di chuyển xung quanh hiện trường và thay phiên nhau. Theo nhiều cách, điều này giống với ý nghĩa của ma trận mô hình. Nhìn chung thì nó là như thế này. Tuy nhiên, đối với người quan sát, thao tác chia tỷ lệ là vô nghĩa, do đó không thể đặt dấu bằng giữa ma trận mô hình của người quan sát và ma trận mô hình của đối tượng ba chiều. Ma trận mô hình của người quan sát là ma trận trực tiếp mong muốn. Bằng cách đảo ngược ma trận này, chúng ta thu được ma trận khung nhìn. Trong thực tế, điều này có nghĩa là tất cả các đỉnh trong tọa độ đồng nhất toàn cầu sẽ nhận được tọa độ đồng nhất mới so với người quan sát. Theo đó, nếu người quan sát nhìn thấy một đỉnh nào đó thì giá trị của tọa độ đồng nhất z của một đỉnh nhất định trong không gian xem chắc chắn sẽ là một số dương. Nếu đỉnh ở phía sau người quan sát thì giá trị tọa độ đồng nhất của nó z trong không gian xem chắc chắn sẽ là số âm.

Bước bốn là bước thú vị nhất. Các bước trước đó đã được thảo luận chi tiết một cách có chủ đích để người đọc có được bức tranh hoàn chỉnh về tất cả các toán hạng của bước thứ tư. Ở bước thứ tư, tọa độ đồng nhất được chuyển từ không gian xem sang không gian CVV. Một lần nữa, thực tế được nhấn mạnh là tất cả các đỉnh có khả năng nhìn thấy được sẽ có giá trị dương của tọa độ đồng nhất. z.

Xét ma trận có dạng:

Và một điểm trong không gian đồng nhất của người quan sát:

Hãy nhân tọa độ đồng nhất với ma trận được đề cập:

Hãy chuyển đổi tọa độ đồng nhất thu được thành tọa độ Descartes:

Giả sử có hai điểm trong không gian xem có cùng tọa độ xy, nhưng có tọa độ khác nhau z. Nói cách khác, một trong những điểm nằm phía sau điểm kia. Do sự biến dạng của phối cảnh, người quan sát phải nhìn thấy cả hai điểm. Thật vậy, rõ ràng từ công thức là do phép chia cho tọa độ z, quá trình nén xảy ra tại điểm gốc. Giá trị càng cao z(điểm càng xa người quan sát), lực nén càng mạnh. Đây là lời giải thích cho hiệu ứng phối cảnh.

Đặc tả OpenGL nêu rõ rằng các thao tác cắt và rasterization được thực hiện theo tọa độ Descartes và quá trình chuyển đổi tọa độ đồng nhất sang tọa độ Descartes được thực hiện tự động.

Ma trận (1) là mẫu cho ma trận chiếu phối cảnh. Như đã đề cập trước đó, nhiệm vụ của ma trận chiếu bao gồm hai điểm: thiết lập hệ tọa độ người dùng (thuận tay trái hoặc tay phải), chuyển khối lượng hiển thị của người quan sát sang CVV. Hãy rút ra ma trận phối cảnh cho hệ tọa độ người dùng thuận tay trái.

Ma trận chiếu có thể được mô tả bằng bốn tham số (Hình 3):

  • Góc nhìn tính bằng radian ( lá cải);
  • Tỷ lệ khung hình ( diện mạo);
  • Khoảng cách đến mặt phẳng cắt gần nhất ( N);
  • Khoảng cách đến mặt phẳng cắt xa ( f).


Cơm. 3. Khối lượng tầm nhìn phối cảnh

Chúng ta hãy xem xét hình chiếu của một điểm trong không gian của người quan sát lên cạnh trước của điểm giới hạn của tầm nhìn phối cảnh. Để rõ ràng hơn, trong hình. 4 cho thấy một cái nhìn bên. Cũng cần lưu ý rằng hệ tọa độ người dùng trùng với hệ tọa độ CVV, tức là hệ tọa độ thuận tay trái được sử dụng ở mọi nơi.


Cơm. 4. Chiếu một điểm tùy ý

Dựa vào tính chất của các tam giác đồng dạng, các đẳng thức sau đây đúng:

Hãy biểu diễn yꞌ và xꞌ:

Về nguyên tắc, biểu thức (2) là đủ để thu được tọa độ của các điểm chiếu. Tuy nhiên, để sàng lọc chính xác các vật thể ba chiều, bạn cần biết độ sâu của từng mảnh. Nói cách khác, cần lưu trữ giá trị của thành phần z. Đây là giá trị được sử dụng cho các bài kiểm tra độ sâu OpenGL. Trong bộ lễ phục. 3 rõ ràng là giá trị zꞌ không phù hợp làm độ sâu phân đoạn, vì tất cả các hình chiếu điểm đều có cùng giá trị zꞌ. Cách thoát khỏi tình huống này là sử dụng cái gọi là độ sâu giả.

Thuộc tính giả độ sâu:

  1. Độ sâu giả được tính toán dựa trên giá trị z;
  2. Điểm càng gần người quan sát thì độ sâu giả càng có ít giá trị;
  3. Tất cả các điểm nằm trên mặt phẳng phía trước của khối hiển thị đều có giá trị độ sâu giả là -1;
  4. Tất cả các điểm nằm trên mặt phẳng cắt xa của khối hiển thị đều có giá trị độ sâu giả là 1;
  5. Tất cả các mảnh nằm bên trong khối hiển thị đều có giá trị độ sâu giả trong phạm vi [-1 1].
Chúng ta hãy rút ra công thức tính toán độ sâu giả. Hãy lấy biểu thức sau làm cơ sở:

Tỷ lệ cược Mộtb cần phải được tính toán. Để làm điều này, chúng tôi sử dụng các thuộc tính của giả độ sâu 3 và 4. Chúng tôi thu được hệ hai phương trình với hai ẩn số:

Hãy cộng cả hai phần của hệ thống và nhân kết quả với sản phẩm fn, trong đó fN không thể bằng không. Chúng tôi nhận được:

Chúng ta hãy mở ngoặc và sắp xếp lại các thuật ngữ sao cho chỉ phần có MỘT, và ở bên phải chỉ với b:

Thay (6) vào (5). Hãy chuyển đổi biểu thức thành một phân số đơn giản:

Nhân cả hai vế với -2fn, trong đó fN không thể bằng không. Hãy trình bày những từ tương tự, sắp xếp lại các thuật ngữ và diễn đạt b:

Thay (7) vào (6) và biểu diễn Một:

Theo đó các thành phần Mộtbđều bằng nhau:

Bây giờ hãy thay các hệ số thu được vào ma trận phôi (1) và xem điều gì sẽ xảy ra với tọa độ z cho một điểm tùy ý trong không gian đồng nhất của người quan sát. Việc thay thế được thực hiện như sau:

Để khoảng cách đến mặt phẳng cắt phía trước N bằng 2 và khoảng cách đến mặt phẳng cắt xa f bằng 10. Xét năm điểm trong không gian đồng nhất của người quan sát:

Vị trí tương đối của điểm và khối lượng tầm nhìn
chấm Nghĩa Sự miêu tả
1 1 Điểm nằm ở phía trước mặt phẳng cắt phía trước của khối hiển thị. Không vượt qua quá trình rasterization.
2 2 Điểm này nằm ở cạnh trước của phần giới hạn mức hiển thị. Đang trải qua quá trình rasterization.
3 5 Điểm nằm giữa cạnh cắt phía trước và cạnh cắt xa của khối hiển thị. Đang trải qua quá trình rasterization.
4 10 Điểm này nằm ở rìa xa của giới hạn mức hiển thị. Đang trải qua quá trình rasterization.
5 20 Điểm nằm ngoài rìa xa của giới hạn mức hiển thị. Không vượt qua quá trình rasterization.

Hãy nhân tất cả các điểm với ma trận (8), sau đó chuyển đổi tọa độ đồng nhất thu được thành tọa độ Descartes . Để làm được điều này, chúng ta cần tính giá trị của các thành phần đồng nhất mới .
Điểm 1:

Lưu ý rằng tọa độ đồng nhất được định vị hoàn toàn chính xác trong CVV và quan trọng nhất là giờ đây có thể thực hiện kiểm tra độ sâu OpenGL vì độ sâu giả đáp ứng đầy đủ các yêu cầu kiểm tra.

Với tọa độ z Chúng ta đã tìm ra rồi, hãy chuyển sang tọa độ xy. Như đã đề cập trước đó, toàn bộ phạm vi hiển thị phối cảnh phải phù hợp với CVV. Độ dài của cạnh CVV là hai. Theo đó, chiều cao và chiều rộng của tầm nhìn phối cảnh phải được nén thành hai đơn vị thông thường.

Chúng tôi có sẵn một góc lá cải và độ lớn diện mạo. Hãy biểu thị chiều cao và chiều rộng bằng các giá trị này.


Cơm. 5. Khối lượng hiển thị

Từ hình. 5 rõ ràng là:

Bây giờ chúng ta có thể có được cái nhìn cuối cùng về ma trận chiếu phối cảnh cho hệ tọa độ thuận tay trái tùy chỉnh hoạt động với CVV OpenGL:

Điều này hoàn thành việc lấy đạo hàm của ma trận.

Đôi lời về DirectX - đối thủ cạnh tranh chính của OpenGL. DirectX chỉ khác với OpenGL ở kích thước của CVV và vị trí của nó. Trong DirectX, CVV là một hình chữ nhật song song có chiều dài dọc theo trục của nó xy bằng hai và dọc theo trục z chiều dài bằng một. Phạm vi xy là [-1 1] và phạm vi z tương đương với . Đối với hệ tọa độ CVV, DirectX, giống như OpenGL, sử dụng hệ tọa độ thuận tay trái.

Để hiển thị ma trận phối cảnh cho hệ tọa độ thuận tay phải tùy chỉnh, bạn cần vẽ lại Hình. 2, Hình 3 và Hình 4 có tính đến hướng trục mới Z. Các tính toán tiếp theo hoàn toàn tương tự, tính đến dấu. Đối với ma trận DirectX, thuộc tính giả độ sâu 3 và 4 được sửa đổi để phù hợp với phạm vi.

Tại thời điểm này, chủ đề về ma trận hứa hẹn có thể coi như đã khép lại.