Obj格式解析以及在Unity3D下导入测试
2016-03-03 18:57
489 查看
目前基本实现了导入
四边面模型:
ObjFormatAnalyzerFactory
测试使用脚本:
然后挂载运行即可。
目前可能还有点小问题,因为没有实现材质的绑定,所以只能支持单一材质。
四边面模型:
using UnityEngine; using System.IO; using System.Linq; using System.Collections; using System.Collections.Generic; namespace Hont { public static class ObjFormatAnalyzerFactory { public static GameObject AnalyzeToGameObject(string objFilePath) { if (!File.Exists(objFilePath)) return null; var objFormatAnalyzer = new ObjFormatAnalyzer(); objFormatAnalyzer.Analyze(File.ReadAllText(objFilePath)); var go = new GameObject(); var meshRenderer = go.AddComponent<MeshRenderer>(); var meshFilter = go.AddComponent<MeshFilter>(); var mesh = new Mesh(); var sourceVertexArr = objFormatAnalyzer.VertexArr; var sourceUVArr = objFormatAnalyzer.VertexTextureArr; var faceArr = objFormatAnalyzer.FaceArr; var notQuadFaceArr = objFormatAnalyzer.FaceArr.Where(m => !m.IsQuad).ToArray(); var quadFaceArr = objFormatAnalyzer.FaceArr.Where(m => m.IsQuad).ToArray(); var vertexList = new List<Vector3>(); var uvList = new List<Vector2>(); var triangles = new int[notQuadFaceArr.Length * 3 + quadFaceArr.Length * 6]; for (int i = 0, j = 0; i < faceArr.Length; i++) { var currentFace = faceArr[i]; triangles[j] = j; triangles[j + 1] = j + 1; triangles[j + 2] = j + 2; var vec = sourceVertexArr[currentFace.Points[0].VertexIndex - 1]; vertexList.Add(new Vector3(vec.X, vec.Y, vec.Z)); var uv = sourceUVArr[currentFace.Points[0].TextureIndex - 1]; uvList.Add(new Vector2(uv.X, uv.Y)); vec = sourceVertexArr[currentFace.Points[1].VertexIndex - 1]; vertexList.Add(new Vector3(vec.X, vec.Y, vec.Z)); uv = sourceUVArr[currentFace.Points[1].TextureIndex - 1]; uvList.Add(new Vector2(uv.X, uv.Y)); vec = sourceVertexArr[currentFace.Points[2].VertexIndex - 1]; vertexList.Add(new Vector3(vec.X, vec.Y, vec.Z)); uv = sourceUVArr[currentFace.Points[2].TextureIndex - 1]; uvList.Add(new Vector2(uv.X, uv.Y)); if (currentFace.IsQuad) { triangles[j + 3] = j + 3; triangles[j + 4] = j + 4; triangles[j + 5] = j + 5; j += 3; vec = sourceVertexArr[currentFace.Points[0].VertexIndex - 1]; vertexList.Add(new Vector3(vec.X, vec.Y, vec.Z)); uv = sourceUVArr[currentFace.Points[0].TextureIndex - 1]; uvList.Add(new Vector2(uv.X, uv.Y)); vec = sourceVertexArr[currentFace.Points[2].VertexIndex - 1]; vertexList.Add(new Vector3(vec.X, vec.Y, vec.Z)); uv = sourceUVArr[currentFace.Points[2].TextureIndex - 1]; uvList.Add(new Vector2(uv.X, uv.Y)); vec = sourceVertexArr[currentFace.Points[3].VertexIndex - 1]; vertexList.Add(new Vector3(vec.X, vec.Y, vec.Z)); uv = sourceUVArr[currentFace.Points[3].TextureIndex - 1]; uvList.Add(new Vector2(uv.X, uv.Y)); } j += 3; } mesh.vertices = vertexList.ToArray(); mesh.uv = uvList.ToArray(); mesh.triangles = triangles; meshFilter.mesh = mesh; meshRenderer.material = new Material(Shader.Find("Standard")); return go; } } }
ObjFormatAnalyzerFactory
测试使用脚本:
public class ObjFormatAnalyzerTest : MonoBehaviour { void Start() { var go = ObjFormatAnalyzerFactory.AnalyzeToGameObject(@"D:\TestObj\centaur.obj"); WWW www = new WWW("file:/D:/TestObj/texture.jpg"); while (!www.isDone) { } go.GetComponent<MeshRenderer>().material.mainTexture = www.texture; } }
然后挂载运行即可。
目前可能还有点小问题,因为没有实现材质的绑定,所以只能支持单一材质。
相关文章推荐
- Unity学习笔记.01
- 01我为什么学Unity3d
- IRC配置for open source community
- unity camera随机点拍摄并能缓动跟随目标
- unity3d,android平台下,高德地图搜索附近
- [Unity热更新]更新lua脚本 (一)
- Unity读取只读和可写目录的方法
- unity3d transform基本属性获取和设置
- 用unity3D做一个简单的2D井字棋游戏
- Unity Shader编程(3)uv操作
- Unity3D-启动unity事件,切换平台监听
- Unity热更新之C#反射动态获取类属性及方法
- Unity热更新之C#反射动态获取类属性及方法
- Cg Programming/Unity/Transparency
- unity如何播放父级的父级物体所绑定的动画功能
- 【Unity开发】通过C#读取CSV表,创建并存储到LUA table中
- wiki/Cg Programming/Unity/Cutaways
- 增强现实贺卡项目展示
- [Unity3D]Unity3D游戏开发之鼠标滚轮实现放大缩小
- Unity-编写插件