我试图做大约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时它告诉我没有错误。 我还尝试了另外两个也失败的文件。
修改 我也尝试过评论那条线,结果很奇怪:模型就在那里,但我的相机无缘无故地有一些奇怪的形状......
答案 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。