unity导出.obj模型文件

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

一、将地形导出为obj文件

在unity中新建js脚本ExportTerrain.js,且必须放在Assets文件夹下的Editor文件夹中。(js文件不要用vs编译,要用自带的mono编译器。)

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));}}   }

然后在菜单栏中会多出一项“Terrain”,选中场景中的地形,然后点击该菜单栏,就可以导出了,导出的地形文件为obj类型,将obj导入max中,选择“仅影响轴”即可改变坐标轴位置。

unity导出.obj模型文件相关推荐

  1. OBJ模型文件的结构、导入与渲染

    在[3DS文件结构的初步认识]中提及了3DS格式模型文件.固然3DS格式很常用,但OBJ格式的模型也是很常见的,于是咔嚓了一下心,熟悉了一下格式,并写了一个导入OBJ格式模型的类,顺便有此文.--Zw ...

  2. Simulink导出FMU模型文件方法

    一.安装FMIKIT 首先下载FMIKit-Simulink-master.zip文件,然后解压缩,在matlab中把添加该文件到路径 addpath("C:\FMIKit-Simulink ...

  3. 使用SW2018导出urdf模型文件

    使用SW2018导出urdf模型文件 1.下载solidworks_urdf_exporter插件 2.SW2018建立模型 3.使用solidworks_urdf_exporter插件导出urdf模 ...

  4. unity导出fbx模型_Unity批量合并Animation工具/根据已有的Animation文件批量生成带FBX动画工具...

    由于本人现有项目的项目素材大部分都需要继续沿用旧项目的模型与动画,但在接受旧模型动画的时候发现,模型动画由于外包已经丢失了3dmax的源文件,只剩下了一堆AnimationCilp(.anim)文件与 ...

  5. Unity 导出 obj, fbx

    本文转自本人简书,原文链接: https://www.jianshu.com/p/6b7e36f70be3 2020-05-05 项目需要用Unity导出3D物体为obj或fbx格式,从而导入其他软件 ...

  6. python 分离obj模型文件数据

    今天在分离.obj模型数据时,遇到一个问题,就是每行数据存在换行符,导致末尾添加的符号出现在下一行的行首.因此,需要先删除末尾的换行符,再添加符号. 知识点 replace(a,b) 将a替换为b,比 ...

  7. obj模型文件的格式

    obj模型的格式 带纹理的obj模型 mtl材质文件 推荐参考库文件 tiny_obj_loader assimp 带纹理的obj模型 一般带纹理的obj模型需要有以下三个文件,分别是.obj文件,. ...

  8. unity导出fbx模型_ARTBOOK艺书专栏:Fbx导出杂谈

    我经常说,看人三维基本功扎实不扎实,可以直接看他导出到引擎正确不正确,可以在非常短时间内看出对三维制作工具和引擎的基本理解. 以我的观察,国内从业者可以说在这方面百分之九十不合格, 首先是mesh轴向 ...

  9. 【H5 3D应用开发】Blender 制作导出Obj模型带纹理到three.js(二)

    工具: Bender2.7.8.0  +  three.js忘记了多少了 QQ:453738784 1.首先正常打开一个Blender  我们看到一个正方形 选择编辑模式后 选中你要添加纹理的面   ...

最新文章

  1. hbase developer API 1.22版
  2. python 中的[::-1]
  3. 代码合并工具_11个代码质量审核和管理工具,程序员必备!
  4. LeetCode 485. Max Consecutive Ones
  5. lambda函数以及对 items.sort(key = lambda y:y[1], reverse = True) 的理解。
  6. String、StringBuffer、StringBuilder之间的区别 简明介绍
  7. [Ubuntu] zsh
  8. LINUX下载编译libxml2
  9. Centos学习笔记 linux 常用命令:压缩解压命令
  10. 女孩子学前教育计算机,女孩子考什么专业比较好 适合女生的五大专业
  11. oracle 怎么重启数据库,oracle数据库重启
  12. linux命令查看系统日期,Linux系统查看当前时间的命令
  13. 如何选择物联网服务商
  14. 网站在多IE版本兼容性测试工具IETester的使用方法
  15. 你永远赢不了“凯利公式”
  16. 版本管理工具和as的一些配置
  17. 论文笔记 EMNLP 2020|Resource-Enhanced Neural Model for Event Argument Extraction
  18. vue项目在ie浏览器中不兼容问题的处理
  19. 2019年中国社交电商行业市场分析:社交电商巨头已浮出水面
  20. [ app.json 文件内容错误] app.json: window.navigationBarTextStyle 字段需为 black,white【已解决】

热门文章

  1. Dubbo Failed to check the status of the service.No provider available for the service from问题解决
  2. 腾讯和爱奇艺的竞品分析
  3. 读书笔记之费曼物理讲义第二册
  4. 给 iOS 开发者的 Sketch 入门教程
  5. 简析令人头大的定义 void (*(*f[])())()
  6. servet的生命周期是怎样的?
  7. EM算法从直观到数学理解
  8. log+android+bp,第二章:Android.bp语法
  9. [NC1105B]下雨天
  10. 编程开发中的起名规范