ThreeJS: переместить камеру в определенные координаты, используя tween.js - onClick
У меня возникла проблема с комбинированием Tween.js и ThreeJS для анимации и перемещения камеры. Я включаю их обоих в свой шаблон реакции.
Что я хочу: я хочу щелкнуть по объекту, и камера должна затем плавно перейти к заранее заданным координатам. Но я не могу заставить его работать и не могу найти никакой документации о том, как это сделать. Все фрагменты кода, которые я нашел до сих пор, терпят неудачу или отсутствуют в документации. Это мой код:
const THREE = require('three');
const TWEEN = require('tween.js');
const OrbitControls = require('three-orbit-controls')(THREE);
var raycaster = new THREE.Raycaster();
var mouse = new THREE.Vector2();
var cameraPosition = new THREE.Vector3();
var objects = [];
export default class App {
constructor () {
this.alive = true;
this.init();
}
init () {
this.scene = new THREE.Scene();
this.camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, .1, 1000);
this.renderer = new THREE.WebGLRenderer( { antialias: true } );
this.renderer.setSize( window.innerWidth, window.innerHeight );
document.body.prepend( this.renderer.domElement );
window.addEventListener("mousedown", this.onclick, true);
requestAnimationFrame(this.update);
this.test();
this.start();
}
onclick(e) {
new TWEEN.Tween( cameraPosition )
.to( {
x: 20,
y: 20,
z: 20}, 2000 )
.easing( TWEEN.Easing.Sinusoidal.EaseInOut)
.start();
}
test () {
this.displayA= new ModelLoader();
this.displayA.loadModel('./models/display-A.obj', (obj) => {
obj.scale.set(.5, .5, .5);
obj.position.z = 0;
obj.position.y = 5;
obj.position.x = 0;
obj.rotation.x = this.deg2rad(-90);
obj.rotation.y = this.deg2rad(0);
obj.rotation.z = this.deg2rad(90);
obj.name = "Display";
console.log(obj.name);
this.object = new THREE.Group();
this.object.add(obj);
this.scene.add(this.object);
this.object.name = "Display";
objects.push(this.object);
});
}
render () {
this.update();
this.renderer.render( this.scene, this.camera );
requestAnimationFrame(this.render.bind(this));
}
update () {
this.camera.position.copy(cameraPosition);
}
Прежде всего, камера не двигается, так как я получаю "это" не определено ". указывая на строку внутри функции update(). И второй клик тоже не работает. Сообщение об ошибке здесь "камера не определена".
Было бы удивительно, если бы кто-то мог помочь мне с этим.
Спасибо:)
1 ответ
Ваш запрос requestAnimationFrame должен запускать ваш метод render (), а не метод update (). Затем метод update () вызывается внутри метода render ().
Хотя я вижу this.start()
Вызван, но нет ссылки на этот метод, так что не знаете, что это делает?
Я бы добавил animate()
метод для обработки update () и render (), который вызывается для requestAnimationFrame().
Например:
animate() {
requestAnimationFrame( this.animate );
this.update();
this.render();
}
Render () станет:
render () {
TWEEN.update();
this.renderer.render( this.scene, this.camera );
}
Затем внутри init (), где у вас есть requestAnimationFrame(this.update);
- заменить this.animate();
Вам может потребоваться обновить ссылку на eventListener:
window.addEventListener("mousedown", e => this.onclick(e), true);
Это должно исправить проблемы с областью видимости, которые у вас возникают. Tween.js выглядит нормально, но без демонстрации я не могу сказать наверняка, и ссылки на this.start (), которого нет в фрагменте кода, поэтому не могут этого объяснить.
Также нет причины, по которой метод Tween не мог обновить this.camera.position
значения объекта вместо Vector3 CameraPosition, в зависимости от того, что еще вы хотите запустить в своем проекте.