hello ,
ive tried PointerLockControls.js in XZ ground Y vertical world , it is working very well . But if i want to work in a XY ground world + Z vertical , it doesn’t work like i does wish . Ive read PointerLockControls.js and i ve seen there is no rotation around Z in onMouseMove so i don’t understand how the camera stay horizontal after an Y rotation + X rotation .
i ve tried too an
camera.up = new THREE.Vector3(0,0,1);
camera.lookAt(0,0,0);
with the idea if camera start horizontal , it will stay horizontal with Y rotation + X rotation . But dont work
so my question is : can i set PointerLockControls to work in XY ground Z vertical world . thank.
if i’am right there is an XYZ axis which are bound to camera ,and if i look the screen , X is on the left , y on the bottom , z in the back ? so if want to turn camera to the left i ve to set a negative rotation around Y . if i want to turn to down i ve to set a positive rotation around X . so something like that
euler.y += movementX * 0.002;
euler.x -= movementY * 0.002;
but in PointerLockControls.js it is like this
euler.y -= movementX * 0.002;
euler.x -= movementY * 0.002;
i dont understand
ok i ve found a part of solution .
euler is absolute …so i have to turn camera around Z first , and after X so
in PointerLockControls i change
var euler = new THREE.Euler( 0, 0, 0, ‘YXZ’ );
to
var euler = new THREE.Euler( 0, 0, 0, ‘ZXY’ );
and in onMouseMove i change
euler.y - = movementX * 0.002;
euler.x -= movementY * 0.002;
to
euler.z -= movementX * 0.002;
euler.x -= movementY * 0.002;
work fine . now i ve just a problem with limit of euler.x
euler.x = Math.max( PI_2-scope.maxPolarAngle, Math.min( PI_2-scope.minPolarAngle, euler.x ) );
ok i ve solves myy problem in PointerLockControls.js
i ve replaced
var euler = new THREE.Euler( 0, 0, 0, ‘YXZ’ );
by
var euler = new THREE.Euler( 0, 0, 0, ‘ZXY’ );
and in onMouse Move i ve replaced
euler.y -= movementX * 0.002;
euler.x -= movementY * 0.002;
euler.x = Math.max( PI_2 - scope.maxPolarAngle, Math.min( PI_2 - scope.minPolarAngle, euler.x ) );
by
if( euler.y<=0.01 && euler.y>=-0.01){
euler.z -= movementX * 0.002;
euler.x -= movementY * 0.002;
if (euler.x < 0) { euler.x=0;}
if (euler.x > PI_2) { euler.x=euler.x-0.01; euler.y=Math.PI; euler.z=euler.z-Math.PI; }
}
else { euler.z -= movementX * 0.002;
euler.x += movementY * 0.002;
if(euler.x<0) {euler.x=0; }
if (euler.x > PI_2) { euler.x=euler.x-0.01;euler.y=0;euler.z=euler.z-Math.PI; }
}
work fine now
add: i ve forgetten to notice . cause vec.crossVectors( camera.up, vec ) in moveForward function , i have to set
camera.up=new THREE.Vector3(0,0,1)