如何合并文本、球体和盒子几何?
Posted
技术标签:
【中文标题】如何合并文本、球体和盒子几何?【英文标题】:How to merge Text, Sphere and Box Geometry? 【发布时间】:2021-10-28 21:19:47 【问题描述】:我正在尝试合并文本、球体和框几何体,这样我就可以只用一个设置位置来改变所有位置。条件是我必须使用 BufferGeometry。合并球体和框时一切正常,但合并文本几何时出错。
上面写着Uncaught (in promise) TypeError: Cannot read property 'x' of undefined at X.BufferGeometry.fromGeometry
let modelGeometry = new THREE.Geometry();
const globalMaterial = new THREE.MeshBasicMaterial( color: 0xff0000 );
const head = new THREE.SphereGeometry(0.5, 32, 16);
const body = new THREE.SphereGeometry(0.5, 32, 16);
const textGeometry = new THREE.TextGeometry("text ID",
font: "monaco",
size: 1,
height: 0,
curveSegments: 3,
);
textGeometry.computeBoundingBox();
textGeometry.mergeVertices();
const textMaterial = new THREE.MeshBasicMaterial( color: 0xff0000 );
const workerId = new THREE.Mesh(textGeometry, textMaterial);
const headMesh = new THREE.Mesh(head, globalMaterial);
const bodyMesh = new THREE.Mesh(body, globalMaterial);
headMesh.matrix.setPosition(new THREE.Vector3(0, 0, 3));
bodyMesh.matrix.scale(new THREE.Vector3(1, 1, 4));
modelGeometry.merge(headMesh.geometry, headMesh.matrix);
modelGeometry.merge(bodyMesh.geometry, bodyMesh.matrix);
modelGeometry.merge(workerId.geometry, workerId.matrix);
const bufGeometry = new THREE.BufferGeometry().fromGeometry(modelGeometry);
this.human = new THREE.Mesh(bufGeometry, globalMaterial);
this.modelBuilder.addMesh(this.human);
【问题讨论】:
您使用的是 Three.js 的哪个版本?从 r125 开始,THREE.Geometry()
已从框架核心移出。现在所有的几何都是缓冲几何。要合并它们,您必须使用 BufferGeometryUtils.mergeBufferGeometries( _array_ );
我使用 r71 ThreeJS 版本,它是 Autodesk Forge 的一个库。
【参考方案1】:
参考这个discussion 文本几何中缺少的东西。需要添加computeVertexNormals();
modelGeometry.merge(headMesh.geometry, headMesh.matrix);
modelGeometry.merge(bodyMesh.geometry, bodyMesh.matrix);
modelGeometry.merge(humanIdMesh.geometry, humanIdMesh.matrix);
modelGeometry.computeVertexNormals();
const humanModel = new THREE.BufferGeometry().fromGeometry(modelGeometry);
【讨论】:
以上是关于如何合并文本、球体和盒子几何?的主要内容,如果未能解决你的问题,请参考以下文章
THREE.js 部分球体几何给出了两个段,其中一个段是预期的