Quiero obtener los ejes y y x de la cámara como vectores individuales para poder rotar alrededor de ellos. ¿Cómo puedo obtener eso de las rotaciones de Euler o del cuaternión de la cámara?
_euler.setFromQuaternion( camera.quaternion ); // sets euler rotation in order XYZ
_A = new Vector3(1, 0, _euler.z); // this is wrong, it needs to be the camera y axis
_R.copy(camera.quaternion);
_Q.setFromAxisAngle(_A, movementX); // _euler.y -= movementX;
_R.multiply(_Q);
camera.quaternion.copy(_R);
_A = new Vector3(1, 0, _euler.z); // needs to be the camera x axis
_R.copy(camera.quaternion);
_Q.setFromAxisAngle(_A, movementY); // _euler.x -= movementY;
_R.multiply(_Q);
camera.quaternion.copy(_R);
thirdpersoncamera.js funciona como quiero (creo)
export const third_person_camera = (() => {
class ThirdPersonCamera extends entity.Component {
constructor(params) {
super();
this._params = params;
this._camera = params.camera;
this._currentPosition = new THREE.Vector3();
}
_CalculateIdealOffset() {
const cameraXYZ = new THREE.Vector3
this._params.camera.getWorldDirection(cameraXYZ);
if (this._camera.isspaceshipcamera) {
const cameraY = (cameraXYZ.y*80);
this.idealOffset = new THREE.Vector3(0, 20 , -80);
}
else {
const cameraY = (Math.abs(cameraXYZ.y*50));
this.idealOffset = new THREE.Vector3(0, 20 + (cameraY/2), -50 + cameraY);
}
this.idealOffset.applyQuaternion(this._params.target._rotation);
this.idealOffset.add(this._params.target._position);
return this.idealOffset;
}
_CalculateIdealLookat() {
const idealLookat = new THREE.Vector3(0, 10, 50);
idealLookat.applyQuaternion(this._params.target.Rotation);
idealLookat.add(this._params.target.Position);
return idealLookat;
}
Update(timeElapsed) {
const idealOffset = this._CalculateIdealOffset();
const t = 1.0 - Math.pow(0.0000000000001, timeElapsed);
this._currentPosition.lerp(idealOffset, t);
this._camera.position.copy(this._currentPosition);
}
después de presionar una de las 2 teclas a continuación, mousemovex y ya no son las cámaras X e Y, quiero que sean aunque
_R.copy(this._params.camera.quaternion);
if (input._keys.q) {
_A.set(0, 0, 1);
_Q.setFromAxisAngle(_A, 0.5 * Math.PI * timeInSeconds);
_R.multiply(_Q);
this._params.camera.quaternion.copy(_R);
}
if (input._keys.e) {
_A.set(0, 0, -1);
_Q.setFromAxisAngle(_A, 0.5 * Math.PI * timeInSeconds);
_R.multiply(_Q);
this._params.camera.quaternion.copy(_R);
}