2014-07-24 9 views
0

내가 약 2 일 동안 수행을 시도하고이 함께 런타임에 메쉬를 가져 오는 중입니다 나는 3 개 수입, 내가 지불해야 하나, 하나를 발견 합계에서 http://wiki.unity3d.com/index.php?title=ObjImporter런타임에 .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) 

를 가리키는 :

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

슬프게도, 나는이 오류를 얻을 :

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

을 그리고 나는 완전히 아무 생각 왜이 없습니다

는 내가 그것을 가져 그 일을하고 있습니다 ... 나는 그 스크립트를 작성하지 않았기 때문에 그것을 고치는 법을 모른다. 그래서 의도 한대로 작동하지 않는 이유에 대한 도움을 요청한다.

추가 정보 : 내가 스크립트에서 "file.b"로 이름을 변경할 수 있습니다 나는로드하려고 파일은 찾을 수 있습니다 그리고 내가 .OBJ 넣으면하면서,로드 할 수없는 나에게 말한다 그쪽에 오류가 없다고 알려줍니다. 또한 실패한 다른 두 개의 파일을 시도했습니다.

편집 나는 또한 그 선에서 의견을 시도하고, 이상한 결과가 있었다 : 모델이 있었다 그러나 나는 아무 이유없이 내 카메라 다음과 같은 몇 가지 이상한 모양을했다 ... 나는이를 얻으려고

+0

, 단지 importfile 방법으로 그렇게 : 이 '메시는 = 새로운 메쉬를() 메쉬;' 'mesh.vertices = newVerts; '' mesh.uv = newUVs,'' mesh.normals = newNormals,'' mesh.triangles = newMesh.triangles 상기 mesh' ''mesh.RecalculateNormals에서 '// 자동 계산 정점 법선 (); \t는 // 추가하며 기적적으로 메쉬에 번개 문제를 해결' \t \t 'mesh.RecalculateBounds();!' 'mesh.Optimize();' '반환 메쉬, 이것은 완벽하게 일' – Po0ka

답변

0

수입업자. 30 분 전에이 문제에 대한 도움을 받았으므로 공유하고 있다고 생각했습니다.

이 가져 오기 도구에는 두 가지 값만 포함 된 색인에 문제가 있습니다. 하나는 괜찮아요. 셋은 괜찮아요. 그러나 색인 영역에 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# 스크립트를 첨부 하시겠습니까? 정확한 스크립트는 무엇입니까? 셋업은 어때? 스크립트는 어디에 첨부 되었습니까?

EDIT, nevermind, 솔루션을 찾았습니다.

빈을 만들고 메쉬 필터를 추가하고 메쉬 렌더러를 추가 한 다음 여기에이 스크립트를 추가하면 데이터가 가져옵니다.위대한 :)

#pragma strict 

function Start() { 

    var mymeshfilter= GetComponent(typeof(MeshFilter)) as MeshFilter; 
    var objImporter = ObjImporter(); 
    mymeshfilter.mesh = objImporter.ImportFile("C:/pathtofile/mymesh.obj"); 
} 

이 UnityJS하지만 방법은 물론 또한 해결 방법 당신은 또한 법선과 .OBJ 파일을 내보낼 수 있습니다으로 C#

+0

을! 고마워! :디 – Po0ka

0

을 위해 일해야한다. 예 : Blender에서 "Write Normals"옵션을 설정하십시오. 그것도 내 테스트 파일을 약 1/3 더 크게 만들지 만. 가져온 메쉬의 번개에 관한 문제가 있다면 바로이 읽는 미래의 사람들을위한