【发布时间】: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