我使用此代码将具有多个网格的自定义模型添加到 Forge 查看器
let cameras = camerasJSON.cameras[0];
let sceneBuilder = await viewer.loadExtension('Autodesk.Viewing.SceneBuilder');
let modelBuilder = await sceneBuilder.addNewModel({
modelNameOverride: 'Cameras',
conserveMemory: false
})
cameras.forEach(camera => {
const sphereGeometry = new THREE.BufferGeometry().fromGeometry(new THREE.SphereGeometry(1, 8, 8));
const sphereMaterial = new THREE.MeshPhongMaterial({ color: new THREE.Color(0, 1, 0) });
let p = [+camera[2]/1000, +camera[3]/1000, +camera[4]/1000]
const sphereTransform = new THREE.Matrix4().compose(
new THREE.Vector3(...p),
new THREE.Quaternion(0,0,0,1),
new THREE.Vector3(1, 1, 1)
);
let mesh = new THREE.Mesh(sphereGeometry, sphereMaterial);
mesh.matrix = sphereTransform
mesh.dbId = camera[0].split('_')[1];
modelBuilder.addMesh(mesh);
})
然后我尝试使用此代码检索单击片段的位置
event.selections[0].model.getInstanceTree().enumNodeFragments(event.selections[0].dbIdArray[0], function (frag) {
let fragProxy = viewer.impl.getFragmentProxy(viewer.model, frag);
let matrix = new THREE.Matrix4();
fragProxy.getWorldMatrix(matrix);
let position = new THREE.Vector3().setFromMatrixPosition(matrix);
console.log(position);
});
检索到的位置(以及变换矩阵本身)与初始位置不匹配。创建的网格(绿色)位置正确。但实际的片段位置(红色)甚至相对也不匹配。为了可见性,模型已分解。
删除全局偏移似乎没有任何效果。
不确定我是否错误地检索了位置,或者片段的位置在添加过程中以某种方式发生了转换。主力机型没有这个问题。
我找错了型号。要检索使用 modelBuilder 添加的片段的位置,您应该使用 modelBuilder.model 而不是viewer.model。它变成了这样:
const frags = modelBuilder.model.getFragmentList();
let matrix = new THREE.Matrix4();
frags.getOriginalWorldMatrix(event.selections[0].fragIdsArray[0],
matrix);
let position = new THREE.Vector3().setFromMatrixPosition(matrix);