未定义的 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 抛出警告)