Ich arbeite an einem 3D-Szeneneditor und möchte die Szene in orthographischer Projektion zeigen. Mein aktuelles Problem ist, dass ich nicht sicher bin, wie ich die orthografische Projektionsmatrix so berechnen soll, dass die Objekte nicht in einer völlig anderen Größe auf dem Bildschirm angezeigt werden.
Ich habe derzeit die folgenden 2 Funktionen zur Berechnung der Kameraprojektionsmatrix.
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;
};
Und so werden sie eingesetzt:
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);
}
}
},
Hier ist ein Beispiel dafür, was ich in Blender erreichen möchte (F5 wechselt zwischen Ortho und Perspektive). Beachten Sie, dass beide Cubes in den Ansichtsfenstern ungefähr gleich groß zu sein scheinen: