Maya教程 :用MEL导出3D模型
前面已经写过一个Hello EGL的练习程序,手工设计和推算3D坐标是非常累,非常没有效率的,实际上我们应该使用专业的三维建模工具来制作模型。
Maya是我最喜欢的三维制作软件,除了操作界面非常符合我的直觉外,它强大而开放的MEL及SDK也是非常重要的因素。前些日子偶遇一个在好莱坞混过三维制作的朋友说,最强悍而又符合程序员思维的工具是Houdini,不过还没学习过,目前Maya是我会用的最好的3D制作工具了。可惜曾经3D高端的代名词SGI把它卖给Autodesk了,这让我心里多少有些郁闷。
Maya内部对3D场景有一个相当优美的描述,由结点连接而成的网络,这个网络可以MEL脚本来访问和控制,当然更可以通过SDK来利用和增强。
由于OpenGL|ES 1.x不支持QUADE,所以在为这类应用转换模型之前,注意先将模型表面三角化:
在MEL中转换模型的要点如下:
- 获取当前选中的物体清单,对每个物体分别进行转换和导出
- string $objs[] = `ls -sl`
- for( $obj in $objs ) { ... }
- 读取一个物体的所有的面
- string $f2v[]=`polyInfo -faceToVertex`
- 注意:这条命令在PSE版本里是不支持的,如果你是在使用这个版本学习建模的话,可能需要找一个有正式版本的朋友帮你导出模型。
- 这条命令的结果包含很多个字符串,每个字符串描述一个面,其内容类似于"FACE 0: 88 64 85",如果是没有三角化的模型,还会多出一个数字来(默认使用四边形)。
- FACE id:后面的数字是形成该面的顶点的索引
- int $faceCount = `size $f2v`
- 对于每一个面的字符串进行分析,读取构成面的顶点索引
- for ( int $i = 0; $i < $faceCount; $i++ )
- string oneFace[]
- tokenize($f2v[$i], $oneFace)
- (int) $oneFace[2,3,4] 就得到了顶点索引 (a,b,c)
- string $f2v[]=`polyInfo -faceToVertex`
- 读取物体所有的顶点
- int vc[] = `polyEvaluate -vertex`
- [0]是vertexCount
- 对于每一个顶点,读取其坐标
- for ( int $i = 0; $i < $faceCount; $i++ )
- string $point = $obj.vtx[$i]
- float v[] = `$pointPosition -l $point`
- ([0], [1], [2])就是(x, y, z)
- 读取法向坐标
- 对于每一个面 (参考2.2)
- 对于面的每一个顶点
- string $v = $obj.vtxFace[$f2v[$i*3 + 0,1,2]][$i]
- $i 是面的索引
- $f2v[$i*3 + 0,1,2] 分别取出第$i个面的三个顶点索引
- $obj.vtxFace[vertex][face]是一个关联数组或者说伪数组
- 比较有意思的是我在Maya联机文档里并没有找到这个vtxFace的说明,在网上倒有些讨论,感兴趣的可以之为关键字google之。
- string $v = $obj.vtxFace[$f2v[$i*3 + 0,1,2]][$i]
- 选中该顶点
- select -r $v
- 计算其法向
- float n[] = `polyNormalPerVertex -q -xyz`
- 取得的n[0],[1],[2]就是该顶点法向的(x,y,z)
- 恢复最初的选中状态
- select -r $objs;
- 读取UV坐标
- 对于每一个面 (参考2.2)
- 对于面上的每一个顶点 (参考4.2)
- 选中该顶点
- 分析UV坐标
- string u[] = `polyListComponentConversion -fromVertexFace -toUV`
- 如果返回数组长度为0,则未指定UV坐标
- 否则可获取UV坐标
- float uv[] = `polyEditUV -q u[0]`
- [0],[1]就是(u,v)
- 将读取的数据写入文件
- 打开文件 int $fid = `fopen $fname "w"`
- 写入数据 fwrite $fid $data
- 可写入MEL能识别的各种数据类型
- string写入后尾部会跟一个0(BYTE)
- int写入成32位
- float写入成64位,对应C语言里的double
- vector将写入三个float
- 关闭文件 fclose $fid
有经验的程序员都知道合理的代码重用是提高效率的好办法,自己重头写一个对于掌握以上要点是有好处的,但直接找一个现成的脚本来用显然可以节省大量的时间,要知道,脚本程序的调试可是非常麻烦的。
网上可以找到一个简单易用的(http://homepage.sunrise.ch/mysunrise/dschluchter/blockout/mel-export.html),作者也把这个脚本发布到highend3d(http://www.highend3d.com/maya/downloads/mel_scripts/utility_external/export/Generic-Polygon-Exporter-4159.html)了。 使用相当简单,选好要导出的物体,从ScriptEditor里打开这个脚本,在最后写上一行:exportToOgl( "fileName" ); 然后执行即可。我已经写了一个小程序,可以DUMP导出后的文件内容:可执行文件 程序源码(如果你打算利用这些代码,注意有很多malloc没有free) 。
可以直接修改MEL以输出自己想要的格式,也可以修改程序适应导出格式,不过我觉得两者都太麻烦,还是再写一个转换程序将MEL输出格式转成自己认为使用较为文件格式比较爽。
Maya教程 :用MEL导出3D模型相关推荐
- AD20和立创EDA设计(5)立创EDA导出3D模型放入AD20使用
(1)本文主要介绍如何将从立创EDA导出的3D模型,并且对3D模型进行处理. (2)需提前观看:AD20和立创EDA设计(4)PCB设计: (3)本文需要使用到Fusion 360这一个建模软件. ( ...
- AD导出3D模型的各种方法——AD转SW(MCAD插件一键生成),也适用于Fusion360、Inventor等三维建模软件
〇.所有方法的链接 1.AD转SW(贴图形式) 2.AD转SW(MCAD插件一键生成),也适用于Fusion360.Inventor等三维建模软件 3.AD转Keyshot(待写) 4.AD转PPT( ...
- 立创EDA导出3D模型到KiCad软件中
在KiCad软件中有些器件没有3D模型,这时候可以直接从立创EDA导出3D模型,然后将3D模型添加到KiCad软件中. 首先打开立创EDA专业版的网页,网页地址:https://pro.lce ...
- 浩辰3D软件入门教程:如何比较3D模型?
在初始设计.验证.变更.发布.优化等整个产品生命周期内,设计方案会经历无数次的调整.而由此产生的多版本3D模型数据或二维CAD图纸,已经很难凭借肉眼.记忆.经验等人工辨别方式进行精确区分和全面分析. ...
- 立创EDA导出3d模型到Altimu Designer
立创EDA导出STEP 3d模型 学习链接:https://www.bilibili.com/video/BV1xh411b7eD?from=search&seid=8529272457053 ...
- AD导出3D模型的各种方法——AD转SW(贴图形式)
〇.所有方法的链接 1.AD转SW(贴图形式) 2.AD转SW(MCAD插件一键生成),也适用于Fusion360.Inventor等三维建模软件 3.AD转Keyshot(待写) 4.AD转PPT( ...
- Altium Designer 18 如何导出 3D模型的PDF
首先打开一个已经画好的项目,按快捷键3切换成3D视角,然后按住shift调整模型的角度,最终打印出来的角度就是你调整后的,下图就是我调整后的 接着便是按照步骤来,请看图 第二步,给导出的文件命名 第三 ...
- sketchup 图片转模型_su模型转换3d模型(如何将3D模型转化为sketchup)
求救求救~~~3dmax模型 导入su 模型的位置变了 非得... 第一步 全部放到一个图层然后打组 第二部 随便画个box体 第三部 选择建筑点击链接变换 第四步 点击拾取 选择box体 ...
- 3D模型在线查看利器【多种格式】
BimAnt 3DViewer网站可以 打开多种 3D 文件格式并在你的浏览器中可视化展示3D模型,支持 obj.3ds.stl.ply.gltf.glb.off. 3dm.fbx 等等. 1.支持的 ...
最新文章
- Linu 修改maven的setting保护文件
- Java精讲:生产者-消费者
- PHP实现带重试功能的curl连接示例
- oracle status
- ubuntu下安装mongodb
- 静态路由与动态路由概念及实例
- Java8新特性:Stream介绍和总结
- flume linux 命令,Linux环境Flume安装配置及使用
- 简析Visual C++中的活动数据对象
- 3d打印 开源_Hovalin:开源3D打印小提琴
- linux查看进程命令,linux查询指定进程命令
- NOIP2017 D2T1 奶酪
- 【排列组合、思维】Combinatorics Homework
- plc编程有哪些方法?
- wpsa3版面怎么变成a4、排版不变_worda3变a4排版打印 word如何将a3排版成a4
- linux沙箱隔离_linux沙箱技术
- Facebook高效工作Tips
- item_search_img - 拍立淘搜索淘宝商品(淘宝API)
- 爬取今日头条街拍美女图片
- module ‘win32com.gen_py.00020813-0000-0000-C000-000000000046x0x1x9‘ has no attribute ‘CLSIDToClassM