Browse Source

Added vertical look constraint parameter to RollCamera.

alteredq 14 years ago
parent
commit
86aa767a6a
4 changed files with 23 additions and 18 deletions
  1. 8 7
      build/Three.js
  2. 8 7
      build/custom/ThreeExtras.js
  3. 1 0
      examples/misc_rollCamera.html
  4. 6 4
      src/extras/cameras/RollCamera.js

+ 8 - 7
build/Three.js

@@ -404,13 +404,14 @@ c);this.translateY(this.moveVector.y*c);this.translateZ(this.moveVector.z*c);thi
 -this.moveState.left+this.moveState.right;this.moveVector.y=-this.moveState.down+this.moveState.up;this.moveVector.z=-c+this.moveState.back};this.updateRotationVector=function(){this.rotationVector.x=-this.moveState.pitchDown+this.moveState.pitchUp;this.rotationVector.y=-this.moveState.yawRight+this.moveState.yawLeft;this.rotationVector.z=-this.moveState.rollRight+this.moveState.rollLeft};this.getContainerDimensions=function(){return this.domElement!=document?{size:[this.domElement.offsetWidth,this.domElement.offsetHeight],
 offset:[this.domElement.offsetLeft,this.domElement.offsetTop]}:{size:[window.innerWidth,window.innerHeight],offset:[0,0]}};this.domElement.addEventListener("mousemove",d(this,this.mousemove),!1);this.domElement.addEventListener("mousedown",d(this,this.mousedown),!1);this.domElement.addEventListener("mouseup",d(this,this.mouseup),!1);window.addEventListener("keydown",d(this,this.keydown),!1);window.addEventListener("keyup",d(this,this.keyup),!1);this.updateMovementVector();this.updateRotationVector()};
 THREE.FlyCamera.prototype=new THREE.Camera;THREE.FlyCamera.prototype.constructor=THREE.FlyCamera;THREE.FlyCamera.prototype.supr=THREE.Camera.prototype;
