Reputation: 691
I am trying to implement an oblique projection in WebGL and something is not working out: the projection looks just like ortho.
This is the code setting up the projection matrix:
mat4.identityMatrix(pMatrix);
var m = mat4.createMatrix();
var n = mat4.createMatrix();
m = mat4.oblique(pMatrix, 15, 60);
n = mat4.ortho(-2.0, 2.0, -2.0, 2.0, 0.1, 100, pMatrix);
pMatrix = mat4.matrixMultiply(m, n);
I have also tried:
mat4.identityMatrix(pMatrix);
mat4.shearMatrix(pMatrix, degreesToRadians(15), [1, 0, 0]);
mat4.shearMatrix(pMatrix, degreesToRadians(60), [0, 1, 0]);
mat4.ortho(-2.0, 2.0, -2.0, 2.0, 0.1, 100, pMatrix);
The shear matrices work fine, but the combination of the two shears only give an ortho view, as does the first example.
The matrices are:
mat4.oblique = function(pMtrx, theta, phi){
if(!pMtrx){
pMtrx = mat4.createMatrix();
}
var t = degreesToRadians(theta);
var p = degreesToRadians(phi);
var cotT = -1/Math.tan(t);
var cotP = -1/Math.tan(p);
pMtrx[0] = 1;
pMtrx[1] = 0;
pMtrx[2] = cotT;
pMtrx[3] = 0;
pMtrx[4] = 0;
pMtrx[5] = 1;
pMtrx[6] = cotP;
pMtrx[7] = 0;
pMtrx[8] = 0;
pMtrx[9] = 0;
pMtrx[10] = 1;
pMtrx[11] = 0;
pMtrx[12] = 0
pMtrx[13] = 0
pMtrx[14] = 0
pMtrx[15] = 1;
mat4.transpose(pMtrx);
return pMtrx;
}
mat4.ortho = function(left, right, bottom, top, near, far, pMtrx){
if(!pMatrix){
pMatrix = mat4.createMatrix();
}
var a = right - left;
b = top - bottom;
c = far - near;
pMtrx[0] = 2/a;
pMtrx[1] = 0;
pMtrx[2] = 0;
pMtrx[3] = 0;
pMtrx[4] = 0;
pMtrx[5] = 2/b;
pMtrx[6] = 0;
pMtrx[7] = 0;
pMtrx[8] = 0;
pMtrx[9] = 0;
pMtrx[10] = -2/c;
pMtrx[11] = 0;
pMtrx[12] = -1*(left + right)/a;
pMtrx[13] = -1*(top + bottom)/b;
pMtrx[14] = -1*(far + near )/c;
pMtrx[15] = 1;
return pMtrx;
};
I have been up and down with this one, and can't see where I am going wrong. Advice would be much appreciated. This full code verion can be found here: https://gist.github.com/Carla-de-Beer/b935da9a7317f8444495
Upvotes: 1
Views: 1183
Reputation: 8123
Look at the code you posted: oblique
and ortho
functions just set and return the given matrix. They're not taking previous transforms into account and they're not returning a new matrix.
So you're overwriting your previous transforms and store references to the same matrix within your m
and n
variables.
var oblique = mat4.createMatrix();
var orhto = mat4.createMatrix();
mat4.oblique(oblique, 15, 60);
mat4.ortho(-2.0, 2.0, -2.0, 2.0, 0.1, 100, orhto);
var pMatrix = mat4.matrixMultiply(oblique, ortho);
Upvotes: 3