autodesk-forge - 为什么 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)'时会引发相同的错误
解决方案
您的代码段中似乎有错误。当您将THREE.Geometry
对象转换为THREE.BufferGeometry
对象时(Forge Viewer 需要),您将错误的变量传递给modelBuilder.addGeometry
方法。
尝试更换
const geometryId = modelBuilder.addGeometry(geometry);
和
const geometryId = modelBuilder.addGeometry(bufferGeometry);
推荐阅读
- python - Pandas DataFrame 从其他 DataFrame 添加两列
- firebase - 我可以使用此快照调用访问文档 ID 吗?
- javascript - jQuery 背景随 id 变化
- swift - 什么是suppressesIncrementalRendering?
- android - 与许多设备的蓝牙连接
- intellij-idea - Intellij 本地历史“贴标签”有什么意义?
- django - Nginx 502 网关错误 - gcp
- typescript - 如何查看来自 TypeScript 插件的日志?
- sql - SQL连接两个表并从两个表中删除重复项,但不会丢失表本身的任何重复项
- javascript - 部署到 Heroku 时如何使 api 端点以用户的本地主机为目标