sawine@27: function Camera(speed, pos, up, right, target) sawine@27: { sawine@27: this.speed = speed; sawine@27: this.pos = vec3.create(pos || [0, 0, 7]); sawine@27: this.up = vec3.create([0, 1, 0]); sawine@27: this.right = vec3.create([1, 0, 0]); sawine@27: this.target = vec3.create([0, 0, -1]); sawine@27: normalize([this.up, this.right, this.target]); sawine@27: this.matrix = mat4.create(); sawine@27: sawine@27: this.pitchUp = vec3.create([0, 1, 0]); sawine@27: this.yawUp = vec3.create([0, 1, 0]); sawine@27: this.pitchRight = vec3.create([1, 0, 0]); sawine@27: this.yawRight = vec3.create([1, 0, 0]); sawine@27: this.pitchTarget = vec3.create([0, 0, -1]); sawine@27: this.yawTarget = vec3.create([0, 0, -1]); sawine@27: this.pitchMatrix = mat4.create(); sawine@27: this.yawMatrix = mat4.create(); sawine@27: mat4.identity(this.pitchMatrix); sawine@27: mat4.identity(this.yawMatrix); sawine@27: } sawine@27: Camera.prototype.moveLeft = function() sawine@27: { sawine@27: var dir = vec3.create(this.right); sawine@27: vec3.scale(dir, -this.speed.h); sawine@27: vec3.add(this.pos, dir); sawine@27: } sawine@27: Camera.prototype.moveRight = function() sawine@27: { sawine@27: var dir = vec3.create(this.right); sawine@27: vec3.scale(dir, this.speed.h); sawine@27: vec3.add(this.pos, dir); sawine@27: } sawine@27: Camera.prototype.moveUp = function() sawine@27: { sawine@27: var dir = vec3.create(this.up); sawine@27: vec3.scale(dir, this.speed.v); sawine@27: vec3.add(this.pos, dir); sawine@27: } sawine@27: Camera.prototype.moveDown = function() sawine@27: { sawine@27: var dir = vec3.create(this.up); sawine@27: vec3.scale(dir, -this.speed.v); sawine@27: vec3.add(this.pos, dir); sawine@27: } sawine@27: Camera.prototype.zoom = function(delta) sawine@27: { sawine@27: var dir = vec3.create(this.target); sawine@27: vec3.scale(dir, delta * this.speed.zoom); sawine@27: vec3.add(this.pos, dir); sawine@27: } sawine@27: Camera.prototype.pitch = function(delta) sawine@27: { sawine@27: delta *= -this.speed.pitch; sawine@27: vec3.scale(this.pitchTarget, Math.cos(delta)); sawine@27: vec3.scale(this.pitchUp, Math.sin(delta)); sawine@27: vec3.add(this.pitchTarget, this.pitchUp); sawine@27: vec3.normalize(this.pitchTarget); sawine@27: vec3.cross(this.pitchTarget, this.pitchRight, this.pitchUp); sawine@27: vec3.scale(this.pitchUp, -1); sawine@27: } sawine@27: Camera.prototype.yaw = function(delta) sawine@27: { sawine@27: delta *= -this.speed.yaw; sawine@27: vec3.scale(this.yawRight, Math.cos(delta)); sawine@27: vec3.scale(this.yawTarget, Math.sin(delta)); sawine@27: vec3.add(this.yawRight, this.yawTarget); sawine@27: vec3.normalize(this.yawRight); sawine@27: vec3.cross(this.yawRight, this.yawUp, this.yawTarget); sawine@27: vec3.scale(this.yawTarget, -1); sawine@27: } sawine@27: Camera.prototype.rotate = function(angles) sawine@27: { sawine@27: angles = [angles[0] * -this.speed.pitch, sawine@27: angles[1] * -this.speed.yaw, sawine@27: angles[2] * -this.speed.roll]; sawine@27: vec3.scale(this.target, Math.cos(angles[1]) * Math.sin(angles[0])); sawine@27: vec3.scale(this.up, Math.sin(angles[1])); sawine@27: vec3.scale(this.right, Math.cos(angles[0])); sawine@27: vec3.add(this.right, this.target); sawine@27: vec3.add(this.target, this.up); sawine@27: sawine@27: vec3.normalize(this.target); sawine@27: vec3.normalize(this.right); sawine@27: vec3.cross(this.target, this.right, this.up); sawine@27: vec3.scale(this.up, -1); sawine@27: vec3.cross(this.right, this.up, this.target); sawine@27: vec3.scale(this.target, -1); sawine@27: sawine@27: } sawine@27: Camera.prototype.roll = function(delta) sawine@27: { sawine@27: sawine@27: } sawine@27: Camera.prototype.update = function() sawine@27: { sawine@27: // vec3.add(this.right, this.pitchRight); sawine@27: // vec3.add(this.up, this.pitchUp); sawine@27: // vec3.add(this.target, this.pitchTarget); sawine@27: // vec3.add(this.right, this.yawRight); sawine@27: // vec3.add(this.up, this.yawUp); sawine@27: // vec3.add(this.target, this.yawTarget); sawine@27: // vec3.normalize(this.right); sawine@27: // vec3.normalize(this.up); sawine@27: // vec3.normalize(this.target); sawine@27: var x = vec3.dot(this.right, this.pos); sawine@27: var y = vec3.dot(this.up, this.pos); sawine@27: var z = vec3.dot(this.target, this.pos); sawine@27: this.matrix = mat4.create([this.right[0], this.up[0], -this.target[0], 0, sawine@27: this.right[1], this.up[1], -this.target[1], 0, sawine@27: this.right[2], this.up[2], -this.target[2], 0, sawine@27: -x, -y, z, 1]); sawine@27: //vec3.cross(this.yawRight, this.pitchRight); sawine@27: //vec3.cross(this.yawUp, this.pitchUp); sawine@27: //vec3.cross(this.yawTarget, this.pitchTarget); sawine@27: this.pitchMatrix = mat4.create([this.pitchRight[0], this.pitchUp[0], -this.pitchTarget[0], 0, sawine@27: this.pitchRight[1], this.pitchUp[1], -this.pitchTarget[1], 0, sawine@27: this.pitchRight[2], this.pitchUp[2], -this.pitchTarget[2], 0, sawine@27: 0, 0, 0, 1]); sawine@27: this.yawMatrix = mat4.create([this.yawRight[0], this.yawUp[0], -this.yawTarget[0], 0, sawine@27: this.yawRight[1], this.yawUp[1], -this.yawTarget[1], 0, sawine@27: this.yawRight[2], this.yawUp[2], -this.yawTarget[2], 0, sawine@27: 0, 0, 0, 1]); sawine@27: mat4.multiply(this.matrix, this.pitchMatrix); sawine@27: mat4.multiply(this.matrix, this.yawMatrix); sawine@27: }