【问题标题】:Importing a .obj mesh in runtime在运行时导入 .obj 网格
【发布时间】:2014-09-15 11:30:23
【问题描述】:

我大约 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 个同样失败的文件。

编辑 我还尝试注释掉那条线,结果很奇怪:模型在那里,但我的相机无缘无故地出现了一些奇怪的形状......

【问题讨论】:

  • 仅供以后阅读本文的人阅读,如果您对导入网格上的闪电有任何问题,只需在 importfile 方法中执行此操作即可:Mesh mesh = new Mesh();mesh.vertices = newVerts;mesh.uv = newUVs;mesh.normals = newNormals;mesh.triangles = newMesh.triangles; // Auto-calculate vertex normals from the meshmesh.RecalculateNormals(); //added and it miraculously fixed the lightning issues on the mesh!mesh.RecalculateBounds();mesh.Optimize();return mesh;

标签: c# unity3d mesh .obj


【解决方案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 值仅包含两个值而不是所需的一或三个值的问题。

作为对应方,您能告诉我您是如何导入适用于您的网格的吗?因为我仍然坚持的是如何正确设置它以便导入网格数据。 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#

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-25
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多