[]3D中如何限制角色的行走区域?

3D中如何限制角色的行走区域?
我现在有一个地图,如何限制角色在地图区域内行走?
已邀请:

183*****755

赞同来自: sfsmmc

方案一:(使用较麻烦,性能最高,推荐方案)
    1.可行走区域建模,比如有一个场景,美术可以通过3dmax建模软件,对可行走区域建模,类似于一个平面,有高低起伏,如果美术建模,切记3dmax中和unity中的坐标转换,导入fbx到unity场景中的旋转信息必须为(0,0,0)。或者可以把场景直接放到unity中,unity中有个NavMesh的组件,通过简单脚本也可以直接生成obj,这里不熟悉unity的自行百度,然后放3dmax中转成fbx再导入unity场景中。
   2. 生成高度图,先通过unity插件导出场景,这里其实也可以直接放到laya3d场景中,根据可行走区域获取高度数据,这个可参考官网的示例http://layaair.ldc.layabox.com ... ample,这个方法不推荐,因为初始化所有高度数据时间过长,如果真实游戏,体验很差。这里,由于某些需求,我写过一个脚本,但没有发布,原理 是通过射线检测可行走区域网格模型,采集高度数据,绘制生成一张png高度图,每个像素点代表一定区域高度,生成高度图的大小可控,但不要超过2048*2048,高度图越大,越精确,但相应所占的内存和显存较大,酌情选择。脚本见附件, 放到layaair3D中 直接运行即可,运行成功后,会自动下载一个文件,把文件后缀改为png即可
   3.使用高度图
       高度图的预加载:
               {url: "res/heightMap.png", clas:Texture2D, priority:1, params:[true]}
       场景中初始化MeshTerrainSprite3D:
              //通过场景中子父级节点寻找可行走区域网格模型
              var meshSprite3D:MeshSprite3D = sceneSprite3d.getChildAt(0).getChildAt(0).getChildAt(13) as MeshSprite3D;
              var texture:Texture2D = Loader.getRes("res/heightMap.png") as Texture2D;
              //通过高度图纹理和最大高度最小高度生成MeshTerrainSprite3D
              var terrainSprite:MeshTerrainSprite3D = MeshTerrainSprite3D.createFromMeshAndHeightMap(meshSprite3D.meshFilter.sharedMesh as Mesh, texture, minHeight, maxHeight);
              terrainSprite.transform.worldMatrix = meshSprite3D.transform.worldMatrix;
        角色行走时获取高度:
              var mheight:Number = terrainSprite.getHeight(x, z);
              //mheight即为当前角色所在位置高度         
              if (isNaN(mheight))
                 //非数字,则走到不走区域,做相应的逻辑判断即可        
方案二:(使用方便,性能较差,不推荐)
        layaAir3D在下下个 版本会新增功能--地形,也可支持从unity中导出地形,然后直接就可从地形中获取当前位置   所在高度。因为地形牵扯到移动端浏览器硬件设备的很多技术瓶颈,性能比肯定不如建模软件直接创建的模型,所以此方案酌情考虑!      

sfsmmc

赞同来自:

使用插件生成的高度图不能和原模型重合,有拉伸变形该怎么处理(高度图必须是正方形吗)?
3DMAX 原图:
QQ截图20170602172422.png

拉伸变形(2048*2048):
dd.png

缺失(518*266):
518.png

 
源码中:
script.png
这里的像素为什么要将宽高反着画(当高度图不是正方形的时候,出现缺失部分怎么处理?)

183*****755

赞同来自:

有点看不懂你在说什么,挑个时间,qq私聊下吧

qq1981150053

赞同来自:

并没有生成高度图,也没有生成地形文件lt,请问导出地形也什么具体要求么?

qq1981150053

赞同来自:

导出的高度图,使用的时候被提示,这个怎么处理

smallsow

赞同来自:

导出来是一张纯白的图片,是哪里不对么~

MAR

赞同来自:

老哥,图片生成了,getHeight的时候HeightMap为空是什么情况,而且我用另一个函数createFromMesh直接指定高度,调用getHeight结果高度输出NaN

131*****019

赞同来自:

请问,这个脚本我直接执行老是报错,  有没有需要修改的地方呢?
 
TypeError: Cannot read property 'btCollisionObject' of undefined
bundle.js:68723
    at PhysicsCollider.__proto._onAdded (/Users/admin/layaA4/layaA4/bin/js/bundle.js:68723:31)
    at MeshSprite3D.__proto._addComponentInstance (/Users/admin/layaA4/layaA4/bin/js/bundle.js:39288:9)
    at MeshSprite3D.__proto.addComponent (/Users/admin/layaA4/layaA4/bin/js/bundle.js:39363:9)
    at Function.Utils3D._createNodeByJson (/Users/admin/layaA4/layaA4/bin/js/bundle.js:31020:26)
    at Function.Utils3D._createNodeByJson (/Users/admin/layaA4/layaA4/bin/js/bundle.js:31003:24)
    at Function.Utils3D._createNodeByJson (/Users/admin/layaA4/layaA4/bin/js/bundle.js:31003:24)
    at Function.Sprite3D._parse (/Users/admin/layaA4/layaA4/bin/js/bundle.js:57045:21)
    at Laya3D._onHierarchyInnerFirstLevResouLoaded (/Users/admin/layaA4/layaA4/bin/js/bundle.js:8825:123)
    at Handler.__proto.runWith (/Users/admin/layaA4/layaA4/bin/js/bundle.js:2162:42)
    at onComplete (/Users/admin/layaA4/layaA4/bin/js/bundle.js:43827:16)

要回复问题请先

商务合作
商务合作