Unity地形导出为.obj模型
我在Uniyt 3D中创建的真实地形想保存为模型以备以后使用,经过在网上艰辛的搜索(呵呵。。。),终于找到一个方法,经过实验验证,绝对真实可靠!有图有真相!
先上代码(O(∩_∩)O哈哈~)。
源代码来自于这儿:http://blog.sina.com.cn/s/blog_7812d64701010f7h.html,感谢他的分享!
下面为ExportTerrain.js脚本:
import System.IO;import System.Text;enum SaveFormat {Triangles, Quads}enum SaveResolution {Full, Half, Quarter, Eighth, Sixteenth}class ExportTerrain extends EditorWindow {var saveFormat = SaveFormat.Triangles;var saveResolution = SaveResolution.Half;static var terrain : TerrainData;static var terrainPos : Vector3;var tCount : int;var counter : int;var totalCount : int;@MenuItem ("Terrain/Export To Obj...")static function Init () {terrain = null;var terrainObject : Terrain = Selection.activeObject as Terrain;if (!terrainObject) {terrainObject = Terrain.activeTerrain;}if (terrainObject) {terrain = terrainObject.terrainData;terrainPos = terrainObject.transform.position;}EditorWindow.GetWindow(ExportTerrain).Show();}function OnGUI () {if (!terrain) {GUILayout.Label("No terrain found");if (GUILayout.Button("Cancel")) {EditorWindow.GetWindow(ExportTerrain).Close();}return;}saveFormat = EditorGUILayout.EnumPopup("Export Format", saveFormat);saveResolution = EditorGUILayout.EnumPopup("Resolution", saveResolution);if (GUILayout.Button("Export")) {Export();}}function Export () {var fileName = EditorUtility.SaveFilePanel("Export .obj file", "", "Terrain", "obj");var w = terrain.heightmapWidth;var h = terrain.heightmapHeight;var meshScale = terrain.size;var tRes = Mathf.Pow(2, parseInt(saveResolution));meshScale = Vector3(meshScale.x/(w-1)*tRes, meshScale.y, meshScale.z/(h-1)*tRes);var uvScale = Vector2(1.0/(w-1), 1.0/(h-1));var tData = terrain.GetHeights(0, 0, w, h);w = (w-1) / tRes + 1;h = (h-1) / tRes + 1;var tVertices = new Vector3[w * h];var tUV = new Vector2[w * h];if (saveFormat == SaveFormat.Triangles) {var tPolys = new int[(w-1) * (h-1) * 6];}else {tPolys = new int[(w-1) * (h-1) * 4];}// Build vertices and UVsfor (y = 0; y < h; y++) {for (x = 0; x < w; x++) {tVertices[y*w + x] = Vector3.Scale(meshScale, Vector3(x, tData[x*tRes,y*tRes], y)) + terrainPos;tUV[y*w + x] = Vector2.Scale(Vector2(x*tRes, y*tRes), uvScale);}}var index = 0;if (saveFormat == SaveFormat.Triangles) {// Build triangle indices: 3 indices into vertex array for each trianglefor (y = 0; y < h-1; y++) {for (x = 0; x < w-1; x++) {// For each grid cell output two trianglestPolys[index++] = (y * w) + x;tPolys[index++] = ((y+1) * w) + x;tPolys[index++] = (y * w) + x + 1;tPolys[index++] = ((y+1) * w) + x;tPolys[index++] = ((y+1) * w) + x + 1;tPolys[index++] = (y * w) + x + 1;}}}else {// Build quad indices: 4 indices into vertex array for each quadfor (y = 0; y < h-1; y++) {for (x = 0; x < w-1; x++) {// For each grid cell output one quadtPolys[index++] = (y * w) + x;tPolys[index++] = ((y+1) * w) + x;tPolys[index++] = ((y+1) * w) + x + 1;tPolys[index++] = (y * w) + x + 1;}} }// Export to .objtry {var sw = new StreamWriter(fileName);sw.WriteLine("# Unity terrain OBJ File");// Write verticesSystem.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");counter = tCount = 0;totalCount = (tVertices.Length*2 + (saveFormat == SaveFormat.Triangles? tPolys.Length/3 : tPolys.Length/4)) / 1000;for (i = 0; i < tVertices.Length; i++) {UpdateProgress();var sb = StringBuilder("v ", 20);// StringBuilder stuff is done this way because it's faster than using the "{0} {1} {2}"etc. format// Which is important when you're exporting huge terrains.sb.Append(tVertices[i].x.ToString()).Append(" ").Append(tVertices[i].y.ToString()).Append(" ").Append(tVertices[i].z.ToString());sw.WriteLine(sb);}// Write UVsfor (i = 0; i < tUV.Length; i++) {UpdateProgress();sb = StringBuilder("vt ", 22);sb.Append(tUV[i].x.ToString()).Append(" ").Append(tUV[i].y.ToString());sw.WriteLine(sb);}if (saveFormat == SaveFormat.Triangles) {// Write trianglesfor (i = 0; i < tPolys.Length; i += 3) {UpdateProgress();sb = StringBuilder("f ", 43);sb.Append(tPolys[i]+1).Append("/").Append(tPolys[i]+1).Append(" ").Append(tPolys[i+1]+1).Append("/").Append(tPolys[i+1]+1).Append(" ").Append(tPolys[i+2]+1).Append("/").Append(tPolys[i+2]+1);sw.WriteLine(sb);}}else {// Write quadsfor (i = 0; i < tPolys.Length; i += 4) {UpdateProgress();sb = StringBuilder("f ", 57);sb.Append(tPolys[i]+1).Append("/").Append(tPolys[i]+1).Append(" ").Append(tPolys[i+1]+1).Append("/").Append(tPolys[i+1]+1).Append(" ").Append(tPolys[i+2]+1).Append("/").Append(tPolys[i+2]+1).Append(" ").Append(tPolys[i+3]+1).Append("/").Append(tPolys[i+3]+1);sw.WriteLine(sb);} }}catch (err) {Debug.Log("Error saving file: " + err.Message);}sw.Close();terrain = null;EditorUtility.ClearProgressBar();EditorWindow.GetWindow(ExportTerrain).Close();}function UpdateProgress () {if (counter++ == 1000) {counter = 0;EditorUtility.DisplayProgressBar("Saving...", "", Mathf.InverseLerp(0, totalCount, ++tCount));}} }
将上面的脚本放在Unity项的目录资源文件夹的Editor里。
刷新一下菜单栏,会发现多了一个Terrain的菜单。
先在场景中选中地形对象,如果没选,他将用于当前场景中可用的地形。
然后从Terrain菜单下选择Export To Obj...
接下来会弹出一个框,在这里你可以选择要导出四边形网络结构还是三角形网络结构,还可以选择要导出的地形的分辨率,有高中低...。最后点击Export,选择要保存的位置和文件名,.obj文件将被导出。
注意:如果选择大面积的Full地形导出,最终.obj文件将非常大,而且也要导出很久。
下边是我实践过的例子:
Uniyt 4.6.2中创建的真实地形(钓鱼岛哈):
导出.obj格式的模型(模型和贴图):
在Maya 2013中打开如下:
哎呀,怎么是这个样子?我只想要钓鱼岛,该怎么办?只要在Maya里简单处理一下就好了。
选中模型,右键选择“面”:
框选中模型整体,然后切换到侧视图,按着Shift键,用鼠标框选突出的部分。(注意:要稍微比水平面高一点。)
Delete删除,大功告成!
好啦,给他加上贴图,导出为FBX文件,再放回Unity看看(钓鱼岛和达山岛)。
PS:.obj模型在maya中打开是没有贴图的,需要重新为其附贴图。
Unity地形导出为.obj模型相关推荐
- 将Unity地形以Wavefront Obj格式导出
原文链接 使用方法请参考原文链接.导出的Obj文件可以作为RecastNavigation的RecastDemo.exe程序的输入文件. 对于已经创建好的Unity Scene,使用原文链接给出的Ed ...
- unity导出.obj模型文件
unity导出.obj模型文件 最近使用realworldterrain生成真实地形遇到一个问题,就是该地形的坐标轴没有在中心位置,这样在旋转缩放操作时候就有各种问题,效果不好,于是想到先导出该地形为 ...
- unity动态加载.obj文件相关
.obj文件加载相关 QA: 要点 .obj文件结构 .mtl文件结构 材质匹配问题 动态加载obj文件 unity资源商城插件:Runtime Obj Importer QA: q: 如何动态加载o ...
- 【Three.js】解决使用Three.js导入obj模型不可见问题详细记录
问题描述: 近期在做三维重建项目,需要把最终生成的obj文件导入到web端浏览,这里使用的是three.js(另一个是babylon.js),但博主发现导入meshlab生成的obj时无法显示模型,但 ...
- 【Unity自学01】3DMax模型导入Unity轴与尺寸的注意事项
[Unity自学01]3DMax模型导入Unity轴与尺寸的注意事项 一.轴的设置 用3Dmax打开模型后,默认的坐标系为z轴朝上,与Unity中的坐标系(Y轴朝上)不一样,需做一下修改. 1.选中模 ...
- 将Unity场景以Wavefront Obj格式导出
原文链接 使用方法请参考原文链接.导出的Obj文件可以作为RecastNavigation的RecastDemo.exe程序的输入文件. 脚本修改如下,支持Unity 5.3.5f1.仅修改了原文链接 ...
- 3dmaxobj导出选项_3dmax将模型导出成OBJ格式和贴图的一些注意点
3dmax建模,如果将3D模型导出成其他软件也能够打开的格式,OBJ是一个非常好的格式选择.3dmax导出obj格式文件时缺少贴图,模型/贴图/材质/渲染都没有问题,导出来的obj为什么就没有贴图呢? ...
- unity地形之splatalpha研究 地形贴图导出更换与绘制
unity中的地图贴图的绘制常常使用的是paint texture里面的 但是这个方式往往费时很多,却只能做出很少的效果,这里要介绍的就是通过外部绘制splatalpha 来替换,达到unity中地形 ...
- 3ds Max导出带贴图的obj模型
先找一块大理石地板的贴图 接着在3ds Max中画一个最简单的立方体,要薄一点像地板 点击菜单栏中的渲染,选择精简材质编辑器 在材质编辑器面板里随便点一个球,然后按照下图所示的1和2步骤分别点击漫反射 ...
最新文章
- 集合、泛型、增强for
- R使用深度学习LSTM构建时间序列预测模型
- 区域链结构对于数据中心有什么影响?这个影响是好是坏呢!
- Python全栈工程师(文件操作、编码)
- Adsense加入黑名单的预防办法
- 基于supermap webgl三维楼层显隐控制思路
- python3 robotframework+pycharm框架搭建
- python表达式3and5_python3 中 and 和 or 运算规律
- keytool 错误 java.io.IOException: incorrect AVA format
- ASP.NET 路由实现页面静态化(附在线Demo和Source)
- 2016年总结:教师路的开启,爱情味的初尝 (上)
- Markdown文本编辑器公式编辑在线工具
- 为啥OpenStack厂商要参加双态运维大会?
- 抖音短视频去水印方法 2018短视频伪原创
- 影楼——Lr基础操作PS动作及批处理
- python 如何调试uc浏览器_UC浏览器开发者工具
- C# 调用中通快递查询物流轨迹接口
- apache commons fileupload 团队
- 步进电机和步进驱动器的介绍、接线、细分和控制方法
- 一直都在用的rgba与hex颜色系统你了解过吗?
热门文章
- 解决“System clock has been set back“、“FlexNet Licensing error:-88309“报错
- FHS Linux目录详解
- 【服务器数据集】中心服务器上存放(下载)的交通标志和交通信号(红绿灯)灯数据集 整理
- 国外常用代理IP对比【仅供参考】
- Firefox对函数getYear()返回不正确的原因和解决办法
- linux没有.brashrc文件,RHCE认证学习笔记-第四天
- 小程序分享功能实现结果回调以及页面传参
- 基于DDR3的串口传图帧缓存系统设计实现
- matlab解决序贯高斯模拟(附有例题)
- php中 复合主键的作用,php – Laravel – 使用复合主键加入表