首页 > 解决方案 > 为什么 ModelBuilder addGeometry 函数会抛出错误

问题描述

我想在 forge 查看器中为我的模型添加自定义几何图形。为此,我使用了模型构建器扩展,但 modelBuilder.addGeometry 函数会引发以下错误:

thirdparty/three.js/three.js:33 未处理的承诺拒绝:无法读取未定义的属性“位置”

const sceneBuilder: any = await this.viewer.loadExtension('Autodesk.Viewing.SceneBuilder');
const modelBuilder: any = await sceneBuilder.addNewModel({
    modelNameOverride: 'My Custom Model',
    conserveMemory: false
});

const geometry: THREE.Geometry = new THREE.Geometry();
    
let vertexIndex = 0;
// room is a custom object coming from our database containing 2D geometrical information
    for (let i = 1; i < room.Outline.Vertices.length; i++) {
      const bimV1 = room.Outline.Vertices[i - 1];
      const bimV2 = room.Outline.Vertices[i];
      if (i === 1) {
        const v1 = new THREE.Vector3(bimV1.X, bimV1.Y, room.Zbase);
        const v2 = new THREE.Vector3(bimV1.X, bimV1.Y, room.Zbase + 5);
        geometry.vertices.push(v1);
        geometry.vertices.push(v2);
      }
      
      const v3 = new THREE.Vector3(bimV2.X, bimV2.Y, room.Zbase);      
      const v4 = new THREE.Vector3(bimV2.X, bimV2.Y, room.Zbase + 5);
      
      geometry.vertices.push(v3);      
      geometry.vertices.push(v4);

      const face1 = new THREE.Face3(vertexIndex, vertexIndex + 1, vertexIndex + 2);
      const face2 = new THREE.Face3(vertexIndex + 1, vertexIndex + 2, vertexIndex + 3);

      geometry.faces.push(face1);
      geometry.faces.push(face2);

      vertexIndex += 2;
    }

geometry.computeFaceNormals();

const bufferGeometry = new THREE.BufferGeometry().fromGeometry(geometry);
const material = new THREE.MeshPhongMaterial({ color: new THREE.Color(0, 0, 1), opacity: 0.5 });
const transform = new THREE.Matrix4().identity();
modelBuilder.addMaterial('MyCustomMaterial', material);
const geometryId = modelBuilder.addGeometry(geometry);
const cylinderFragId = modelBuilder.addFragment(geometryId, 'MyCustomMaterial', transform);

是什么导致了这个错误?当我使用这样的三缸时,它可以工作:

const sceneBuilder: any = await this.viewer.loadExtension('Autodesk.Viewing.SceneBuilder');
const modelBuilder: any = await sceneBuilder.addNewModel({
    modelNameOverride: 'My Custom Model',
    conserveMemory: false
});
const cylinderGeometry = new THREE.BufferGeometry().fromGeometry(new THREE.CylinderGeometry(5, 5, 10));
const cylinderMaterial = new THREE.MeshPhongMaterial({ color: new THREE.Color(0, 0, 1) });
const cylinderTransform = new THREE.Matrix4().compose(
    new THREE.Vector3(+10, +10, 0),
    new THREE.Quaternion(0, 0, 0, 1),
    new THREE.Vector3(1, 1, 1)
);
modelBuilder.addMaterial('MyCustomMaterial', cylinderMaterial);
const cylinderGeomId = modelBuilder.addGeometry(cylinderGeometry);
const cylinderFragId = modelBuilder.addFragment(cylinderGeomId, 'MyCustomMaterial', cylinderTransform);

我也已经尝试过使用 BufferGeometry,但这并没有帮助......

编辑:我也尝试使用“ConvexGeomtry”类:

let vertices :THREE.Vector3[] = [];
for (let i = 0; i < room.Outline.Vertices.length; i++) {
  const bimV1 = room.Outline.Vertices[i];
  vertices.push(new THREE.Vector3(bimV1.X, bimV1.Y, bimV1.Zbase));
  vertices.push(new THREE.Vector3(bimV1.X, bimV1.Y, bimV1.Zbase + 5));
}

const geometry = new ConvexGeometry(vertices);

const material = new THREE.MeshPhongMaterial({ color: new THREE.Color(0, 0, 1), opacity: 0.5 });
const transform = new THREE.Matrix4().identity();
modelBuilder.addMaterial('MyCustomMaterial', material);
const geometryId = modelBuilder.addGeometry(geometry);
modelBuilder.addFragment(geometryId, 'MyCustomMaterial', transform);

调用'modelBuilder.addGeometry(geometry)'时会引发相同的错误

标签: autodesk-forgeautodesk-viewer

解决方案


您的代码段中似​​乎有错误。当您将THREE.Geometry对象转换为THREE.BufferGeometry对象时(Forge Viewer 需要),您将错误的变量传递给modelBuilder.addGeometry方法。

尝试更换

const geometryId = modelBuilder.addGeometry(geometry);

const geometryId = modelBuilder.addGeometry(bufferGeometry);

推荐阅读