Unity3D动态生成模型_第1页
Unity3D动态生成模型_第2页
Unity3D动态生成模型_第3页
Unity3D动态生成模型_第4页
Unity3D动态生成模型_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、unity3d 运行时 动态生成模型一2014-01-21 11:19:41| 分类:技术相关|标签:unity3d 动态生成模型 mesh shader colider | 举报|字 号订阅一股,unity3d 开发都是使用第三方工具提前做好,型,如 3dmax , sketchUP , Maya等。这一点对游戏行业基本已经够用了,对游戏行 业来说,unity3d后续版本不断强化的动画系统也是一个无需求的品。因为, 对游戏发来说,unity3d就如他的名字一股,他,是一个整合工具,将 3d 型与代,粘合到一起,达到预期的效果。所以,对游戏,个人觉得,其主 争力在画面特效,即在美工,而非cod

2、er。当然并不是说coder不重。不幸的是本人为一名coder,更为不幸的是,本人从事的并非游戏业, 而是虚拟现实。对该行业,很多人的认识还停留在厂区漫游等比较傻瓜化的 动,个人觉得这种傻瓜式的漫游,适用的行业,约也只有楼盘展示以及一 些港口的面子工程了。对工业控制系统的信息化需求来说,其没有任何实用 价值。本文实现的功能是动态生成,型。为这个系列的第一,。其目标在, 根据用户的输入生成出指定的型。本文实现的是简单的隧道,型,如果对 复杂的型,需精细的数学知识扩充,但对unity3d的使用则无两样,均通过指定的一些方法实现。这个需求,在非静态工厂的监控很为强烈,因为场 景经常变化,不可能让工程

3、人员或研发人员在现场一直维护。动态生成,型,则我们需知道,型都需哪些信息才能展现出来。此 处,我们需用到的是unity3d的Mesh (网格)、Material (材质,其中包含 贴图)、Collider (碰撞体,游戏效果,则就被当空气穿越了)。,型,先需骨,即哪些顶点。撑起一个骨,另外还需一些线 把这些点连接起来,因为并不是所有的点都两两联,那样就不是,型,而是 打结的网了。1、计算顶点,方法考数学,因为不是本文重点,跳过。暂定顶点的寄 存器为 Vector3 vertexArray 。2、计算三角面。此处三角面的计算,需注意的是右手螺旋定律,即法 线方向是根据顶点的右手螺旋,大拇指方向。

4、搞活楚这一点,就运用你的数学 知识计算三角面阵列吧。此处三角面阵列比较坑爹的是,我也不懂为什么unity3d的API接收的数竟然是int,而不是我预期的 Vector3,不过还好, 其实你把每三个int组成一个Vector3 ,就是对应三角面的三个顶点,再次强调, 注意顶点顺序,右手螺旋。暂定三角面的寄存器为int triangleArray;3、 展UV,这个,对熟悉 3dmax、maya、sketchup中一款的人就应该很熟悉UV的作用,他其实就是扒皮,把,型表层扒来,定上 UV坐标, 然后贴图就按照这个UV坐标往上面对齐。展UV的算法,实在太多了,网上 可以找一坨。本文的型为隧道,不是复

5、杂,型,就直接快速展 UV,对准某 个面直接压去。如果不会的话,看看 3dmax的快速展UV就知道了。UV是 二维坐标,这个就不用我解释了吧,如果这个不活楚的话,建议重学3dmax。暂定UV的寄存器为 Vector2 UVArray。4、进行赋值到Mesh ,并重新计算法线。MeshFilter meshF = cannelObject.AddComponent<MeshFilter>();Mesh mesh = meshF.mesh;mesh.vertices = vertexArray;mesh.triangles = triangleArray;mesh.uv = UVArr

