如何合并文本、球体和盒子几何?

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 球体几何是不是有大小限制?

Three.js 的球体几何位置

2.2 与球体相交-几何解

THREE.js 部分球体几何给出了两个段,其中一个段是预期的

Metal / SceneKit Fragment Shaders - 如何避免在其他几何体上渲染?

如何在Boost几何中使用多个线串创建盒子?