前面已经写过一个Hello EGL的练习程序,手工设计和推算3D坐标是非常累,非常没有效率的,实际上我们应该使用专业的三维建模工具来制作模型。

Maya是我最喜欢的三维制作软件,除了操作界面非常符合我的直觉外,它强大而开放的MEL及SDK也是非常重要的因素。前些日子偶遇一个在好莱坞混过三维制作的朋友说,最强悍而又符合程序员思维的工具是Houdini,不过还没学习过,目前Maya是我会用的最好的3D制作工具了。可惜曾经3D高端的代名词SGI把它卖给Autodesk了,这让我心里多少有些郁闷。

Maya内部对3D场景有一个相当优美的描述,由结点连接而成的网络,这个网络可以MEL脚本来访问和控制,当然更可以通过SDK来利用和增强。

由于OpenGL|ES 1.x不支持QUADE,所以在为这类应用转换模型之前,注意先将模型表面三角化:

在MEL中转换模型的要点如下:

  1. 获取当前选中的物体清单,对每个物体分别进行转换和导出

    1. string $objs[] = `ls -sl`
    2. for( $obj in $objs ) { ... }
  2. 读取一个物体的所有的面
    1. string $f2v[]=`polyInfo -faceToVertex`

      1. 注意:这条命令在PSE版本里是不支持的,如果你是在使用这个版本学习建模的话,可能需要找一个有正式版本的朋友帮你导出模型。
      2. 这条命令的结果包含很多个字符串,每个字符串描述一个面,其内容类似于"FACE 0: 88 64 85",如果是没有三角化的模型,还会多出一个数字来(默认使用四边形)。
      3. FACE id:后面的数字是形成该面的顶点的索引
    2. int $faceCount = `size $f2v`
    3. 对于每一个面的字符串进行分析,读取构成面的顶点索引
      1. for ( int $i = 0; $i < $faceCount; $i++ )
      2. string oneFace[]
      3. tokenize($f2v[$i], $oneFace)
      4. (int) $oneFace[2,3,4] 就得到了顶点索引 (a,b,c)
  3. 读取物体所有的顶点
    1. int vc[] = `polyEvaluate -vertex`
    2. [0]是vertexCount
    3. 对于每一个顶点,读取其坐标
      1. for ( int $i = 0; $i < $faceCount; $i++ )
      2. string $point = $obj.vtx[$i]
      3. float v[] = `$pointPosition -l $point`
        1. ([0], [1], [2])就是(x, y, z)
  4. 读取法向坐标
    1. 对于每一个面 (参考2.2)
    2. 对于面的每一个顶点
      1. string $v = $obj.vtxFace[$f2v[$i*3 + 0,1,2]][$i]

        1. $i 是面的索引
        2. $f2v[$i*3 + 0,1,2] 分别取出第$i个面的三个顶点索引
        3. $obj.vtxFace[vertex][face]是一个关联数组或者说伪数组
        4. 比较有意思的是我在Maya联机文档里并没有找到这个vtxFace的说明,在网上倒有些讨论,感兴趣的可以之为关键字google之。
    3. 选中该顶点
      1. select -r $v
    4. 计算其法向
      1. float n[] = `polyNormalPerVertex -q -xyz`
      2. 取得的n[0],[1],[2]就是该顶点法向的(x,y,z)
  5. 恢复最初的选中状态
    1. select -r $objs;
  6. 读取UV坐标
    1. 对于每一个面 (参考2.2)
    2. 对于面上的每一个顶点 (参考4.2)
    3. 选中该顶点
    4. 分析UV坐标
      1. string u[] = `polyListComponentConversion -fromVertexFace -toUV`
      2. 如果返回数组长度为0,则未指定UV坐标
      3. 否则可获取UV坐标
        1. float uv[] = `polyEditUV -q u[0]`
        2. [0],[1]就是(u,v)
  7. 将读取的数据写入文件
    1. 打开文件 int $fid = `fopen $fname "w"`
    2. 写入数据 fwrite $fid $data
      1. 可写入MEL能识别的各种数据类型
      2. string写入后尾部会跟一个0(BYTE)
      3. int写入成32位
      4. float写入成64位,对应C语言里的double
      5. vector将写入三个float
    3. 关闭文件 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模型相关推荐

  1. AD20和立创EDA设计(5)立创EDA导出3D模型放入AD20使用

    (1)本文主要介绍如何将从立创EDA导出的3D模型,并且对3D模型进行处理. (2)需提前观看:AD20和立创EDA设计(4)PCB设计: (3)本文需要使用到Fusion 360这一个建模软件. ( ...

  2. AD导出3D模型的各种方法——AD转SW(MCAD插件一键生成),也适用于Fusion360、Inventor等三维建模软件

    〇.所有方法的链接 1.AD转SW(贴图形式) 2.AD转SW(MCAD插件一键生成),也适用于Fusion360.Inventor等三维建模软件 3.AD转Keyshot(待写) 4.AD转PPT( ...

  3. 立创EDA导出3D模型到KiCad软件中

      在KiCad软件中有些器件没有3D模型,这时候可以直接从立创EDA导出3D模型,然后将3D模型添加到KiCad软件中.   首先打开立创EDA专业版的网页,网页地址:https://pro.lce ...

  4. 浩辰3D软件入门教程:如何比较3D模型?

    在初始设计.验证.变更.发布.优化等整个产品生命周期内,设计方案会经历无数次的调整.而由此产生的多版本3D模型数据或二维CAD图纸,已经很难凭借肉眼.记忆.经验等人工辨别方式进行精确区分和全面分析. ...

  5. 立创EDA导出3d模型到Altimu Designer

    立创EDA导出STEP 3d模型 学习链接:https://www.bilibili.com/video/BV1xh411b7eD?from=search&seid=8529272457053 ...

  6. AD导出3D模型的各种方法——AD转SW(贴图形式)

    〇.所有方法的链接 1.AD转SW(贴图形式) 2.AD转SW(MCAD插件一键生成),也适用于Fusion360.Inventor等三维建模软件 3.AD转Keyshot(待写) 4.AD转PPT( ...

  7. Altium Designer 18 如何导出 3D模型的PDF

    首先打开一个已经画好的项目,按快捷键3切换成3D视角,然后按住shift调整模型的角度,最终打印出来的角度就是你调整后的,下图就是我调整后的 接着便是按照步骤来,请看图 第二步,给导出的文件命名 第三 ...

  8. sketchup 图片转模型_su模型转换3d模型(如何将3D模型转化为sketchup)

    求救求救~~~3dmax模型 导入su 模型的位置变了 非得... 第一步  全部放到一个图层然后打组 第二部   随便画个box体 第三部  选择建筑点击链接变换 第四步   点击拾取 选择box体 ...

  9. 3D模型在线查看利器【多种格式】

    BimAnt 3DViewer网站可以 打开多种 3D 文件格式并在你的浏览器中可视化展示3D模型,支持 obj.3ds.stl.ply.gltf.glb.off. 3dm.fbx 等等. 1.支持的 ...

最新文章

  1. Linu 修改maven的setting保护文件
  2. Java精讲:生产者-消费者
  3. PHP实现带重试功能的curl连接示例
  4. oracle status
  5. ubuntu下安装mongodb
  6. 静态路由与动态路由概念及实例
  7. Java8新特性:Stream介绍和总结
  8. flume linux 命令,Linux环境Flume安装配置及使用
  9. 简析Visual C++中的活动数据对象
  10. 3d打印 开源_Hovalin:开源3D打印小提琴
  11. linux查看进程命令,linux查询指定进程命令
  12. NOIP2017 D2T1 奶酪
  13. 【排列组合、思维】Combinatorics Homework
  14. plc编程有哪些方法?
  15. wpsa3版面怎么变成a4、排版不变_worda3变a4排版打印 word如何将a3排版成a4
  16. linux沙箱隔离_linux沙箱技术
  17. Facebook高效工作Tips
  18. item_search_img - 拍立淘搜索淘宝商品(淘宝API)
  19. 爬取今日头条街拍美女图片
  20. module ‘win32com.gen_py.00020813-0000-0000-C000-000000000046x0x1x9‘ has no attribute ‘CLSIDToClassM

热门文章

  1. Kaldi学习笔记(三)——运行thchs30(清华大学中文语料库)
  2. BUUCTF[GXYCTF2019]BabySQli
  3. 图像边缘锐化,其实很简单-提取边界+处理边界
  4. 原创 | 微信小游戏“跳一跳”改分攻略!
  5. Java Formatter用法
  6. springcloud springboot 异常拦截器 项目完善03
  7. 开源持续交付黑客松,5000大奖等你来拿
  8. java web电子相册_电子相册Javaweb项目源码及数据库
  9. 世界上最神奇的24堂课
  10. 静态旅游网站(PC端)