6、ay;mesh.RecalculateNormals();5、现在物体已经存在了骨骼。面就是给物体添加染器,让其在场景中染出来。第一步先寻找一个的Shader,当然你也可以己定义一个。6、定好Shader之后,再找一张贴图。贴图是 ps 己做还是网上找一 个,这个随便你了。MeshRenderer meshR = cannelObject.AddComponent<MeshRenderer>();Material material = new Material(Shader.Find("Diffuse");material.mainTexture = p_tex

7、ture;meshR.materials = new Material material ;7、现在已经可以看到这个物体了,在场景里面。面就为其添加碰撞器, 让其符合游戏特性。MeshCollider collider = cannelObject.AddComponent<MeshCollider>();8、现在一切都已经成功了,面就是把这个创建的游戏物体放到指定的 位置,并以其指定的空间角存在。cannelObject.transform.position = p_startPostion;cannelObject.transform.Rotate(p_eulerAngel);

8、到了这里,动态生成型任务收工。一会介绍,型之间的布尔运 算。毕竟对隧道这个东西,我们是一截一截的生成,后续还将其布尔运算, 以符合实际情况。最后贴上一张我的效果图。Unity3D 运行时 动态生成模型 < 二> 选择模型 分类i标签:uy3|y i举报号订阅接上一篇文,动态生成了简单的型。一步就是需对型进行编辑, 当其冲的是选择,型。即当鼠标移动到物体上时,物体有一定的特效,本文选 择的是给物体增加一个薄边。当对物体单来选择或撤销选择时,也需有一 定的特效,即当物体被选择之后,物体需一个特效表示己被选择了。本文 选择的是给物体一个,边。先来看效果此处的实现参照 。此处对实现的细节不

9、再详细介绍,直接考此文即可。本文主对原样例代,进行了整改,优化。以达到无入侵式显示轮廓。 即为达到该效果,仅需把需显示轮廓的物体调用全,函数即可实现,而无需 按照上文中那,,需提前绑定一些脚本以及创建轮廓摄像机(本质上这些事 情依然存在,不过由代码自动完成)。示例代码:void OnMouseEnter()OutLineManager.Initialize();/初始化轮廓管理,OutLineManager.ShowThinOutLine(gameObject); /显示薄边void OnMouseExit()OutLineManager.HideThinOutLine(gameObject)

10、; /不显示薄边void OnMouseDown()Selected = !Selected;if (Selected)(OutLineManager.ShowThickOutLine(gameObject); /显示,边else(OutLineManager.HideThickOutLine(gameObject); /不显示,边即哪里需要,直接调用 OutLineManager 的相关方法即可。相对而, 更好在项目中部署使用。项目载地址最近缺分,不好意思各位了,望谅解Unity3D 运行时动态生成模型 < 三> 编辑模型 分类i 标签:uy3jmi|j|y i 举报年后开工第二

11、天,整理了去年年末写的功能。去年,先写了型的生成 以及选择,但对 VR来说,这个还够,因为我们绕不开的一个问题,我们需 在线对型进行编辑,如移动位置旋转缩放等。如果纯粹代,实现移动缩放 旋转,相信入门的都会。但我们肯定一个友好的交,即给用户一个比较友 好的编辑方式。我个人认为这方面,也不用费脑筋了,直接看看3dmax或者unity3d 身提供的编辑方式即可,这种方式的很好,也许还存在更好的。 是我的目标就变成了山寨。同网友聊天过程中得知在unity W店里面有一款RT Gizmo,价格五刀,实 现的功能即为我需的功能。果断,google之,最后花费一定资源分从某网站 载到手,打一看,竟然是 U

12、nityScript直接发的,故而也触动了我的欲望, C#整改之。在整改过程中不得不吐槽,写代码的时候,能不能不太面向过程。用着面向过程的思路,用着蛋痈的js写出的代,的看起来很费力。最后,我 不得不先翻,成C#,再进行整改。这里推荐一个网站http:/files.m2h.n1/js_to_c.php ,该网站可以直接将 UnityScript 翻,成 C#,虽 然会有错,需自己再手动修改,但的节约了很多工作量。一步就是对代码的详细修改,删去那些不必的代,,如广告以及一 些UI的代,。因为我想的很简单,就是位移旋转缩放,不其他花哨的没用 的东西,如一个GUI绘制的界面用一些信息交互。整改代,之

13、后,效果直接上图:缩放:位移:t'r如五中所,之前希望的是与Fbx文件的交,但是现实的骨感让我不得不另觅他径。如果有人也在搞fbx sdk的问题,希望能和我联系,不甚感激。本文讲述的是定义文件保存型信息。既然定义,那么就是搞 活楚一个型的,染到,需哪些信息。此处,因为我从事unity3d 发也不过半年时间,对,3d,型的理解还 很肤浅,故而此处,我也只能对着 unity3d来思考,我染那一个,型需哪 些信息。,许等工作闲暇之后,再深层次分析 fbx文件,再给出详细的3d,型 的数据结构。我们先在unity中创造一个cube ,然后查看其届性。我们看到其存在 的组件有 Transform

14、、MeshFilter、MeshRender。那我们依次分析。Transform :Irt diNOWl 叫呻 5#1】.晚)jc-cr;ftitr*nglti'第 徽 jw ?cr:,bisihjiijtt ''-'' - -.:"'. -1-1. '' .:.-:iKilEJrAnti (qrt *.:)If c*r' laatsadfset.5.心(*wo郴5七亦. gw:- i' - - j -(mition gec trt fKr:'01? right 9<t irt rinfcf

15、m mt ( (>ii ia1Mtihcdoi9'Opdmlni*milCfellWrippvlKL(4lgft)dir柯榕顿 i .iCMkIpdbk Vkco«3 ! KtI.Mr Mini处MiritiTouniwitrilt i # blg, 153,0311牌 ngihjw |我们需关注的,性包:I)表征子变换个数的childCount3)表征相对父物体的空间角信息localEulerAngles4) 表征相当父物体的空间位置信息localPosition5) 表征相对父物体的缩放信息localScare6) 表征相世界坐标系的空间角信息eulerAngles

16、 , rotation7) 表征相对世界坐标系的位置信息postion8) 表征相对世界坐标系的缩放信息lossyScale9) 表征从身坐标系到世界坐标系转换的矩阵localToWorldMatrix10) 表征从世界坐标系到,身坐标系转换的矩阵worldToLocalMatrixII)表征身坐标系的X方向right12)表征,身坐标系的Y方向up13)表征,身坐标系的 Z方向forward14)表征父变换彳息parent本文讨论的为单物体信息,从中选我们需关注的信息,梳理出来: postion、rotation、localScare(对无父物体时,该变量表征其相对世界坐标 系的缩放,之所以

17、不选择lossyScale是因为彼届性为只读的。转换矩阵信息无 需存储,会,动重新计算。)是我们得到第一批需存储的信息:位置信息、空间角信息、缩放信 息。MeshRenderer : 11- i、- = =- I =1 -:l :I l MeshRer dersr :,辛司 Eh ;: 7 -r .,: - ?: 5我们看到MeshRenderer其本身不存在任何状态性成员,均为直接继承其父级Renderer。Renderer的代码如下5)表征物体的材质信息 material > materials (多材质)6)表征是接收阴影receiveShadows是我们得到另一组需存储的信息:阴

