使用FastObjImporter在场景中加载和显示obj模型
在我的Unity项目中,我想使用互联网上的FastObjImporter类将obj放到场景中。我是否必须创建一个空的GameObject并将处理的obj分配给它?使用FastObjImporter在场景中加载和显示obj模型
尝试用一个空的游戏对象:
GameObject go = new GameObject("obj"); myMesh = FastObjImporter.Instance.ImportFile(objPath);
Instantiate(myMesh, Vector3.zero, Quaternion.identity);
go.AddComponent<MeshRenderer>();
go.GetComponent<MeshFilter>().mesh = myMesh;
早些时候,我想这种方式,但它也没有工作:
GameObject go; myMesh = FastObjImporter.Instance.ImportFile(objPath);
Instantiate(myMesh, Vector3.zero, Quaternion.identity);
go.GetComponent<MeshFilter>().mesh = myMesh;
有人能解释我做错了吗?
CODE:
using System; using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using System.IO;
/// <summary>
/// Sample
/// </summary>
public class DriveTest : MonoBehaviour
{
//public static readonly string REQUIRED_MIME = "image/jpeg";
//public string filePath;
public string objPath;
bool initInProgress = false;
GoogleDrive drive;
public string url;
List<GoogleDrive.File> remoteObjFiles;
public Mesh myMesh;
public GameObject go;
/* ---------------------------------------------------------------------------------------------------------------------------------- */
void Start()
{
objPath = Application.persistentDataPath + "/testObj.obj";
StartCoroutine(ImportObj());
go = new GameObject("obj");
}
/* ---------------------------------------------------------------------------------------------------------------------------------- */
void Update()
{
if (Input.GetKey(KeyCode.Escape))
Application.Quit();
}
/* ---------------------------------------------------------------------------------------------------------------------------------- */
IEnumerator ImportObj()
{
initInProgress = true;
drive = new GoogleDrive();
var driveInit = drive.Initialize();
while (driveInit.MoveNext())
yield return null;
initInProgress = false;
for (;;)
{
(SEARCHING AND SETTING DOWNLOAD FOLDER IN GDRIVE)
var download = drive.DownloadFile(remoteObjFiles[0]);
yield return StartCoroutine(download);
var data = GoogleDrive.GetResult<byte[]>(download);
if (File.Exists(objPath))
{
File.Delete(objPath);
File.WriteAllBytes(objPath, data);
}
else
File.WriteAllBytes(objPath, data);
Debug.Log("Obj: " + remoteObjFiles[0].ToString());
if (File.Exists(objPath))
{
Debug.Log("Loading OBJ from the device");
myMesh = FastObjImporter.Instance.ImportFile(objPath);
Debug.Log("Obj imported...");
Instantiate(myMesh, Vector3.zero, Quaternion.identity);
go.AddComponent<MeshRenderer>();
go.GetComponent<MeshFilter>().mesh = myMesh;
}
break;
}
}
问候
回答:
没有必要实例化网格。它是一个组件,我不确定你是否可以实例化它。只需将其分配给材料。
你的代码中的主要问题是你没有创建材质和着色器。您需要创建一个材质,然后创建一个“标准”着色器并将该着色器分配给该材质。
我注意到FastObjImporter
脚本是旧的,并决定尝试它来确保它正常运行。我遇到了一个索引异常错误,然后修复它。您可以获取固定版本here的副本。请参阅行#57为我所做的实际修复。
函数来创建MeshFilder
,材质和MeshRenderer
:
void attachMeshFilter(GameObject target, Mesh mesh) {
MeshFilter mF = target.AddComponent<MeshFilter>();
mF.mesh = mesh;
}
Material createMaterial()
{
Material mat = new Material(Shader.Find("Standard"));
return mat;
}
void attachMeshRenderer(GameObject target, Material mat)
{
MeshRenderer mR = target.AddComponent<MeshRenderer>();
mR.material = mat;
}
函数来创建新的游戏对象,加载模型和一切必要的组件连接到它,以显示它:
GameObject loadAndDisplayMesh(string path) {
//Create new GameObject to hold it
GameObject meshHolder = new GameObject("Loaded Mesh");
//Load Mesh
Mesh mesh = FastObjImporter.Instance.ImportFile(path);
//return null;
//Attach Mesh Filter
attachMeshFilter(meshHolder, mesh);
//Create Material
Material mat = createMaterial();
//Attach Mesh Renderer
attachMeshRenderer(meshHolder, mat);
return meshHolder;
}
用法:
void Start() {
string objPath = Application.persistentDataPath + "/testObj.obj";
GameObject obj = loadAndDisplayMesh(objPath);
//Position it in front od=f the camera. Your ZOffset may be different
Camera cam = Camera.main;
float zOffset = 40f;
obj.transform.position = cam.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, cam.nearClipPlane + zOffset));
}
编辑:
在某些罕见的情况下,团结找不到Android上的着色器在使用Shader.Find("Standard")
。发生这种情况时会出现错误。
解决此问题的方法是在编辑器中创建一个材质并为其分配“标准”着色器。它应该默认使用“标准”着色器。
。创建一个材料和名称是“StandardMat”。
。将该材质放在名为“Resources”的文件夹中。如果它不存在,就创建它。你必须正确拼写。同样,该文件夹必须命名为“资源”并放置在“资产”文件夹内。
。您可以使用Resources.Load("StandardMat") as Material
加载材料。
在上述createMaterial
功能,
变化
Material mat = new Material(Shader.Find("Standard"));
到
Material mat = Resources.Load("StandardMat") as Material;
以上是 使用FastObjImporter在场景中加载和显示obj模型 的全部内容, 来源链接: utcz.com/qa/261917.html