2016-10-12 3 views
0

ワールドが回転するとDIVも一緒に移動するように、DIVを3Dオブジェクト上の3Dオブジェクト上に配置する方法ThreeJSオブジェクト上にDIVをホバリングして、3D世界との位置同期を保ちます

注:3Dオブジェクトはモデルからロードされるため、グループ内にグループがあり、次にメッシュがあります。

Hover a DIV on ThreeJS Object keeping it's location sync with 3D world

+0

私が使い方を説明するためのjsfiddle準備している:私はあなたを使用しようとしました http://fiddle.jshell.net/umairrafiq/b3mvLxk7/7/ –

答えて

3

だけでなく、スプライトあなたが何らかの理由でdivを使用することを好む場合、あなたはまた、画面の翻訳を行うことができます。 objがobject3d、レンダラで、カメラが定義され、利用可能な、関数からのxとyの値は、CSSに渡すことができるさ

function getScreenTranslation (obj) { 

    var vector = new THREE.Vector3(); 
    var widthHalf = 0.5 * renderer.context.canvas.width; 
    var heightHalf = 0.5 * renderer.context.canvas.height; 

    var bbox = new THREE.BoundingBoxHelper(obj, 0xFFFFFF); 

    bbox.update(); 

      bbox.updateMatrixWorld(); 
      bbox.updateMatrix(); 

    vector.setFromMatrixPosition(bbox.matrixWorld); 
    vector.project(camera); 
    vector.x = vector.x * widthHalf + widthHalf; 
    vector.y = -(vector.y * heightHalf) + heightHalf; 
    return { 
      x: vector.x, 
      y: vector.y 
    }; 

}。

あなたの設定によっては、シーンが変わってオブジェクトが動いたときに、divの位置を更新する必要があります。あなたはカメラやコントロールでこれを行うことができます。私の定型文はコントロールの入力だけで世界を変えるので、私はchangeイベント関数を使用します。

this.controls.addEventListener('change', my_change_event_function); 

あなたが管理している部門を知ることは難しいため、例を挙げるのは難しいです。しかし、例えば、私は、jquery divの3dオブジェクトと対応するラベルの多次元配列を管理しています。

アレイの構造を有する:コントロールの [DIV、object3d]、[DIV、object3d]、[DIV、object3d]、[DIV、object3d]

および変更イベントは、以下を実行します:フィドル作業

 if (labels !== undefined) { 
       for (var i = 0; i < labels.length; i++) { 
         var position = getScreenTranslation(labels[i][1]); 
         labels[i][0].css({ 
           left: position.x, 
           top: position.y 
         }); 
       } 
     } 

編集:https://jsfiddle.net/dpe5r41g/

+0

をこのフィドルの方法。 http://fiddle.jshell.net/umairrafiq/b3mvLxk7/7/ –

+1

遅れて申し訳ありませんが、私はbboxにいくつかのマトリックスアップデートをするのを忘れていました。私はfiddle @ https://jsfiddle.net/vvq35tc8/を作った – Radio

関連する問題