18、影信息(是投射,是接 收)、光照图信息(索引、偏移),材质信息(需注意的是多材质时,材质 表现为一个数组,其中每一项的index即为该材质对应的通道,,在后续 mesh 中会使用到。)MeshFilterI II. ff PrcptfbMHpiHc Mtthinrt E 隅中咐 glnq 伽C。宵啷即用 lufj 咻 M 出部吓心丽FIT"- . fhlKLAMtl :也TM <-.-': f 17 ': -f,- ;q> Y j < -Arrr ;f i g怛部十时飞,加-?."耳: > 并可丁 叶公)':£” 相

19、 I |H I| :hxepfemjEM:门的即山*一 可以看到他只有两个届性,一个是 mesh, 个是sharedMesh ,两个都 i是Mesh对象。通过官方手册,我们得知这两个,性的区别在,mesh是当前物体独有的,你修改他,不会影响其他也使用这个网格的物体,但是如果修 改sharedmesh ,则会连带其他使用该网格的物体一起变化。那么,对此处, 我们随便选择一个即可,因为我们己保存加载物体,不会出现多个物体使用 同一个网格。Mesh : p/Prape-ieiII pukfie Motih,土 birdprstt Imoqpem岫l| get iMttelaidlModlnTplOp

20、boraJrtisraCEflL 版阿也11&4 I pub-c ;, WtndllijpeCwiiE ; JArth&j moi(Mrtholr- jV.- :!.LrjlI蛭日(:虹邑史U IW制恤匚叩叶:门:预,施|北预kpWuw !V:-J】gM *卜叶匚 -< ! 1 " . '"Tjliil);ft II fubfc Ikl bouncfi | 孵 毗 JI ;理11 b36”牌,咐5惟亦怙&司岸HweN扪.见孔牌利*旧1中代I pubic Ce:gr calo>n 1-囱皿 WrappirMUQrtil1I p计1

21、AliMlS i|WnppfriHifciR ftt WffiBidlnMhalWQbiwJnitnHmi.wt I pubic bwl Mnttlt i |*Wdlni7WrthDdnppQpiiNiFUiYlBnii£dlH 柑哗州刑3| E J1)表征网格顶点信息vertices2)表征顶点对应的颜色信息colors3)表征三角面信息triangles4)表征纹理坐标UV5)表征子网格的数量subMeshCount ,每一种材质均对应一个独立的网6)此处不考虑人物,型,骨骼类的成员不予考虑7)表征网格包围体信息bounds (可使用重新计算方法,不需存储)此我们已经搞活楚了,在

