如何嵌入唯一Id到modelBuilder和加载多个模型?



我有一些关于modelBuilder和aggregatesselection的问题。

  1. 当我使用场景生成器加载一些模型时,我可以在模型中嵌入唯一的Id吗?似乎dbId只适用于一个网格。

  2. 是否可以加载多个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的锻造查看器元素。

最新更新