【发布时间】:2017-02-21 03:28:30
【问题描述】:
【问题讨论】:
-
我准备了一个jsfiddle来解释用法:fiddle.jshell.net/umairrafiq/b3mvLxk7/7
标签: javascript html 3d three.js
【问题讨论】:
标签: javascript html 3d three.js
除了精灵,如果您出于某种原因更喜欢使用 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。但例如,我在 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/
【讨论】: