首页 文章

在运行时导入.obj网格

提问于
浏览
0

我试图做大约2天的事情是在运行时导入一个网格:http://wiki.unity3d.com/index.php?title=ObjImporter

我总共发现了3个进口商,一个是我必须支付的,一个可能是上面进口商的修改版本,也是我现在拥有的那个 .

要导入它我做:

ObjImporter objImporter = new ObjImporter();
Holder.ModelMesh = objImporter.ImportFile("./file.obj");

遗憾的是,我收到了这个错误:

IndexOutOfRangeException: Array index is out of range.
ObjImporter.populateMeshStruct (.meshStruct& mesh) (at Assets/OBJReader/ObjImporter.cs:218)
ObjImporter.ImportFile (System.String filePath) (at Assets/OBJReader/ObjImporter.cs:33)

哪个指向:

temp.z = System.Convert.ToInt32(brokenBrokenString[2]);

我完全不知道为什么会这样做...我不知道如何修复它,因为我没有写那个脚本,所以我请求一些帮助,说明为什么它不会按预期工作 .

Additional information: 我可以找到我尝试加载的文件,因为我可以在脚本中将名称更改为"file.b",它告诉我它无法加载,而当我放入.obj时它告诉我没有错误 . 我还尝试了另外两个也失败的文件 .

edit 我也试过评论那条线,并且结果很奇怪:模型在那里,但我有一些奇怪的形状跟着我的相机无缘无故......

2 回答

  • 0

    我也尝试让这个导入器工作 . 我在半小时之前得到了这个问题的帮助,所以我想我分享了 .

    此导入器存在仅包含两个值的索引的问题 . 一个很好 . 三个很好 . 但是当您的索引区域包含面部索引(如f 5/1 6/2 2/3 1/4)时,导入器将失败并出现上述错误 .

    你必须替换这个:

    if (brokenBrokenString.Length > 1) //Some .obj files skip UV and normal
    {
        if (brokenBrokenString[1] != "") //Some .obj files skip the uv and not the normal
        {
            temp.y = System.Convert.ToInt32(brokenBrokenString[1]);
        }
        temp.z = System.Convert.ToInt32(brokenBrokenString[2]);
    }
    

    这样:

    if (brokenBrokenString.Length == 2) //Some .obj files skip UV and normal
    {
        temp.y = System.Convert.ToInt32(brokenBrokenString[1]);
    }
    
    if (brokenBrokenString.Length == 3) //Some .obj files skip UV and normal
    {
        if (brokenBrokenString[1] != "") //Some .obj files skip the uv and not the normal
        {
            temp.y = System.Convert.ToInt32(brokenBrokenString[1]);
        }
        temp.z = System.Convert.ToInt32(brokenBrokenString[2]);
    }
    

    这解决了faceindex值的问题,它只包含两个值而不是一个或三个值 .

    作为对口,你能不能告诉我你如何导入适合你的网格?因为我仍然坚持的是如何正确设置它以便它导入网格数据 . 维基很缺乏描述 . 现在错误信息已经消失,但仍然没有网格数据到达对象 . 我使用附加到带有网格过滤器的游戏对象的JS脚本 .

    #pragma strict
    
    var mesh1 : MeshFilter;
    
    function Start ()
    {
        mesh1= GetComponent(typeof(MeshFilter)) as MeshFilter;
        var objImporter = ObjImporter(); 
        var mesh1 = objImporter.ImportFile("C:/pathtomyfile/myfile.obj");
    
    }
    

    你似乎根本不使用meshfilter . 你究竟在做什么?你创建一个空,然后附加一个C#脚本?什么确切的脚本?怎么设置?脚本附在哪里?

    编辑,没关系,找到了解决方案 .

    我创建一个空的,添加一个网格过滤器,向它添加一个网格渲染器,然后在这里添加这个脚本,然后导入数据 . 太棒了:)

    #pragma strict
    
    function Start () { 
    
        var mymeshfilter= GetComponent(typeof(MeshFilter)) as MeshFilter;
        var objImporter = ObjImporter(); 
        mymeshfilter.mesh = objImporter.ImportFile("C:/pathtofile/mymesh.obj");
    }
    

    这是UnityJS,但该方法当然也适用于C#

  • 1

    作为解决方法,您还可以使用法线导出.obj文件 . 例如 . 在Blender中设置选项“Write Normals” . 虽然这也使我的测试文件大约1/3 .

相关问题