2012-04-25 6 views
24

Three.jsでは、私はカメラが3D空間内のあるポイントを指し示したいと思っています。この目的のためにThreeJS camera.lookAt()は効果がありません。間違っていることはありますか?

、私はそうのようなcamera.lookAt機能を使用してみました:

camera.lookAt(new THREE.Vector3(-100,-100,0)); 

はしかし、私は、コールが全く影響を与えないことが分かりました。それは全く何もしません。私はベクトルの数値を変えようとしましたが、いつ変化するのでしょうか、常に画面上で同じように見えます。

私のコードにあるTHREE.TrackballControlsを削除すると、camera.lookAt()が正常に動作することが判明しました。 THREE.TrackballControlsの使い方に何か問題がありますか?これは私がそれらを初期化する方法である:

controls = new THREE.TrackballControls(camera, renderer.domElement); 

    controls.rotateSpeed = 10.0; 
    controls.zoomSpeed = 1.2; 
    controls.panSpeed = 0.2; 

    controls.noZoom = false; 
    controls.noPan = false; 

    controls.staticMoving = true; 
    controls.dynamicDampingFactor = 1.0; 

    var radius = 5; 
    controls.minDistance = radius * 1.1; 
    controls.maxDistance = radius * 100; 

    controls.keys = [ 65, 83, 68 ]; // [ rotateKey, zoomKey, panKey ]*/ 

そして、私のレンダリング機能で私が:Three.jsで

function render() { 
    controls.update(); 
    renderer.render(scene, camera); 
} 

ドキュメントがかなり不足しているので、私は、私はここにお願いしたいと思いました。私は何か間違っているのですか?

+0

私たちにもっとコードを教えてください。この簡単なサンプルを見てみましょう:http://jsfiddle.net/TE5bM/ –

+0

シーンを再レンダリングする更新ループがありますか?あなたが更新/レンダリングしていないように思えます。 –

+0

@Juan George:何かがレンダリングされる前にシーンを設定するときに.lookAt()を呼び出しているので、私の呼び出しには効果があります。しかし、私はちょうど問題を発見したと思う。私はTHREE.TrackballControlsを削除すると、.lookAt()関数がうまく動作するので、私が思うところで.lookAt()を妨害していると思う私のコードにTHREE.TrackballControlsがあります。 THREE.TrackballControlsで何をやっているのですか? – houbysoft

答えて

40

THREE.TrackballControlsのソースコードを見ると、私は私は私はそれを見てみたいTHREE.Vector3trackballControls.targetを設定して、シーンを再レンダリングすることによってたいカメラの外観を作ることができることを考え出しました。

+2

ありがとう!私は永遠のように答えを求めて、ついにgoogled! –

+2

正解! Set controls.target = new THREE.Vector3(1500、500、0);ここで1500、500、0は私の目指す目標です – theprof

+2

はい、私が直面している問題と正確には、私は新しいquesiton [ここ]を投稿しました(http://stackoverflow.com/questions/26557252/inverse-of -camera-lookat)。私の場合、 'target'プロパティを 'camera.lookAt()'に渡された同じベクトルに初期化して、 'THREE.OrbitControls'のソースコードを手作業で変更することは**不可能です。 'target = getLookAtVectorFor(camera)'のようなものを書くことができ、私のカメラのlookAtベクトルを変更するたびに 'OrbitControls.js'のソースコードを変更する必要はありません。 –

3

はいいいえ... THREE.TrackballControlsまたはTHREE.OrbitControlsを使用すると、コントロールのインスタンスをインスタンス化するときにカメラで渡されるように、camera.lookAt関数がオーバーライドされているようです。コントロールを取り除き、camera.lookAt()を実行するか、カメラを別の方法でトゥイーンして、コントロールがカメラにオーバーライドしていることを確認することができます。私はしばらくの間、なぜ、camera.lookat()が効果がないように見えたのですか?

0

私はそれを理解しました。初期化時にcamera.lookAtをオーバーライドからTHREE.TrackballControlsまたはTHREE.OrbitControlsを防ぐために、あなたの代わりにそれが現在new THREE.Vector3()(これはデフォルト値を使用して実装されますかで、camera.positionベクトルとcamera.getWorldDirection()ベクトルの合計に等しくなるように、コントロールのtargetプロパティを設定する行を変更する必要があります〜(0, 0, 0))。

ので、THREE.TrackballControlsのために、に変更ライン39:

this.target = new THREE.Vector3().addVectors(/*new line for readability*/ 
    object.position, object.getWorldDirection()); 

同じことが、私はactaully TrackballControls.js上でそれをテストしていないが、それはOrbitControls.js上で動作しない線36 に、THREE.OrbitControlsのために行きます。お役に立てれば。

0

代わりの解決策は次のとおりです.0次元のオブジェクト(キューブ)を作成します。

var cameraTarget = new THREE.Mesh(new THREE.CubeGeometry(0,0,0)); 

render関数では、camera.lookAtをcameraTargetの位置に設定します。

function render() { 
    camera.lookAt(cameraTarget.position); 
    renderer.render(scene, camera); 
} 

希望するとおりにcameraTargetを移動します。

1

私の意見では、元のコードを混乱させるものではありません。特定のポイントを見るという目的を達成する方法を見つけました。単純に以下の2行のコードを実行あなたの「制御」変数を宣言した後 :

// Assuming you know how to set the camera and myCanvas variables 
control = new THREE.OrbitControls(camera, myCanvas); 

// Later in your code 
control.object.position.set(camX, camY, camZ); 
control.target = new THREE.Vector3(targetX, targetY, targetZ); 

が、これはあなたの新しいターゲットに焦点の中心を切り替えますことを、私を覚えておいてください。つまり、新しいターゲットはカメラのすべての回転の中心になります。一部のパーツは、デフォルトのセンターを想定してカメラを操作するのに慣れてきたので、見るのが難しいでしょう。できるだけズームインしてみてください。私が何を言っているのかが分かります。 このヘルプが必要です。

関連する問題