为什么 ModelBuilder addGeometry 函数会抛出错误
Why does ModelBuilder addGeometry function throw error
我想在 Forge 查看器中为我的模型添加自定义几何体。为此,我使用模型构建器扩展,但 modelBuilder.addGeometry 函数抛出以下错误:
thirdparty/three.js/three.js:33
未处理的 Promise 拒绝:无法读取未定义的 属性 'position'
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' class:
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);
我想在 Forge 查看器中为我的模型添加自定义几何体。为此,我使用模型构建器扩展,但 modelBuilder.addGeometry 函数抛出以下错误:
thirdparty/three.js/three.js:33 未处理的 Promise 拒绝:无法读取未定义的 属性 'position'
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' class:
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);