我在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模型相关推荐

  1. 将Unity地形以Wavefront Obj格式导出

    原文链接 使用方法请参考原文链接.导出的Obj文件可以作为RecastNavigation的RecastDemo.exe程序的输入文件. 对于已经创建好的Unity Scene,使用原文链接给出的Ed ...

  2. unity导出.obj模型文件

    unity导出.obj模型文件 最近使用realworldterrain生成真实地形遇到一个问题,就是该地形的坐标轴没有在中心位置,这样在旋转缩放操作时候就有各种问题,效果不好,于是想到先导出该地形为 ...

  3. unity动态加载.obj文件相关

    .obj文件加载相关 QA: 要点 .obj文件结构 .mtl文件结构 材质匹配问题 动态加载obj文件 unity资源商城插件:Runtime Obj Importer QA: q: 如何动态加载o ...

  4. 【Three.js】解决使用Three.js导入obj模型不可见问题详细记录

    问题描述: 近期在做三维重建项目,需要把最终生成的obj文件导入到web端浏览,这里使用的是three.js(另一个是babylon.js),但博主发现导入meshlab生成的obj时无法显示模型,但 ...

  5. 【Unity自学01】3DMax模型导入Unity轴与尺寸的注意事项

    [Unity自学01]3DMax模型导入Unity轴与尺寸的注意事项 一.轴的设置 用3Dmax打开模型后,默认的坐标系为z轴朝上,与Unity中的坐标系(Y轴朝上)不一样,需做一下修改. 1.选中模 ...

  6. 将Unity场景以Wavefront Obj格式导出

    原文链接 使用方法请参考原文链接.导出的Obj文件可以作为RecastNavigation的RecastDemo.exe程序的输入文件. 脚本修改如下,支持Unity 5.3.5f1.仅修改了原文链接 ...

  7. 3dmaxobj导出选项_3dmax将模型导出成OBJ格式和贴图的一些注意点

    3dmax建模,如果将3D模型导出成其他软件也能够打开的格式,OBJ是一个非常好的格式选择.3dmax导出obj格式文件时缺少贴图,模型/贴图/材质/渲染都没有问题,导出来的obj为什么就没有贴图呢? ...

  8. unity地形之splatalpha研究 地形贴图导出更换与绘制

    unity中的地图贴图的绘制常常使用的是paint texture里面的 但是这个方式往往费时很多,却只能做出很少的效果,这里要介绍的就是通过外部绘制splatalpha 来替换,达到unity中地形 ...

  9. 3ds Max导出带贴图的obj模型

    先找一块大理石地板的贴图 接着在3ds Max中画一个最简单的立方体,要薄一点像地板 点击菜单栏中的渲染,选择精简材质编辑器 在材质编辑器面板里随便点一个球,然后按照下图所示的1和2步骤分别点击漫反射 ...

最新文章

  1. 集合、泛型、增强for
  2. R使用深度学习LSTM构建时间序列预测模型
  3. 区域链结构对于数据中心有什么影响?这个影响是好是坏呢!
  4. Python全栈工程师(文件操作、编码)
  5. Adsense加入黑名单的预防办法
  6. 基于supermap webgl三维楼层显隐控制思路
  7. python3 robotframework+pycharm框架搭建
  8. python表达式3and5_python3 中 and 和 or 运算规律
  9. keytool 错误 java.io.IOException: incorrect AVA format
  10. ASP.NET 路由实现页面静态化(附在线Demo和Source)
  11. 2016年总结:教师路的开启,爱情味的初尝 (上)
  12. Markdown文本编辑器公式编辑在线工具
  13. 为啥OpenStack厂商要参加双态运维大会?
  14. 抖音短视频去水印方法 2018短视频伪原创
  15. 影楼——Lr基础操作PS动作及批处理
  16. python 如何调试uc浏览器_UC浏览器开发者工具
  17. C# 调用中通快递查询物流轨迹接口
  18. apache commons fileupload 团队
  19. 步进电机和步进驱动器的介绍、接线、细分和控制方法
  20. 一直都在用的rgba与hex颜色系统你了解过吗?

热门文章

  1. 解决“System clock has been set back“、“FlexNet Licensing error:-88309“报错
  2. FHS Linux目录详解
  3. 【服务器数据集】中心服务器上存放(下载)的交通标志和交通信号(红绿灯)灯数据集 整理
  4. 国外常用代理IP对比【仅供参考】
  5. Firefox对函数getYear()返回不正确的原因和解决办法
  6. linux没有.brashrc文件,RHCE认证学习笔记-第四天
  7. 小程序分享功能实现结果回调以及页面传参
  8. 基于DDR3的串口传图帧缓存系统设计实现
  9. matlab解决序贯高斯模拟(附有例题)
  10. php中 复合主键的作用,php – Laravel – 使用复合主键加入表