22、unity3d中存储一个物体需存储的信息。是着手编码。此处,使用 C#本身支持的序列化,使得信息的存储解析异常简 单。 最终调用代,:E . . . Uf.ityhiEiM,:CdlhctiaiJ日 put山n 山订 loielfiet:削颂:K'XBEehiTiflur Im疽|。晚就侦部一"Uif thb fcr inilidutttixS vtii 9 trt 0I/ 心如* if 司 1H qhcv p« fiatQ ' .):加批 0IS 也直皴皿,I:何Mtoi(皿址am临鼬wwi';MX:bjttUmrl1. .Ii, -jipcit

23、It a. -It. .Fci*il( '.'.I.' !:. ? . r.ditlPilil itantilU;i ;CUE Buttcntncv气】.皿 虬 瞩 5 I)I岫rtE*'。旅muniM 心。M41由勤 UlSfo 尚皿 NkmIKh 蛔:I / 台峙frbclI piHiBawA biwfa l VMWhHH出*周崛*frir II |v*fc bag mMHm (hkMEMMbvKlvkifirtKA WvidrahBl睥WiwHrafcaffr 盹 1I mMmI【板#Ari5p< < -« ; wI ptMebeeI

24、 pMc Wcfert 囱 MnWiyMMi g 2fJtfclWaf BgM*b«Aiidw 尸,日.廿如璀”甲山皿”1 叫 尹叩加sfil板EEi;::-3,力i EErJm jy iI p<& Mar .ipi lwlraworiihiJiTwI p«.£c Mi&rijI imMWl | pl尚顼*阻gvf |A4igJn|点mod&n湛植PHjrifrMQlKMipperesdML artI 用W NfiHiiQ mMta (Mwptciliml»a m际iy # 辨实5悯虹呐 *I鼎。! m M. y. l烦:grt:心Q wtI pditc MAruf iwtdMMlrill 1武神侦|get; |MwdbHlpMhWM|pdwlJhlvrMK WiipperlM 呐)I pkfc Niteuil fttadlliMiii (IktoiMfiitbWhMffiiiirJiihi*

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论