修复自定义 threejs 胶囊几何体中的法线

Fixing normals in custom threejs capsule geometry

为了在 three.js 中学习更多关于自定义几何的知识,我尝试调整 Paul Bourke's capsule geometry example

对于我的自定义胶囊几何结构,我目前遇到两个问题:

  1. 中间面法线方向不正确。
  2. 侧面有一条硬缝。 (编辑:通过故意计算面部法线来修复。更新要点中的代码)

也许还有一个悬而未决的问题:

  1. 在该中间段添加顶点循环的一般策略是什么?

总的来说,我对几何非常满意,但是有人能给我一些解决这些问题的指导吗?感觉中段的正常问题一定是人脸的朝向,下面是相关的人脸构建片段:

  for(let i = 0; i <= N/2; i++){
    for(let j = 0; j < N; j++){
      let vec = new THREE.Vector4(
        i         * ( N + 1 ) +   j       ,
        i         * ( N + 1 ) + ( j + 1 ) ,
        ( i + 1 ) * ( N + 1 ) + ( j + 1 ) ,
        ( i + 1 ) * ( N + 1 ) +   j
      );

      let face_1 = new THREE.Face3(vec.x,vec.y,vec.z);
      let face_2 = new THREE.Face3(vec.x,vec.z,vec.w);

      geometry.faces.push(face_1);
      geometry.faces.push(face_2);
    }
  }

CapsuleGeometry.js


那里有 shading/normal 接缝,因为您可能在那里明确定义了硬边。

当您 运行 循环生成顶点时,您可能会复制起始位置。如果从0开始,一路走到2PI,0==2PI。当你编织三角形时,你可能告诉最小的一个使用 2PI 而不是 0,即使它们处于相同的位置,就三角形而言,它们指向不同的顶点,因此没有连接。

for(let i = 0; i <= N/4; i++){ //change to i < N 
for(let j = 0; j <= N; j++){

如果您告诉循环中的最后一个三角形指向起始顶点,您将创建一个 geometry.computeVertexNormals() 可以平滑的连续曲面。

您也可以直接计算这些法线。在这些情况下,所有法线都可以在扩展之前从原始球体的顶点位置获得。