【问题标题】:Why does ModelBuilder addGeometry function throw error为什么 ModelBuilder addGeometry 函数会抛出错误
【发布时间】:2020-11-27 16:38:06
【问题描述】:

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

第三方/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)'时会抛出同样的错误

【问题讨论】:

  • 你提到的代码——无论是你的自定义几何图形还是圆柱体——对我来说都不错,这让我认为问题可能出在你没有在这里包含的那一部分,那就是一代您的自定义几何图形。你能把那部分加到你的问题中吗?
  • 嗨,彼得,谢谢您的回答。我添加了代码,其中添加了顶点和面。我不明白哪个拥有位置属性的对象可能是未定义的......
  • 为了确保正确设置几何图形,我使用了“ConvexGeometry”类,仅在顶点数组中传递我的点。尽管如此,调用'modelBuilder.addGeometry(geometry)'时我得到同样的错误......

标签: autodesk-forge autodesk-viewer


【解决方案1】:

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

尝试替换

const geometryId = modelBuilder.addGeometry(geometry);

const geometryId = modelBuilder.addGeometry(bufferGeometry);

【讨论】:

  • 非常感谢您为我指明了正确的方向。我之前尝试过bufferGeometry,但它不起作用。当我从'三'中删除'import * as THREE;'从我的代码中改为使用'declare var THREE:any;'参考三​​,我的代码确实运行了。当然,你的答案也是正确的,它只适用于 bufferGeometry。再次感谢您的快速帮助!
猜你喜欢
  • 2022-08-19
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
  • 2018-08-19
相关资源
最近更新 更多