在运行时导入.obj网格

时间:2014-07-24 03:40:18

标签: c# unity3d mesh .obj

我试图做大约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]);

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

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

修改 我也尝试过评论那条线,结果很奇怪:模型就在那里,但我的相机无缘无故地有一些奇怪的形状......

2 个答案:

答案 0 :(得分:1)

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

此导入程序存在仅包含两个值的索引的问题。一个很好。三个很好。但是当你的索引区域包含像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");

}

您似乎根本不使用网格过滤器。你究竟在做什么?你创建一个空,然后附加一个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 :(得分:0)

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