在运行时导入.obj网格

本文关键字:网格 obj 导入 运行时 | 更新日期: 2023-09-27 18:14:25

我想做的大约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告诉没有错误在那一边。我还尝试了另外两个文件,也失败了。

编辑我也试着把那行注释掉,结果很奇怪:模特在那里,但我的相机后面莫名其妙地出现了一些奇怪的形状……

在运行时导入.obj网格

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

此导入器在仅包含两个值的索引中存在问题。一个就可以了。三个就可以了。但是,当您的索引区域包含像f 5/1 6/2 2/4/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值只包含两个值而不是需要的一个或三个值的问题。

作为同行,你能告诉我你是如何导入为你工作的网格的吗?因为我仍然坚持的是如何正确设置它,以便它导入网格数据。wiki的描述太烂了。错误信息现在消失了,但仍然没有网格数据到达对象。我使用一个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#

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