博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于HTML5的WebGL呈现A星算法的3D可视化
阅读量:5948 次
发布时间:2019-06-19

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

IMG_1486.png

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

Screen-Shot-2014-11-24-at-5.36.33-PM.png

实现代码比较容易一百多行,不过算法核心在astar.js了,界面核心在ht.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空间最短路径,但还是足够解决很多实际应用问题了。

Screen-Shot-2014-11-24-at-5.09.13-PM.png

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

你可能感兴趣的文章
2007年硕士研究生面试时的英文自我介绍
查看>>
POJ1789:Truck History(Prim算法)
查看>>
SD卡
查看>>
使用servletAPI三种方式简单示例
查看>>
单片机不同晶振怎么计算延迟时间?
查看>>
视频会议十大开源项目排行
查看>>
SQL Server Management Studio 简单使用说明
查看>>
【前端】javascript判断undefined、null、NaN;字符串包含等
查看>>
玩转iOS开发 - 数据缓存
查看>>
李洪强-C语言3-数组
查看>>
C# 6.0的字典(Dictionary)的语法
查看>>
使用ShareSDK实现第三方授权登录、分享以及获取用户资料效果,项目中包含:源码+效果图+项目结构图...
查看>>
三级联动效果
查看>>
Sprite和UI Image的区别
查看>>
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql/mysql.sock' (2)
查看>>
python练习笔记——丑数的计算
查看>>
OpenCV + python 实现人脸检测(基于照片和视频进行检测)
查看>>
XSS 前端防火墙 —— 天衣无缝的防护
查看>>
Node.js umei图片批量下载Node.js爬虫1.00
查看>>
客户端拖动控件封装(让拖动变得更简单)
查看>>