博客
关于我
基于WebGL 的3D呈现A* Search Algorithm
阅读量:452 次
发布时间:2019-03-06

本文共 1717 字,大约阅读时间需要 5 分钟。

 

 

最近搞个游戏遇到最短路径的常规游戏问题,一时起兴基于写了个A*算法的WebGL 3D呈现,算法基于开源  的javascript实现,其实作者也有个不错的2D例子实现  ,只不过觉得所有A*算法的可视化实现都是平面的不够酷,另外还有不少参数需要调节控制,还是值得好好搞个全面的Demo,先上张2D和3D例子的对照图。

实现代码比较容易一百多行,不过算法核心在astar.js了,界面核心在里面了,我只需要构建网格信息,只需监听用户点击,然后调用astar.js进行最短路径计算,将结果通过动画的方式呈现出走动的过程,所有代码如下:

function init() {                    w = 40; m = 20; d = w * m / 2;                gridRows = [];                            dm = new ht.DataModel();                 g3d = new ht.graph3d.Graph3dView(dm);                    g3d.setGridVisible(true); g3d.setGridColor('#BBBBBB'); g3d.setGridSize(m); g3d.setGridGap(w); g3d.addToDOM(); g3d.sm().setSelectionMode('none'); anim = startBall = endBall = null; g3d.getView().addEventListener(ht.Default.isTouchable ? 'touchstart' : 'mousedown', function(e){ if(!anim){ var p = g3d.getHitPosition(e); var x = Math.floor((p[0] + d)/ w); var y = Math.floor((p[2] + d)/ w); var endBall = dm.getDataByTag("cell_" + x + "_" + y); if(endBall && endBall.s('batch') !== 'wall'){ if(startBall.a('x') === x && startBall.a('y') === y){ return; } var g = new Graph(gridRows, { diagonal: formPane.v('diagonal') }); var start = g.grid[startBall.a('x')][startBall.a('y')]; var end = g.grid[x][y]; var result = astar.search(g, start, end, { closest: formPane.v('closest') }); if(!result.length){ return; } x = result[result.length-1].x; y = result[result.length-1].y; endBall = dm.getDataByTag("cell_" + x + "_" + y); endBall.s('3d.visible', true); startBall.s('3d.visible', false); formPane.setDisabled(true); anim = ht.Default.startAnim({ duration: 700, finishFunc: function(){ for(var i=0; i

自从iOS8支持WebGL后在移动终端上测试3D应用比当前的大部分Android平板舒服多了,以上的例子在iOS系统下呈现和算法都挺流畅,,当然这个小例子数据量也不大,本质其实还是2D的最短路径算法,并非真正意义的3D空间最短路径,但还是足够解决很多实际应用问题了。

 

转载地址:http://ezjbz.baihongyu.com/

你可能感兴趣的文章
企业为什么要选择企业云盘
查看>>
分布式、高并发、高性能场景(抢购、秒杀、抢票、限时竞答)数据一致性解决方案
查看>>
数字图像处理学习(2)—— 图像直方图均衡与图像匹配(python实现)
查看>>
前端权限控制-基于vue-router的动态路由实现
查看>>
淘宝镜像
查看>>
微信小程序引用外部字体或者图标
查看>>
PLSQL数据导入导出问题解决(空表、大字段表、表空间错误等)
查看>>
用JavaScript实现的太空人手表
查看>>
解决eclipse导出javadoc时的“错误: 编码GBK的不可映射字符”问题
查看>>
Vue.js-路由懒加载
查看>>
Python算法_盛最多水的容器(04)
查看>>
20.波利亚过程
查看>>
04_Mysql配置文件(重要参数)
查看>>
10.寻找最好的超参数
查看>>
D3力布图绘制--基本方法
查看>>
Egret Engine(白鹭引擎)介绍及windows下安装
查看>>
Asp.net mvc项目架构分享系列之架构概览
查看>>
你需要知道的缓存击穿/穿透/雪崩
查看>>
探究 C# 中的 char 、 string(一)
查看>>
浅谈使用git进行版本控制
查看>>