Tôi phát triển một công cụ 3D đơn giản (không sử dụng API), biến đổi thành công khung cảnh của tôi thành thế giới và xem không gian nhưng gặp khó khăn khi chiếu cảnh của tôi (từ không gian xem) ma trận chiếu (kiểu OpenGL). Tôi không chắc chắn về fov, gần và xa giá trị và cảnh tôi nhận được là bị bóp méo. Tôi hy vọng nếu ai đó có thể hướng dẫn tôi cách xây dựng và sử dụng ma trận chiếu phối cảnh đúng cách với mã mẫu. Cảm ơn trước sự giúp đỡ nào.Làm thế nào để xây dựng một ma trận chiếu phối cảnh (không có API)
Ma trận xây dựng:
double f = 1/Math.Tan(fovy/2);
return new double[,] {
{ f/Aspect, 0, 0, 0 },
{ 0, f, 0, 0 },
{ 0, 0, (Far + Near)/(Near - Far), (2 * Far * Near)/(Near - Far) },
{ 0, 0, -1, 0 }
};
Việc sử dụng ma trận:
foreach (Point P in T.Points)
{
.
. // Transforming the point to homogen point matrix, to world space, and to view space (works fine)
.
// projecting the point with getProjectionMatrix() specified in the previous code :
double[,] matrix = MatrixMultiply(GetProjectionMatrix(Fovy, Width/Height, Near, Far) , viewSpacePointMatrix);
// translating to Cartesian coordinates (from homogen):
matrix [0, 0] /= matrix [3, 0];
matrix [1, 0] /= matrix [3, 0];
matrix [2, 0] /= matrix [3, 0];
matrix [3, 0] = 1;
P = MatrixToPoint(matrix);
// adjusting to the screen Y axis:
P.y = this.Height - P.y;
// Printing...
}
http://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix Tôi cũng đề nghị các bài học trước (chiếu điểm và xem 3D). – user18490