【问题标题】:threejs wireframe not working with OBJMTLLoader三个 js 线框不适用于 OBJ MTL Loader
【发布时间】:2014-06-23 21:06:19
【问题描述】:

我正在使用 OBJMTLLoader 在threejs 中加载我的对象,线框控件单独为 OBJLoader 工作,但对于 OBJMTLLoader 它不起作用

var loader = new THREE.OBJMTLLoader();
                loader.load( 'obj/male02/male02.obj', 'obj/male02/male02_dds.mtl', function ( object ) {
                  object.children[0].geometry.computeFaceNormals();
                  var  geometry = object.children[0].geometry;
                          console.log(geometry);
                  THREE.GeometryUtils.center(geometry);
                  geometry.dynamic = true;
                  var material = new THREE.MeshLambertMaterial({color: 0xffffff, shading: THREE.FlatShading, vertexColors: THREE.VertexColors });
                  mesh = new THREE.Mesh(geometry, material);  
                  scene.add( mesh );
                } );



function wireframe(){
                 //alert('hhhhhh');
                 mesh.material.wireframe = true;
              mesh.material.color = new THREE.Color( 0x6893DE  );
                }

但它会导致以下错误,所以我的模型没有显示在查看器上, 所以在这里我想知道我们可以在任何类型的 3d 模型上创建线框?

object.children[0].geometry 未定义

【问题讨论】:

    标签: three.js


    【解决方案1】:

    即使OBJMTLLoader 返回一个具有.childrenTHREE.Object3D 对象,您也不应该假定.childrenTHREE.Mesh 类型。所以你实际上应该traverse() THREE.Object3D 才能找到THREE.Mesh

    object.traverse( function ( child ) {
    
    if ( child instanceof THREE.Mesh )
    
        // do something with the geometry
    
    } );
    

    【讨论】:

    • 嗨@gaitat 现在我没有任何错误,但我应用了几何和网格但仍然线框不起作用,这里看代码 object.traverse( function ( child ) {if (child instanceof THREE.Mesh) {child.geometry.computeFaceNormals(); var geometry = child.geometry; geometry.dynamic = true; } }); var material = new THREE.MeshLambertMaterial({color: 0xffffff, shading: THREE.FlatShading, vertexColors: THREE.VertexColors });网格=新的三。网格(几何,材料);场景.add(网格);
    • 您在traverse() 函数内部定义geometry,然后在函数外部使用它。这是范围问题。
    • 如果我在 traverse() 内部使用几何,如果 (child instanceof THREE.Mesh) { child.geometry.computeFaceNormals(); 得到相同的结果var 几何 = child.geometry;控制台.log(几何);几何.动态=真; var 材料 = 新的 THREE.MeshLambertMaterial();网格=新的三。网格(几何,材料); } });
    • 在这个jsfiddle jsfiddle.net/Dkbu2你可以改变useWireFrame的值看看效果。最初我为球体设置了一个材质,然后使用traverse() 将材质更改为线框。
    • 嘿,工作正常,非常感谢您的回答,这里我们使用了 MeshNormalMaterial 我们可以使用线框对象上使用的默认材质吗??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 2020-11-11
    • 2020-07-05
    • 1970-01-01
    • 2016-05-06
    • 2015-01-07
    • 2017-01-24
    相关资源
    最近更新 更多