【问题标题】:ThreeJS - JSONLoader "Cannot read property 'uniforms' of undefinedThreeJS - JSONLoader“无法读取未定义的属性'制服'
【发布时间】:2013-06-28 01:07:01
【问题描述】:

我正在尝试从 Blender 导出带有纹理的对象。导出的 JSON 如下所示:

 {

    "metadata" :
    {
        "formatVersion" : 3.1,
        "generatedBy"   : "Blender 2.66 Exporter",
        "vertices"      : 8,
        "faces"         : 6,
        "normals"       : 8,
        "colors"        : 0,
        "uvs"           : [],
        "materials"     : 1,
        "morphTargets"  : 0,
        "bones"         : 0
    },

    "scale" : 1.000000,

    "materials" : [ {
        "DbgColor" : 15658734,
        "DbgIndex" : 0,
        "DbgName" : "Material",
        "blending" : "NormalBlending",
        "colorAmbient" : [0.6400000190734865, 0.6400000190734865, 0.6400000190734865],
        "colorDiffuse" : [0.6400000190734865, 0.6400000190734865, 0.6400000190734865],
        "colorSpecular" : [0.0, 0.0, 0.0],
        "depthTest" : true,
        "depthWrite" : true,
        "mapDiffuse" : "unicorn.jpg",
        "mapDiffuseWrap" : ["repeat", "repeat"],
        "shading" : "Lambert",
        "specularCoef" : 50,
        "transparency" : 1.0,
        "transparent" : false,
        "vertexColors" : false
    }],

    "vertices" : [1,-1,-1,1,-1,1,-1,-1,1,-0.999999,-1,-1,1,1,-0.999999,0.999999,1,1,-1,1,0.999999,-1,1,-1],

    "morphTargets" : [],

    "normals" : [0.577349,-0.577349,-0.577349,0.577349,-0.577349,0.577349,-0.577349,-0.577349,0.577349,-0.577349,-0.577349,-0.577349,0.577349,0.577349,-0.577349,-0.577349,0.577349,-0.577349,-0.577349,0.577349,0.577349,0.577349,0.577349,0.577349],

    "colors" : [],

    "uvs" : [],

    "faces" : [35,0,1,2,3,0,0,1,2,3,35,4,7,6,5,0,4,5,6,7,35,0,4,5,1,0,0,4,7,1,35,1,5,6,2,0,1,7,6,2,35,2,6,7,3,0,2,6,5,3,35,4,0,3,7,0,4,0,3,5],

    "bones" : [],

    "skinIndices" : [],

    "skinWeights" : [],

    "animation" : {}


}

我的 Json 加载器:

 var object;
var loader = new THREE.JSONLoader();          

loader.load( "models/texturecube.js", function(geometry, materials) {
    var material = new THREE.MeshFaceMaterial(materials);
    object = new THREE.Mesh(geometry, materials); // throws

    object.scale.set(1, 1, 1);
    scene.add(object)

});

加载程序抛出“无法读取未定义的属性 'uniforms'”异常。我看到其他人必须修改导出的 JSON 才能使其正常工作。有谁知道“制服”属性的用途是什么?我应该在我的 JSON 中定义这个吗?

谢谢!

【问题讨论】:

    标签: json 3d three.js blender


    【解决方案1】:

    您的material 变量未被使用。这样做:

    object = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial( materials ) );
    

    此外,如果您希望能够应用纹理,您的几何体将需要 UV。


    编辑:有一个新模式。如果您有一个材质数组,您现在可以将材质数组直接传递给Mesh 构造函数,如下所示:

    object = new THREE.Mesh( geometry, materials );
    

    three.js r.87

    【讨论】:

    • 很好看,我完全错过了。
    • Doh.. :) 确实不错。这会处理异常。还是没有对象。奇怪的是出口不包括它们(UV)。我将尝试再次导出。也许我错过了一个设置。
    • 我已选择 uv 进行导出,但生成的 JSON 中的数组仍然为空。也许这就是问题
    • 如果您有更多问题,请发一个新帖子——最好是对其他人有帮助的帖子。
    • @WestLangley 当然可以。当我遇到对你更有效率的事情时,我会通知你。
    【解决方案2】:

    您只将一种材料传递给该行中的对象:

    var material = new THREE.MeshFaceMaterial(materials[0]);
    

    相反,您需要像这样传递完整的材料数组:

    var material = new THREE.MeshFaceMaterial(materials);
    

    基本上导致错误的原因是,当您的模型尝试访问除第一个以外的任何材料时,它会引发undefined 错误,因为您尚未将材料传递给对象构造函数,因此该材料不存在。

    【讨论】:

    • 未指定特定材料仍会导致相同的异常
    猜你喜欢
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 2021-04-28
    • 2020-04-06
    相关资源
    最近更新 更多