当前位置: 首页 > news >正文

【recast-navigation-js】使用three.js辅助绘制Agent寻路路径

目录

  • 说在前面
  • setAgentTarget
  • 绘制寻路路径
  • 结果
  • 问题
  • 其他

说在前面

  • 操作系统:windows 11
  • 浏览器:edge版本 124.0.2478.97
  • recast-navigation-js版本:0.29.0
  • golang版本:1.21.5
  • 上一篇:【recast-navigation-js】使用three.js辅助绘制Agent

setAgentTarget

  • 使用recast navigation接口requestMoveTarget设置agent的目标位置
    public setAgentTarget(pos: Vector3) {const { point: target } = this._meshQuery.findClosestPoint(pos);this._agent.requestMoveTarget(target);this._agentTarget = new Vector3().copy(target as Vector3)
    }
    

绘制寻路路径

  • 使用three.js中的Line绘制寻路路径
    private _updatePath(scene: Scene) {if (!this._agentTarget) {return}const path = []//[this._agent.position(), ...this._agent.corners()];path.push(new Vector3().set(this._agent.position().x, this._agent.position().y, this._agent.position().z))this._agent.corners().forEach((v) => {path.push(new Vector3().set(v.x, v.y, v.z))})if (path.length <= 1) {return}const spline = new CatmullRomCurve3(path);const samples = spline.getPoints(path.length * 12);const geometrySpline = new BufferGeometry().setFromPoints(samples);const line = new Line(geometrySpline, new LineDashedMaterial({ color: 0x66ccff, dashSize: 1, gapSize: 0.5 }));line.computeLineDistances();if (this.crowdPathLine) {scene.remove(this.crowdPathLine)}this.crowdPathLine = linescene.add(line)
    }
    
  • CatmullRomCurve3
    给定输入点,创建相对平滑的曲线(实际上可以不用这个,使用实际的寻路关键点更能反映寻路结果)
  • LineDashedMaterial
    虚线材质
  • update,每帧重新绘制寻路路径
    public update(delta: number, scene: Scene) {this._crowd.update(delta)this.crowdHelper.update()this._updatePath(scene)
    }
    

结果

  • 鼠标右键设置agent起始位置
  • 鼠标左键设置agent目标位置
    在这里插入图片描述

问题

  • 最开始使用Teleport方法设置agent起点的时候,发现有些地方不太对,比如点击下图红色位置传送不过去
    在这里插入图片描述
    寻路也不对
    在这里插入图片描述
  • 后来发现是创建DebugDrawer的时候自己把它的位置做了下偏移
    const tmpDebugDrawer = new DebugDrawer();tmpDebugDrawer.drawNavMesh(mesh);tmpDebugDrawer.position.z += 10
    
  • 导致实际点击得到的位置也有一定的偏移,所以在传给recastnavigation使用的时候需要将这个偏移去掉,或者在创建的时候不要加偏移

其他

  • 完整代码再等等

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • php质量工具系列之PHPCPD
  • 论文中eps格式图片制作
  • 如何利用langchian调用百度大模型API
  • c++进阶——继承
  • 数据库管理工具——DBeaver简介
  • 51单片机独立按键控制LED灯,按键按一次亮,再按一次灭
  • Jira的原理及应用详解(五)
  • 基于Python+Flask框架实现的新冠疫情可视化的设计与实现
  • Linux-用户管理与软件管理
  • 14-特殊函数——静态函数、递归函数、函数指针、回调函数、内联函数、变参函数
  • 神经网络 torch.nn---Convolution Layers
  • 深入理解交叉熵损失 CrossEntropyLoss - CrossEntropyLoss
  • 深入ES6:解锁 JavaScript 类与继承的高级玩法
  • KUKA机器人中断编程详细教程1—了解中断
  • MySQL使用
  • 【笔记】你不知道的JS读书笔记——Promise
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • bearychat的java client
  • ComponentOne 2017 V2版本正式发布
  • Invalidate和postInvalidate的区别
  • javascript 哈希表
  • js算法-归并排序(merge_sort)
  • JS专题之继承
  • node和express搭建代理服务器(源码)
  • PHP 小技巧
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • react 代码优化(一) ——事件处理
  • Redis在Web项目中的应用与实践
  • session共享问题解决方案
  • XForms - 更强大的Form
  • 对象引论
  • 关于Java中分层中遇到的一些问题
  • 前端存储 - localStorage
  • 日剧·日综资源集合(建议收藏)
  • 如何解决微信端直接跳WAP端
  • 如何设计一个微型分布式架构?
  • 软件开发学习的5大技巧,你知道吗?
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 手机端车牌号码键盘的vue组件
  • 一文看透浏览器架构
  • - 转 Ext2.0 form使用实例
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • $NOIp2018$劝退记
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (二)springcloud实战之config配置中心
  • (二)原生js案例之数码时钟计时
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (未解决)macOS matplotlib 中文是方框
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)拼包函数及网络封包的异常处理(含代码)