未定义的 vertexUv 警告

Posted

技术标签:

【中文标题】未定义的 vertexUv 警告【英文标题】:Undefined vertexUv warning 【发布时间】:2016-01-14 06:08:10 【问题描述】:

我将 3D 模型从 SketchUp 导出到 collada,并使用 Threejs Collada 加载器加载它。但我收到以下警告:

THREE.DirectGeometry.fromGeometry(): Undefined vertexUv 2

似乎我的 collada 模型中的某些网格有 4 个面,但只有 2 个 UV 值。任何想法为什么 collada 缺少 UV 值?在 Threejs 中是否有加载此类模型的解决方法?

在 threejs 库的 71 版中,这曾经只是一个警告,但在 72 版中,这会在使用picking 时导致以下错误:

Uncaught TypeError: Cannot read property '0' of undefined (12:59:20:764 | error, javascript)
    at raycast (public_html/libs/three.js:17237:19)
    at intersectObject (public_html/libs/three.js:7678:10)
    at intersectObject (public_html/libs/three.js:7686:5)
    at intersectObject (public_html/libs/three.js:7686:5)
    at intersectObject (public_html/libs/three.js:7686:5)
    at THREE.Raycaster.intersectObject (public_html/libs/three.js:7734:4)
    at adjustCameraPositionForCollision (public_html/PointerLockControls.js:302:86)
    at update (public_html/PointerLockControls.js:257:14)
    at render (public_html/simbuilding.js:113:24)

【问题讨论】:

您是否尝试在 Blender 中加载模型,添加 UV 贴图并将其导出(到 collada 或其他什么?) 已经有一段时间了,所以我不完全记得我最终对这个问题做了什么。我想我最终只是删除了罪魁祸首多边形。这些多边形非常小,删除它们不会导致任何视觉问题。 【参考方案1】:

您可以尝试将 Uvs 分配给您的几何体

  assignUVs(geometry) 
    geometry.computeFaceNormals();
    geometry.mergeVertices();
    geometry.faceVertexUvs[0] = [];
    geometry.faces.forEach((face) => 
      const components = ['x', 'y', 'z'].sort((a, b) => 
        return Math.abs(face.normal[a]) > Math.abs(face.normal[b]);
      );
      const v1 = geometry.vertices[face.a];
      const v2 = geometry.vertices[face.b];
      const v3 = geometry.vertices[face.c];
      geometry.faceVertexUvs[0].push([
        new THREE.Vector2(v1[components[0]], v1[components[1]]),
        new THREE.Vector2(v2[components[0]], v2[components[1]]),
        new THREE.Vector2(v3[components[0]], v3[components[1]])
      ]);
    );
    geometry.uvsNeedUpdate = true;
    return geometry;
  

【讨论】:

以上是关于未定义的 vertexUv 警告的主要内容,如果未能解决你的问题,请参考以下文章

“注意:未定义的变量”、“注意:未定义的索引”、“警告:未定义的数组键”和“注意:未定义的偏移量”使用 PHP

“注意:未定义的变量”、“注意:未定义的索引”、“警告:未定义的数组键”和“注意:未定义的偏移量”使用 PHP

“未定义变量”警告,但变量已在所有进程中定义

为啥“”.abcd 返回未定义的值而不是在 Javascript 中抛出未定义的错误(但 Typescript 抛出警告)

警告:未定义的回调函数终止/3(行为'gen_statem')**

Perl 的模板工具包可以警告未定义的值吗?