-THREE.RollCamera=function(b,d,c,f){THREE.Camera.call(this,b,d,c,f);this.mouseLook=!0;this.autoForward=!1;this.rollSpeed=this.movementSpeed=this.lookSpeed=1;this.domElement=document;this.useTarget=!1;this.matrixAutoUpdate=!1;this.forward=new THREE.Vector3(0,0,1);this.roll=0;this.lastUpdate=(new Date).getTime();this.delta=0;var g=new THREE.Vector3,h=new THREE.Vector3,j=new THREE.Vector3,k=new THREE.Matrix4,m=!1,o=1,p=0,t=0,v=0,u=0,B=0,F=window.innerWidth/2,V=window.innerHeight/2;this.update=function(){var A=
-(new Date).getTime();this.delta=(A-this.lastUpdate)/1E3;this.lastUpdate=A;if(this.mouseLook){A=this.delta*this.lookSpeed;this.rotateHorizontally(A*u);this.rotateVertically(A*B)}A=this.delta*this.movementSpeed;this.translateZ(A*(p>0||this.autoForward&&!(p<0)?1:p));this.translateX(A*t);this.translateY(A*v);m&&(this.roll+=this.rollSpeed*this.delta*o);if(this.forward.y>0.9){this.forward.y=0.9;this.forward.normalize()}else if(this.forward.y<-0.9){this.forward.y=-0.9;this.forward.normalize()}j.copy(this.forward);
-h.set(0,1,0);g.cross(h,j).normalize();h.cross(j,g).normalize();this.matrix.n11=g.x;this.matrix.n12=h.x;this.matrix.n13=j.x;this.matrix.n21=g.y;this.matrix.n22=h.y;this.matrix.n23=j.y;this.matrix.n31=g.z;this.matrix.n32=h.z;this.matrix.n33=j.z;k.identity();k.n11=Math.cos(this.roll);k.n12=-Math.sin(this.roll);k.n21=Math.sin(this.roll);k.n22=Math.cos(this.roll);this.matrix.multiplySelf(k);this.matrixWorldNeedsUpdate=!0;this.matrix.n14=this.position.x;this.matrix.n24=this.position.y;this.matrix.n34=this.position.z;
-this.supr.update.call(this)};this.translateX=function(A){this.position.x+=this.matrix.n11*A;this.position.y+=this.matrix.n21*A;this.position.z+=this.matrix.n31*A};this.translateY=function(A){this.position.x+=this.matrix.n12*A;this.position.y+=this.matrix.n22*A;this.position.z+=this.matrix.n32*A};this.translateZ=function(A){this.position.x-=this.matrix.n13*A;this.position.y-=this.matrix.n23*A;this.position.z-=this.matrix.n33*A};this.rotateHorizontally=function(A){g.set(this.matrix.n11,this.matrix.n21,
-this.matrix.n31);g.multiplyScalar(A);this.forward.subSelf(g);this.forward.normalize()};this.rotateVertically=function(A){h.set(this.matrix.n12,this.matrix.n22,this.matrix.n32);h.multiplyScalar(A);this.forward.addSelf(h);this.forward.normalize()};this.domElement.addEventListener("contextmenu",function(A){A.preventDefault()},!1);this.domElement.addEventListener("mousemove",function(A){u=(A.clientX-F)/window.innerWidth;B=(A.clientY-V)/window.innerHeight},!1);this.domElement.addEventListener("mousedown",
-function(A){A.preventDefault();A.stopPropagation();switch(A.button){case 0:p=1;break;case 2:p=-1}},!1);this.domElement.addEventListener("mouseup",function(A){A.preventDefault();A.stopPropagation();switch(A.button){case 0:p=0;break;case 2:p=0}},!1);this.domElement.addEventListener("keydown",function(A){switch(A.keyCode){case 38:case 87:p=1;break;case 37:case 65:t=-1;break;case 40:case 83:p=-1;break;case 39:case 68:t=1;break;case 81:m=!0;o=1;break;case 69:m=!0;o=-1;break;case 82:v=1;break;case 70:v=
--1}},!1);this.domElement.addEventListener("keyup",function(A){switch(A.keyCode){case 38:case 87:p=0;break;case 37:case 65:t=0;break;case 40:case 83:p=0;break;case 39:case 68:t=0;break;case 81:m=!1;break;case 69:m=!1;break;case 82:v=0;break;case 70:v=0}},!1)};THREE.RollCamera.prototype=new THREE.Camera;THREE.RollCamera.prototype.constructor=THREE.RollCamera;THREE.RollCamera.prototype.supr=THREE.Camera.prototype;
+THREE.RollCamera=function(b,d,c,f){THREE.Camera.call(this,b,d,c,f);this.mouseLook=!0;this.autoForward=!1;this.rollSpeed=this.movementSpeed=this.lookSpeed=1;this.constrainVertical=[-0.9,0.9];this.domElement=document;this.useTarget=!1;this.matrixAutoUpdate=!1;this.forward=new THREE.Vector3(0,0,1);this.roll=0;this.lastUpdate=(new Date).getTime();this.delta=0;var g=new THREE.Vector3,h=new THREE.Vector3,j=new THREE.Vector3,k=new THREE.Matrix4,m=!1,o=1,p=0,t=0,v=0,u=0,B=0,F=window.innerWidth/2,V=window.innerHeight/
+2;this.update=function(){var A=(new Date).getTime();this.delta=(A-this.lastUpdate)/1E3;this.lastUpdate=A;if(this.mouseLook){A=this.delta*this.lookSpeed;this.rotateHorizontally(A*u);this.rotateVertically(A*B)}A=this.delta*this.movementSpeed;this.translateZ(A*(p>0||this.autoForward&&!(p<0)?1:p));this.translateX(A*t);this.translateY(A*v);m&&(this.roll+=this.rollSpeed*this.delta*o);if(this.forward.y>this.constrainVertical[1]){this.forward.y=this.constrainVertical[1];this.forward.normalize()}else if(this.forward.y<
+this.constrainVertical[0]){this.forward.y=this.constrainVertical[0];this.forward.normalize()}j.copy(this.forward);h.set(0,1,0);g.cross(h,j).normalize();h.cross(j,g).normalize();this.matrix.n11=g.x;this.matrix.n12=h.x;this.matrix.n13=j.x;this.matrix.n21=g.y;this.matrix.n22=h.y;this.matrix.n23=j.y;this.matrix.n31=g.z;this.matrix.n32=h.z;this.matrix.n33=j.z;k.identity();k.n11=Math.cos(this.roll);k.n12=-Math.sin(this.roll);k.n21=Math.sin(this.roll);k.n22=Math.cos(this.roll);this.matrix.multiplySelf(k);
+this.matrixWorldNeedsUpdate=!0;this.matrix.n14=this.position.x;this.matrix.n24=this.position.y;this.matrix.n34=this.position.z;this.supr.update.call(this)};this.translateX=function(A){this.position.x+=this.matrix.n11*A;this.position.y+=this.matrix.n21*A;this.position.z+=this.matrix.n31*A};this.translateY=function(A){this.position.x+=this.matrix.n12*A;this.position.y+=this.matrix.n22*A;this.position.z+=this.matrix.n32*A};this.translateZ=function(A){this.position.x-=this.matrix.n13*A;this.position.y-=
+this.matrix.n23*A;this.position.z-=this.matrix.n33*A};this.rotateHorizontally=function(A){g.set(this.matrix.n11,this.matrix.n21,this.matrix.n31);g.multiplyScalar(A);this.forward.subSelf(g);this.forward.normalize()};this.rotateVertically=function(A){h.set(this.matrix.n12,this.matrix.n22,this.matrix.n32);h.multiplyScalar(A);this.forward.addSelf(h);this.forward.normalize()};this.domElement.addEventListener("contextmenu",function(A){A.preventDefault()},!1);this.domElement.addEventListener("mousemove",
+function(A){u=(A.clientX-F)/window.innerWidth;B=(A.clientY-V)/window.innerHeight},!1);this.domElement.addEventListener("mousedown",function(A){A.preventDefault();A.stopPropagation();switch(A.button){case 0:p=1;break;case 2:p=-1}},!1);this.domElement.addEventListener("mouseup",function(A){A.preventDefault();A.stopPropagation();switch(A.button){case 0:p=0;break;case 2:p=0}},!1);this.domElement.addEventListener("keydown",function(A){switch(A.keyCode){case 38:case 87:p=1;break;case 37:case 65:t=-1;break;
+case 40:case 83:p=-1;break;case 39:case 68:t=1;break;case 81:m=!0;o=1;break;case 69:m=!0;o=-1;break;case 82:v=1;break;case 70:v=-1}},!1);this.domElement.addEventListener("keyup",function(A){switch(A.keyCode){case 38:case 87:p=0;break;case 37:case 65:t=0;break;case 40:case 83:p=0;break;case 39:case 68:t=0;break;case 81:m=!1;break;case 69:m=!1;break;case 82:v=0;break;case 70:v=0}},!1)};THREE.RollCamera.prototype=new THREE.Camera;THREE.RollCamera.prototype.constructor=THREE.RollCamera;
+THREE.RollCamera.prototype.supr=THREE.Camera.prototype;
 THREE.Cube=function(b,d,c,f,g,h,j,k,m){function o(V,A,S,D,Y,J,L,oa){var ja,ra,va=f||1,X=g||1,e=Y/2,na=J/2,za=p.vertices.length;if(V=="x"&&A=="y"||V=="y"&&A=="x")ja="z";else if(V=="x"&&A=="z"||V=="z"&&A=="x"){ja="y";X=h||1}else if(V=="z"&&A=="y"||V=="y"&&A=="z"){ja="x";va=h||1}var wa=va+1,Da=X+1;Y/=va;var ka=J/X;for(ra=0;ra<Da;ra++)for(J=0;J<wa;J++){var ea=new THREE.Vector3;ea[V]=(J*Y-e)*S;ea[A]=(ra*ka-na)*D;ea[ja]=L;p.vertices.push(new THREE.Vertex(ea))}for(ra=0;ra<X;ra++)for(J=0;J<va;J++){p.faces.push(new THREE.Face4(J+
 wa*ra+za,J+wa*(ra+1)+za,J+1+wa*(ra+1)+za,J+1+wa*ra+za,null,null,oa));p.faceVertexUvs[0].push([new THREE.UV(J/va,ra/X),new THREE.UV(J/va,(ra+1)/X),new THREE.UV((J+1)/va,(ra+1)/X),new THREE.UV((J+1)/va,ra/X)])}}THREE.Geometry.call(this);var p=this,t=b/2,v=d/2,u=c/2;k=k?-1:1;if(j!==undefined)if(j instanceof Array)this.materials=j;else{this.materials=[];for(var B=0;B<6;B++)this.materials.push([j])}else this.materials=[];this.sides={px:!0,nx:!0,py:!0,ny:!0,pz:!0,nz:!0};if(m!=undefined)for(var F in m)this.sides[F]!=
 undefined&&(this.sides[F]=m[F]);this.sides.px&&o("z","y",1*k,-1,c,d,-t,this.materials[0]);this.sides.nx&&o("z","y",-1*k,-1,c,d,t,this.materials[1]);this.sides.py&&o("x","z",1*k,1,b,c,v,this.materials[2]);this.sides.ny&&o("x","z",1*k,-1,b,c,-v,this.materials[3]);this.sides.pz&&o("x","y",1*k,-1,b,d,u,this.materials[4]);this.sides.nz&&o("x","y",-1*k,-1,b,d,-u,this.materials[5]);(function(){for(var V=[],A=[],S=0,D=p.vertices.length;S<D;S++){for(var Y=p.vertices[S],J=!1,L=0,oa=V.length;L<oa;L++){var ja=

+ 8 - 7
build/custom/ThreeExtras.js

@@ -62,13 +62,14 @@ b);this.translateY(this.moveVector.y*b);this.translateZ(this.moveVector.z*b);thi
 -this.moveState.left+this.moveState.right;this.moveVector.y=-this.moveState.down+this.moveState.up;this.moveVector.z=-b+this.moveState.back};this.updateRotationVector=function(){this.rotationVector.x=-this.moveState.pitchDown+this.moveState.pitchUp;this.rotationVector.y=-this.moveState.yawRight+this.moveState.yawLeft;this.rotationVector.z=-this.moveState.rollRight+this.moveState.rollLeft};this.getContainerDimensions=function(){return this.domElement!=document?{size:[this.domElement.offsetWidth,this.domElement.offsetHeight],
 offset:[this.domElement.offsetLeft,this.domElement.offsetTop]}:{size:[window.innerWidth,window.innerHeight],offset:[0,0]}};this.domElement.addEventListener("mousemove",d(this,this.mousemove),!1);this.domElement.addEventListener("mousedown",d(this,this.mousedown),!1);this.domElement.addEventListener("mouseup",d(this,this.mouseup),!1);window.addEventListener("keydown",d(this,this.keydown),!1);window.addEventListener("keyup",d(this,this.keyup),!1);this.updateMovementVector();this.updateRotationVector()};
 THREE.FlyCamera.prototype=new THREE.Camera;THREE.FlyCamera.prototype.constructor=THREE.FlyCamera;THREE.FlyCamera.prototype.supr=THREE.Camera.prototype;
-THREE.RollCamera=function(a,d,b,e){THREE.Camera.call(this,a,d,b,e);this.mouseLook=!0;this.autoForward=!1;this.rollSpeed=this.movementSpeed=this.lookSpeed=1;this.domElement=document;this.useTarget=!1;this.matrixAutoUpdate=!1;this.forward=new THREE.Vector3(0,0,1);this.roll=0;this.lastUpdate=(new Date).getTime();this.delta=0;var c=new THREE.Vector3,f=new THREE.Vector3,g=new THREE.Vector3,h=new THREE.Matrix4,j=!1,l=1,k=0,t=0,m=0,p=0,y=0,w=window.innerWidth/2,B=window.innerHeight/2;this.update=function(){var n=
-(new Date).getTime();this.delta=(n-this.lastUpdate)/1E3;this.lastUpdate=n;if(this.mouseLook){n=this.delta*this.lookSpeed;this.rotateHorizontally(n*p);this.rotateVertically(n*y)}n=this.delta*this.movementSpeed;this.translateZ(n*(k>0||this.autoForward&&!(k<0)?1:k));this.translateX(n*t);this.translateY(n*m);j&&(this.roll+=this.rollSpeed*this.delta*l);if(this.forward.y>0.9){this.forward.y=0.9;this.forward.normalize()}else if(this.forward.y<-0.9){this.forward.y=-0.9;this.forward.normalize()}g.copy(this.forward);
-f.set(0,1,0);c.cross(f,g).normalize();f.cross(g,c).normalize();this.matrix.n11=c.x;this.matrix.n12=f.x;this.matrix.n13=g.x;this.matrix.n21=c.y;this.matrix.n22=f.y;this.matrix.n23=g.y;this.matrix.n31=c.z;this.matrix.n32=f.z;this.matrix.n33=g.z;h.identity();h.n11=Math.cos(this.roll);h.n12=-Math.sin(this.roll);h.n21=Math.sin(this.roll);h.n22=Math.cos(this.roll);this.matrix.multiplySelf(h);this.matrixWorldNeedsUpdate=!0;this.matrix.n14=this.position.x;this.matrix.n24=this.position.y;this.matrix.n34=this.position.z;
-this.supr.update.call(this)};this.translateX=function(n){this.position.x+=this.matrix.n11*n;this.position.y+=this.matrix.n21*n;this.position.z+=this.matrix.n31*n};this.translateY=function(n){this.position.x+=this.matrix.n12*n;this.position.y+=this.matrix.n22*n;this.position.z+=this.matrix.n32*n};this.translateZ=function(n){this.position.x-=this.matrix.n13*n;this.position.y-=this.matrix.n23*n;this.position.z-=this.matrix.n33*n};this.rotateHorizontally=function(n){c.set(this.matrix.n11,this.matrix.n21,
-this.matrix.n31);c.multiplyScalar(n);this.forward.subSelf(c);this.forward.normalize()};this.rotateVertically=function(n){f.set(this.matrix.n12,this.matrix.n22,this.matrix.n32);f.multiplyScalar(n);this.forward.addSelf(f);this.forward.normalize()};this.domElement.addEventListener("contextmenu",function(n){n.preventDefault()},!1);this.domElement.addEventListener("mousemove",function(n){p=(n.clientX-w)/window.innerWidth;y=(n.clientY-B)/window.innerHeight},!1);this.domElement.addEventListener("mousedown",
-function(n){n.preventDefault();n.stopPropagation();switch(n.button){case 0:k=1;break;case 2:k=-1}},!1);this.domElement.addEventListener("mouseup",function(n){n.preventDefault();n.stopPropagation();switch(n.button){case 0:k=0;break;case 2:k=0}},!1);this.domElement.addEventListener("keydown",function(n){switch(n.keyCode){case 38:case 87:k=1;break;case 37:case 65:t=-1;break;case 40:case 83:k=-1;break;case 39:case 68:t=1;break;case 81:j=!0;l=1;break;case 69:j=!0;l=-1;break;case 82:m=1;break;case 70:m=
--1}},!1);this.domElement.addEventListener("keyup",function(n){switch(n.keyCode){case 38:case 87:k=0;break;case 37:case 65:t=0;break;case 40:case 83:k=0;break;case 39:case 68:t=0;break;case 81:j=!1;break;case 69:j=!1;break;case 82:m=0;break;case 70:m=0}},!1)};THREE.RollCamera.prototype=new THREE.Camera;THREE.RollCamera.prototype.constructor=THREE.RollCamera;THREE.RollCamera.prototype.supr=THREE.Camera.prototype;
+THREE.RollCamera=function(a,d,b,e){THREE.Camera.call(this,a,d,b,e);this.mouseLook=!0;this.autoForward=!1;this.rollSpeed=this.movementSpeed=this.lookSpeed=1;this.constrainVertical=[-0.9,0.9];this.domElement=document;this.useTarget=!1;this.matrixAutoUpdate=!1;this.forward=new THREE.Vector3(0,0,1);this.roll=0;this.lastUpdate=(new Date).getTime();this.delta=0;var c=new THREE.Vector3,f=new THREE.Vector3,g=new THREE.Vector3,h=new THREE.Matrix4,j=!1,l=1,k=0,t=0,m=0,p=0,y=0,w=window.innerWidth/2,B=window.innerHeight/
+2;this.update=function(){var n=(new Date).getTime();this.delta=(n-this.lastUpdate)/1E3;this.lastUpdate=n;if(this.mouseLook){n=this.delta*this.lookSpeed;this.rotateHorizontally(n*p);this.rotateVertically(n*y)}n=this.delta*this.movementSpeed;this.translateZ(n*(k>0||this.autoForward&&!(k<0)?1:k));this.translateX(n*t);this.translateY(n*m);j&&(this.roll+=this.rollSpeed*this.delta*l);if(this.forward.y>this.constrainVertical[1]){this.forward.y=this.constrainVertical[1];this.forward.normalize()}else if(this.forward.y<
+this.constrainVertical[0]){this.forward.y=this.constrainVertical[0];this.forward.normalize()}g.copy(this.forward);f.set(0,1,0);c.cross(f,g).normalize();f.cross(g,c).normalize();this.matrix.n11=c.x;this.matrix.n12=f.x;this.matrix.n13=g.x;this.matrix.n21=c.y;this.matrix.n22=f.y;this.matrix.n23=g.y;this.matrix.n31=c.z;this.matrix.n32=f.z;this.matrix.n33=g.z;h.identity();h.n11=Math.cos(this.roll);h.n12=-Math.sin(this.roll);h.n21=Math.sin(this.roll);h.n22=Math.cos(this.roll);this.matrix.multiplySelf(h);
+this.matrixWorldNeedsUpdate=!0;this.matrix.n14=this.position.x;this.matrix.n24=this.position.y;this.matrix.n34=this.position.z;this.supr.update.call(this)};this.translateX=function(n){this.position.x+=this.matrix.n11*n;this.position.y+=this.matrix.n21*n;this.position.z+=this.matrix.n31*n};this.translateY=function(n){this.position.x+=this.matrix.n12*n;this.position.y+=this.matrix.n22*n;this.position.z+=this.matrix.n32*n};this.translateZ=function(n){this.position.x-=this.matrix.n13*n;this.position.y-=
+this.matrix.n23*n;this.position.z-=this.matrix.n33*n};this.rotateHorizontally=function(n){c.set(this.matrix.n11,this.matrix.n21,this.matrix.n31);c.multiplyScalar(n);this.forward.subSelf(c);this.forward.normalize()};this.rotateVertically=function(n){f.set(this.matrix.n12,this.matrix.n22,this.matrix.n32);f.multiplyScalar(n);this.forward.addSelf(f);this.forward.normalize()};this.domElement.addEventListener("contextmenu",function(n){n.preventDefault()},!1);this.domElement.addEventListener("mousemove",
+function(n){p=(n.clientX-w)/window.innerWidth;y=(n.clientY-B)/window.innerHeight},!1);this.domElement.addEventListener("mousedown",function(n){n.preventDefault();n.stopPropagation();switch(n.button){case 0:k=1;break;case 2:k=-1}},!1);this.domElement.addEventListener("mouseup",function(n){n.preventDefault();n.stopPropagation();switch(n.button){case 0:k=0;break;case 2:k=0}},!1);this.domElement.addEventListener("keydown",function(n){switch(n.keyCode){case 38:case 87:k=1;break;case 37:case 65:t=-1;break;
+case 40:case 83:k=-1;break;case 39:case 68:t=1;break;case 81:j=!0;l=1;break;case 69:j=!0;l=-1;break;case 82:m=1;break;case 70:m=-1}},!1);this.domElement.addEventListener("keyup",function(n){switch(n.keyCode){case 38:case 87:k=0;break;case 37:case 65:t=0;break;case 40:case 83:k=0;break;case 39:case 68:t=0;break;case 81:j=!1;break;case 69:j=!1;break;case 82:m=0;break;case 70:m=0}},!1)};THREE.RollCamera.prototype=new THREE.Camera;THREE.RollCamera.prototype.constructor=THREE.RollCamera;
+THREE.RollCamera.prototype.supr=THREE.Camera.prototype;
 THREE.Cube=function(a,d,b,e,c,f,g,h,j){function l(B,n,x,o,D,z,G,K){var H,J,L=e||1,E=c||1,R=D/2,S=z/2,N=k.vertices.length;if(B=="x"&&n=="y"||B=="y"&&n=="x")H="z";else if(B=="x"&&n=="z"||B=="z"&&n=="x"){H="y";E=f||1}else if(B=="z"&&n=="y"||B=="y"&&n=="z"){H="x";L=f||1}var M=L+1,T=E+1;D/=L;var U=z/E;for(J=0;J<T;J++)for(z=0;z<M;z++){var F=new THREE.Vector3;F[B]=(z*D-R)*x;F[n]=(J*U-S)*o;F[H]=G;k.vertices.push(new THREE.Vertex(F))}for(J=0;J<E;J++)for(z=0;z<L;z++){k.faces.push(new THREE.Face4(z+M*J+N,z+
 M*(J+1)+N,z+1+M*(J+1)+N,z+1+M*J+N,null,null,K));k.faceVertexUvs[0].push([new THREE.UV(z/L,J/E),new THREE.UV(z/L,(J+1)/E),new THREE.UV((z+1)/L,(J+1)/E),new THREE.UV((z+1)/L,J/E)])}}THREE.Geometry.call(this);var k=this,t=a/2,m=d/2,p=b/2;h=h?-1:1;if(g!==undefined)if(g instanceof Array)this.materials=g;else{this.materials=[];for(var y=0;y<6;y++)this.materials.push([g])}else this.materials=[];this.sides={px:!0,nx:!0,py:!0,ny:!0,pz:!0,nz:!0};if(j!=undefined)for(var w in j)this.sides[w]!=undefined&&(this.sides[w]=
 j[w]);this.sides.px&&l("z","y",1*h,-1,b,d,-t,this.materials[0]);this.sides.nx&&l("z","y",-1*h,-1,b,d,t,this.materials[1]);this.sides.py&&l("x","z",1*h,1,a,b,m,this.materials[2]);this.sides.ny&&l("x","z",1*h,-1,a,b,-m,this.materials[3]);this.sides.pz&&l("x","y",1*h,-1,a,d,p,this.materials[4]);this.sides.nz&&l("x","y",-1*h,-1,a,d,-p,this.materials[5]);(function(){for(var B=[],n=[],x=0,o=k.vertices.length;x<o;x++){for(var D=k.vertices[x],z=!1,G=0,K=B.length;G<K;G++){var H=B[G];if(D.position.x==H.position.x&&

+ 1 - 0
examples/misc_rollCamera.html

@@ -62,6 +62,7 @@
 				camera = new THREE.RollCamera( 60, window.innerWidth / window.innerHeight, 1, 1000 );
 				camera.movementSpeed = 100;
 				camera.lookSpeed = 3;
+				camera.constrainVertical = [ -0.5, 0.5 ];
 				//camera.autoForward = true;
 
 				// world

+ 6 - 4
src/extras/cameras/RollCamera.js

@@ -32,6 +32,8 @@ THREE.RollCamera = function ( fov, aspect, near, far ) {
 	this.movementSpeed = 1;
 	this.rollSpeed = 1;
 
+	this.constrainVertical = [ -0.9, 0.9 ];
+
 	this.domElement = document;
 
 	// disable default camera behavior
@@ -91,14 +93,14 @@ THREE.RollCamera = function ( fov, aspect, near, far ) {
 		
 		// cap forward up / down
 		
-		if( this.forward.y > 0.9 ) {
+		if( this.forward.y > this.constrainVertical[ 1 ] ) {
 			
-			this.forward.y = 0.9;
+			this.forward.y = this.constrainVertical[ 1 ];
 			this.forward.normalize();
 			
-		} else if( this.forward.y < -0.9 ) {
+		} else if( this.forward.y < this.constrainVertical[ 0 ] ) {
 			
-			this.forward.y = -0.9;
+			this.forward.y = this.constrainVertical[ 0 ];
 			this.forward.normalize();
 			
 		}