Tôi đang làm việc trên một trình chỉnh sửa cảnh 3d và muốn hiển thị cảnh đó trong phép chiếu chính tả. Vấn đề hiện tại của tôi là tôi không chắc cách tính ma trận chiếu chính tả sao cho các đối tượng không xuất hiện ở một kích thước hoàn toàn khác trên màn hình.
Tôi hiện có 2 chức năng sau để tính ma trận chiếu của camera.
Matrix4.createPerspective = function(fov, aspect, near, far, result) {
if (typeof result === 'undefined') {
result = new Matrix4();
}
var ymax = near * Math.tan(fov * Math.PI / 360);
var ymin = - ymax;
var xmin = ymin * aspect;
var xmax = ymax * aspect;
Matrix4.createFrustum(xmin, xmax, ymin, ymax, near, far, /*out*/ result);
return result;
};
Matrix4.createOrthographic = function(left, right, top, bottom, near, far, result) {
if (typeof result === 'undefined') {
result = new Matrix4();
}
var re = result.elements;
var w = right - left;
var h = top - bottom;
var p = far - near;
var x = ( right + left ) / w;
var y = ( top + bottom ) / h;
var z = ( far + near ) / p;
re[0] =2/w; re[4] = 0; re[8] = 0; re[12] =-x;
re[1] = 0; re[5] =2/h; re[9] = 0; re[13] =-y;
re[2] = 0; re[6] = 0; re[10] =-2/p; re[14] =-z;
re[3] = 0; re[7] = 0; re[11] = 0; re[15] = 1;
return result;
};
Và đây là cách chúng đang được sử dụng:
updateProjectionMatrix: function(entity) {
var camera = entity.getComponent('Camera');
if (camera.isDirty()) {
camera.aspect = camera.width / camera.height;
if (camera.isOrthographic()){
Matrix4.createOrthographic(
0,
camera.width,
0,
camera.height,
camera.near,
camera.far,
/*out*/ camera._projectionMatrix);
} else {
Matrix4.createPerspective(
camera.fov,
camera.aspect,
camera.near,
camera.far,
/*out*/ camera._projectionMatrix);
}
}
},
Dưới đây là một ví dụ về những gì tôi đang cố gắng thực hiện bên trong Blender (F5 chuyển đổi giữa Ortho và Phối cảnh). Lưu ý rằng cả hai hình khối có cùng kích thước trên khung nhìn: