3Dオブジェクト座標を 'div'要素の2D座標に変換するためにThree.jsコードが必要です。これにより、必要な場所にテキストラベルを配置できます(これらのラベルは3Dの動きに合わせてスケーリング/移動/回転せずに)。残念ながら、私がこれまでに見て試したすべての例は、時代遅れの関数/技術を使用しているようです。私の場合、Three.jsのr69を使用していると思います。
これは、私にとってエラーを生成するだけの「古い」手法の例です。
ここに、新しいコード(?)のスニペットを示します。これは、作業を開始するのに十分なコンテキストを提供しませんが、よりきれいに見えます。
私のプロジェクト用に次の機能を作成しました。パラメータとしてTHREE.Object3D
インスタンスとカメラを受け取り、画面上の位置を返します。
function toScreenPosition(obj, camera)
{
var vector = new THREE.Vector3();
var widthHalf = 0.5*renderer.context.canvas.width;
var heightHalf = 0.5*renderer.context.canvas.height;
obj.updateMatrixWorld();
vector.setFromMatrixPosition(obj.matrixWorld);
vector.project(camera);
vector.x = ( vector.x * widthHalf ) + widthHalf;
vector.y = - ( vector.y * heightHalf ) + heightHalf;
return {
x: vector.x,
y: vector.y
};
};
次に、div位置を保持するためにTHREE.Object3D
を作成し(シーン内のメッシュにアタッチします)、必要なときにtoScreenPosition
関数を使用して画面位置に簡単に変換し、 div要素。
var proj = toScreenPosition(divObj, camera);
divElem.style.left = proj.x + 'px';
divElem.style.top = proj.y + 'px';
次のようなパターンを使用して、3D位置をスクリーン座標に変換できます。
var vector = new THREE.Vector3();
var canvas = renderer.domElement;
vector.set( 1, 2, 3 );
// map to normalized device coordinate (NDC) space
vector.project( camera );
// map to 2D screen space
vector.x = Math.round( ( vector.x + 1 ) * canvas.width / 2 );
vector.y = Math.round( ( - vector.y + 1 ) * canvas.height / 2 );
vector.z = 0;
three.js r.69
私にとって、この関数は動作します(Three.jsバージョン69):
function createVector(x, y, z, camera, width, height) {
var p = new THREE.Vector3(x, y, z);
var vector = p.project(camera);
vector.x = (vector.x + 1) / 2 * width;
vector.y = -(vector.y - 1) / 2 * height;
return vector;
}