スプライトだけでなく、何らかの理由で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の位置を更新する必要があります。これは、カメラまたはコントロールを使用して行うことができます。ボイラープレートはコントロール入力でのみ世界を変更するため、変更イベント関数を使用します。
this.controls.addEventListener('change', my_change_event_function);
管理しているdivを知るのは難しいため、ここで例を示すのは困難です。しかし、例えば私はjquerydivで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/
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加