我有一些关于modelBuilder和aggregatesselection的问题。
-
当我使用场景生成器加载一些模型时,我可以在模型中嵌入唯一的Id吗?似乎dbId只适用于一个网格。
-
是否可以加载多个SceneBuilder模型?(不只是一些对象在modelbuilder)。我想做一个工具,可以点击一个对象,并能够移动它。但实际情况是,模型构建器中的所有对象都移动了。
addBox(dbId, position, rotation) { this.viewer .loadExtension("Autodesk.Viewing.SceneBuilder") .then((builder) => { this.sceneBuilder = builder; return this.sceneBuilder.addNewModel({ modelNameOverride: "box", conserveMemory: false, }); }) .then((builder) => { console.log("model builder created"); let modelBuilder = builder; const box = new THREE.BoxGeometry(1, 1, 1); const boxBuff = new THREE.BufferGeometry().fromGeometry(box); this.box = new THREE.Mesh(boxBuff, this.globalMaterial); this.box.dbId = dbId; modelBuilder.addMesh(this.box); }); } addSphere(dbId, position, rotation) { this.viewer .loadExtension("Autodesk.Viewing.SceneBuilder") .then((builder) => { this.sceneBuilder = builder; return this.sceneBuilder.addNewModel({ modelNameOverride: "sphere", conserveMemory: false, }); }) .then((builder) => { let modelBuilder = builder; console.log("model builder created"); let modelBuilder = builder; const sphere = new THREE.SphereGeometry(0.5, 32, 16); const sphereBuff = new THREE.BufferGeometry().fromGeometry(sphere); this.sphere = new THREE.Mesh(boxBuff, this.globalMaterial); this.sphere.dbId = dbId; modelBuilder.addMesh(this.sphere); });
}
没有办法将自定义id分配给使用SceneBuilder
扩展创建的实际模型(Forge Viewer自动将序列号分配给所有模型),但您可以将自定义dbid分配给单个网格,就像您在代码片段中使用mesh.dbId
属性一样。
,顺便说一句。您可以使用ModelBuilder#changeFragmentTransform方法轻松地操作模型中的单个网格。下面两个函数将一个盒子和一个球体插入到查看器中,并且这些对象中的每一个都将以不同的方式呈现动画:
async function addBoxModel(viewer, dbid, position = new THREE.Vector3(0, 0, 0), orientation = new THREE.Quaternion(0, 0, 0, 1), scale = new THREE.Vector3(1, 1, 1)) {
const sceneBuilder = await viewer.loadExtension('Autodesk.Viewing.SceneBuilder');
const modelBuilder = await sceneBuilder.addNewModel({
modelNameOverride: 'box',
conserveMemory: false
});
const mesh = new THREE.Mesh(
new THREE.BufferGeometry().fromGeometry(new THREE.BoxGeometry(10, 10, 10)),
new THREE.MeshPhongMaterial({ color: new THREE.Color(1, 0, 0) })
);
mesh.matrix = new THREE.Matrix4().compose(position, orientation, scale);
mesh.dbId = dbid;
modelBuilder.addMesh(mesh);
// Animate the object, rotating it around the Z axis
let angle = 0;
setInterval(() => {
const offset = new THREE.Vector3(100.0 * Math.cos(angle), 100.0 * Math.sin(angle), 0.0);
const matrix = new THREE.Matrix4().compose(offset.add(position), orientation, scale);
modelBuilder.changeFragmentTransform(mesh, matrix);
viewer.impl.invalidate(true, true, true);
angle += Math.PI / 50;
}, 100);
}
async function addSphereModel(viewer, dbid, position = new THREE.Vector3(0, 0, 0), orientation = new THREE.Quaternion(0, 0, 0, 1), scale = new THREE.Vector3(1, 1, 1)) {
const sceneBuilder = await viewer.loadExtension('Autodesk.Viewing.SceneBuilder');
const modelBuilder = await sceneBuilder.addNewModel({
modelNameOverride: 'box',
conserveMemory: false
});
const mesh = new THREE.Mesh(
new THREE.BufferGeometry().fromGeometry(new THREE.SphereGeometry(10.0, 16, 16)),
new THREE.MeshPhongMaterial({ color: new THREE.Color(0, 1, 0) })
);
mesh.matrix = new THREE.Matrix4().compose(position, orientation, scale);
mesh.dbId = dbid;
modelBuilder.addMesh(mesh);
// Animate the object, rotating it around the X axis
let angle = 0;
setInterval(() => {
const offset = new THREE.Vector3(0.0, 100.0 * Math.cos(angle), 100.0 * Math.sin(angle));
const matrix = new THREE.Matrix4().compose(offset.add(position), orientation, scale);
modelBuilder.changeFragmentTransform(mesh, matrix);
viewer.impl.invalidate(true, true, true);
angle += Math.PI / 50;
}, 100);
}
根据用于生成Forge模型的种子CAD软件,externalId
属性可能已经包含了一个合适的唯一id。
这是从Revit的角度在文章中解释唯一id的锻造查看器元素。