Collada 模型面无法在 three.js 中正确显示

Posted

技术标签:

【中文标题】Collada 模型面无法在 three.js 中正确显示【英文标题】:Collada model faces not displaying correctly in three.js 【发布时间】:2012-07-30 23:41:13 【问题描述】:

将一个collada模型导入到three.js中后,模型的部分人脸只能从模型内部看到,从外部看不到。

如何解决相关面孔的问题?

是否可以让模特的脸从两侧都可见?

【问题讨论】:

你能把你的代码放在 jsfiddle 上而不是 rar 上吗? @jterrace jsfiddle.net/cvj157/AdLc9/8 这是我的源码。但是因为我不知道怎么给jsfiddle添加资源所以无法运行。原始模型图片可以从images.cnblogs.com/cnblogs_com/e-life/401048/r_original.JPG和collada 显示图片是images.cnblogs.com/cnblogs_com/e-life/401048/r_showing.JPG 这看起来更像是一个法线问题。您是否检查以确保该圆柱面上的法线没有翻转? @Nimphious 不确定!很抱歉不知道你的意思。模型下载自sketchup.google.com/3dwarehouse/… 如果你把相机放在模型里面向外看,你能看到缺失的部分吗?网格中的每个多边形都有所谓的法线,它是描述多边形所面对方向的向量。如果以错误的方式翻转,您将无法看到多边形,但您将能够从内部看到它。 【参考方案1】:

要修复方向不正确的面,请将模型加载到 Blender 之类的 3D 建模程序中,并翻转未正确显示的面的法线。

Three.js 网格有一个可以设置的双面属性,通常可以让您显示模型的面从两侧可见。

这是一个关于如何加载 collada 网格并启用双面渲染的简短示例。

var loader = new THREE.ColladaLoader();
loader.load('path/to/mesh.dae', loadModel);

function loadModel(geom) 
    var mesh = new THREE.Mesh(geom, new THREE.MeshBasicMaterial());
    mesh.doublesided = true;
    scene.add(mesh);

还有一个活生生的例子:http://jsfiddle.net/r7Yq2/

【讨论】:

显然它在 r50 中发生了变化:现在应该在材质上设置它:material.side = THREE.DoubleSide; (我花了一段时间才发现!)【参考方案2】:

它不能正常工作的原因是因为你的文件设置了这个双面标志:

<effect id="material_3_4_0-effect" name="material_3_4_0-effect">
   <profile_COMMON>
      ...
      <extra>
         <technique profile="GOOGLEEARTH">
            <double_sided>1</double_sided>
         </technique>
      </extra>
   </profile_COMMON>
</effect>

three.js ColladaLoader 不会查找此标志,而是按应有的方式在材质上设置 doubleSided。我已经 filed a bug 处理这个问题。

【讨论】:

以上是关于Collada 模型面无法在 three.js 中正确显示的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Three.js 中用 ShaderMaterial 替换 Collada 导入的纹理?

基本的three.js collada蒙皮动画

如何使用 Three.js 和 Collada Loader 更新 .dae 文件中模型的特定部分

Three.js Collada - 在三个 js 中加载多个 Collada 对象

无法使用 Three.js 加载从搅拌机导出的纹理 Collada

如何在 Three.js 中克隆包含多个网格的 Collada 对象