Three.js(R100)で開発をしています。
OrbitControlsを使用していますが、カメラの角度を変更しても、すぐに角度を元に戻ってしまいます。
ボタンをクリックすると、changeCamera関数のcamera.setRotationFromQuqternionで角度が変更されます。
しかしcontroles.update()を実行するとカメラが元の角度に戻ってしまいます。
camera.position.x で位置を変更した場合にはcontroles.updateで位置が反映されているような動きになり、正しく位置が変更されます。
「OrbitControls以外でカメラの角度を変更した場合、OrbitControlsに反映させたい」場合の方法を教えて下さい。
よろしくお願いいたします。
全コードを添付しました。
<html> <head> <meta charset="utf-8" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/110/three.min.js"></script> <script src="js/controls/OrbitControls.js"></script> <script> // ページの読み込みを待つ window.addEventListener('load', init); let camera; let controls; function changeCamera() { // 角度を変更した場合、OrbitControlsに反映されず、結果的に角度が戻る // 位置を変更した場合、controls.updateで反映されるため正しく動作する。 if(true) { camera.setRotationFromQuaternion(new THREE.Quaternion(-0.2527326204999822, 0.42227344138250583, 0.12385549165623723, 0.8616676740047633)); camera.updateMatrix(); } else { camera.position.x = 100; } controls.update(); console.log('A', camera.quaternion); } function init() { // サイズを指定 const width = 1920; const height = 1080; // シーンを const scene = new THREE.Scene(); // レンダラー const renderer = new THREE.WebGLRenderer({ canvas: document.querySelector('#myCanvas') }); renderer.setSize(width, height); // カメラ camera = new THREE.PerspectiveCamera(45, width / height); camera.position.set(0, 0, 1000); controls = new THREE.OrbitControls(camera); controls.addEventListener( 'change', () => { console.log('B', camera.quaternion); }); // 正方形 const mesh = new THREE.Mesh( new THREE.BoxGeometry(300, 300, 300), new THREE.MeshNormalMaterial() ); scene.add(mesh); tick(); function tick() { renderer.render(scene, camera); requestAnimationFrame(tick); } } </script> </head> <body> <canvas id="myCanvas"></canvas> <button onclick="changeCamera()">カメラの位置変更</button> </body> </html>
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。