如何为在查看器上绘制的标记添加侦听器CMERA_CHANGE_EVENT?如果我们针对dbid创建一个标签,我们可以存储它的坐标,并可以在坐标上应用worldToClient来获得新的坐标。但是这对于svg的标记是如何工作的呢?
在我的应用程序中,用户可以通过两种方式关联rfi信息。1.只需单击一个模型obkject/dbid,我就可以让用户通过textbox添加一些文本信息,并将其作为带有所选对象/dbid的标签。这是随着标签移动与选定的对象,而摄像机旋转事件。
从技术上讲,我使用函数getObjPosition获取dbid的坐标,并将其存储在标签控件中,并在摄像机更改事件期间提取这些值,并使用下面的函数getClientCoordinates更新当前的客户端坐标。
function getObjPosition(dbId) {
const model = viewer.model;
const instanceTree = model.getData().instanceTree;
const fragList = model.getFragmentList();
let bounds = new THREE.Box3();
instanceTree.enumNodeFragments( dbId, ( fragId ) => {
let box = new THREE.Box3();
fragList.getWorldBounds( fragId, box );
bounds.union( box );
}, true );
const position = bounds.center();
return position;
}
function getClientCoordinates(positionCoordinates){
var screenpoint = viewer.worldToClient(
new THREE.Vector3(positionCoordinates.x,
positionCoordinates.y,
positionCoordinates.z,));
return screenpoint
}
在本场景中,
var pos = markup.markups.getClientPosition();并使用此创建的标记标记标签。它起作用了。对于相机改变事件,标记本身失去了它的位置,所以不确定我将如何附加到模型和应用坐标的标签。这里另一个令人担心的部分是,我应该如何在相机更改事件中获得模型上的所有标记。
希望我的问题现在清楚了。
发布于 2020-03-02 07:14:57
CAMERA_CHANGE_EVENT
适用于整个场景,每当导航发生时,就无法将其绑定到任何特定的对象,这样做也没有什么意义。
如果您试图将SVG标记移动到它们的新的对应坐标-- post导航--只需在导航之前存储它们原来的世界位置(使用clientToWorld
),然后使用worldToClient
获得它们的新的坐标后导航。
https://stackoverflow.com/questions/60457516
复制相似问题