博客
关于我
基于HTML5的WebGL呈现A星算法的3D可视化
阅读量:472 次
发布时间:2019-03-06

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

最近在搞一个游戏遇到了最短路径的常规问题,基于写了个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空间最短路径,但还是足够解决很多实际应用问题了。

最近在搞一个游戏遇到了最短路径的常规问题,基于写了个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://lwjbz.baihongyu.com/

你可能感兴趣的文章
Opera Mobile Classic Emulator
查看>>
Operation not supported on read-only collection 的解决方法 - [Windows Phone开发技巧系列1]
查看>>
OperationResult
查看>>
Operations Manager 2007 R2系列之仪表板(多)视图
查看>>
operator new and delete
查看>>
operator new 与 operator delete
查看>>
operator() error
查看>>
OPPO K3在哪里打开USB调试模式的完美方法
查看>>
oppo后端16连问
查看>>
Optional类:避免NullPointerException
查看>>
Optional讲解
查看>>
ORA-00932: inconsistent datatypes: expected - got NCLOB【ORA-00932: 数据类型不一致: 应为 -, 但却获得 NCLOB 】【解决办法】
查看>>
ORA-00942 表或视图不存在
查看>>
ORA-01034: ORACLE not available
查看>>
ORA-01152: 文件 1 没有从过旧的备份中还原
查看>>
ORA-01207:文件比控制文件更新 - 旧的控制文件
查看>>
ORA-01795: 列表中的最大表达式数为 1000
查看>>
ORA-06575: 程序包或函数 NO_VM_DROP_PROC 处于无效状态
查看>>
ORA-08102的错误
查看>>
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor异常
查看>>