WebGlRendererを使用してThree.jsでOBJ要素を表示していますが、ユーザーがオブジェクトの周りでカメラを任意の方向に回転できるようにしたいので、次の答えを見つけました。
しかし、どちらの例でもエラーが返されます。最初の例では、プロジェクターが定義されていないということであり、「プロジェクター」の意味がわかりません。私は単純なカメラ、オブジェクトといくつかのライトを持っています。 2番目のコードは、undefinedは関数ではないことを示しています。
誰かが必要な結果を得る方法を知っていますか?
これはあなたが望むものです: http://threejs.org/examples/misc_controls_orbit.html
オービットコントロールを含めます(ダウンロードした後)。
<script src="js/controls/OrbitControls.js"></script>
変数を設定します。
var controls;
コントロールをカメラに接続し、リスナーを追加します。
controls = new THREE.OrbitControls( camera );
controls.addEventListener( 'change', render );
そしてアニメーション関数でコントロールを更新します:
controls.update();
[更新] controls.autoRotate = true;
(v73でテストされています。OrbitControls.jsの最近のバージョンでは、このコントロールが追加されています。)
実際、「カメラ」を選択したオブジェクトで置き換えると、オブジェクトが回転します。ただし、周囲に他のオブジェクト(たとえば、床のグリッド)がある場合でも、オブジェクトは静止しています。それはあなたが望むものかもしれないし、それは奇妙に見えるかもしれません。 (椅子が床の上に浮かんでいるのを想像してみてください...?)
Orbitコントロールを初期化した後、コードからOrbitControls.JSの中心オブジェクトをオーバーライドすることを選択します
controls = new THREE.OrbitControls(camera, renderer.domElement);
…
controls.center = new THREE.Vector3(
chair.position.x,
chair.position.y,
chair.position.z
);
(免責事項:OrbitControls.jsにはさまざまなバージョンがあるようですが、すべてこの中央オブジェクトを使用していると思います)
OrbitControl
の変更時にレンダリングメソッドをトリガーするリスナーを追加します。
const controls = new OrbitControls(camera, this.renderer.domElement);
controls.enableDamping = true; //damping
controls.dampingFactor = 0.25; //damping inertia
controls.enableZoom = true; //Zooming
controls.autoRotate = true; // enable rotation
controls.maxPolarAngle = Math.PI / 2; // Limit angle of visibility
controls.keys = {
LEFT: 37, //left arrow
UP: 38, // up arrow
RIGHT: 39, // right arrow
BOTTOM: 40 // down arrow
};
controls.addEventListener("change", () => {
if (this.renderer) this.renderer.render(this.scene, camera);
});
アニメーション更新コントロールでは:
start = () => {
if (!this.frameId) {
this.frameId = requestAnimationFrame(this.animate);
}
};
stop = () => {
cancelAnimationFrame(this.frameId);
};
renderScene = () => {
if (this.renderer) this.renderer.render(this.scene, camera);
};
animate = () => {
// update controls
controls.update();
}