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

目录

  • 说在前面
  • 使用Tweakpane
  • 添加CrowAgent
  • 其他

说在前面

  • 操作系统:windows 11
  • 浏览器:edge版本 124.0.2478.97
  • recast-navigation-js版本:0.29.0
  • golang版本:1.21.5

使用Tweakpane

  • fps面板
    interface FPSGraph extends BladeApi<BladeController<View>> {
        begin(): void
        end(): void
    }
    
    export interface BindingItem {
        refresh(): void
    }
    
    // Debug
    export const gui = new Pane()
    gui.registerPlugin(EssentialsPlugin)
    
    export const fpsGraph = gui.addBlade({
        view: 'fpsgraph',
        label: 'fpsgraph',
    
    }) as FPSGraph
    
  • 鼠标点击位置
    const controlFolder = gui.addFolder({
            title: "SceneControl",
        })
        this._sceneCtlBinding = controlFolder.addBinding(this._control, 'target', {
            format: (x) => x,
        }) as BindingItem
    
    在这里插入图片描述
  • 手动刷新值
    按理说绑定之后应该要自动刷新界面上的值,但是不知道为啥没有刷新
    private refreshBinding() {
        if (this._sceneCtlBinding) {
            this._sceneCtlBinding.refresh()
        }
    }
    
  • 监听事件
     public onPointerDown(e: PointerEvent) {
        var pointer = new Vector2()
        pointer.set((e.clientX / window.innerWidth) * 2 - 1, - (e.clientY / window.innerHeight) * 2 + 1);
    
        this._raycaster.setFromCamera(pointer, this._camera);
        console.log(pointer)
        const intersects = this._raycaster.intersectObject(this._navMeshObj);
    
        if (intersects.length > 0) {
            switch (e.button) {
                case 0:
                    // "Left button clicked.";
                    break;
                case 1:
                    // "Middle button clicked.";
                    this._control.target = intersects[0].point
                    break;
                case 2:
                    // "Right button clicked.";
                    this._agent.teleport(intersects[0].point)
                    break;
                default:
                    // `Unknown button code: ${e.button}`;
            }
        }
    }
    
  • 结果
    在这里插入图片描述

添加CrowAgent

  • agent.ts
    import { CrowdHelper } from "@recast-navigation/three";
    import { Crowd, CrowdAgent, NavMesh, NavMeshQuery } from "recast-navigation";
    import { MeshStandardMaterial, Vector3 } from "three";
    
    export class RecastAgent {
        private _meshQuery: NavMeshQuery
        private _crowd: Crowd
        private _agent: CrowdAgent
        private _agentTarget: null | Vector3
    
        public crowdHelper: CrowdHelper
    
        constructor(mesh: NavMesh) {
            this._meshQuery = new NavMeshQuery(mesh)
            this._crowd = new Crowd(mesh, {
                maxAgents: 1,
                maxAgentRadius: 0.5,
            })
    
            const { point: agentPosition } = this._meshQuery.findClosestPoint({ x: 0, y: 0, z: 0 })
    
            this._agent = this._crowd.addAgent(
                agentPosition,
                {
                    radius: 0.5,
                    height: 1,
                    maxAcceleration: 1,
                    maxSpeed: 1,
                }
            )
            this.crowdHelper = new CrowdHelper({
                crowd: this._crowd,
                agentMaterial: new MeshStandardMaterial({ color: 'red' }),
            })
            this._agentTarget = null
        }
    
        public update(delta: number) {
            this._crowd.update(delta)
            this.crowdHelper.update()
        }
    
        public teleport(pos: Vector3) {
            const { point: target, success: ok } = this._meshQuery.findClosestPoint(pos);
            this._agent.teleport(target);
            console.log(ok ,pos, target)
    
            this._agentTarget = null
        }
    
        public setAgentTarget(pos: Vector3) {
            const { point: target } = this._meshQuery.findClosestPoint(pos);
            this._agent.requestMoveTarget(target);
    
            this._agentTarget = new Vector3().copy(target as Vector3)
        }
    }
    
  • 右键点击事件调用teleport函数
    // ...
    case 2:
    	// "Right button clicked.";
        this._agent.teleport(intersects[0].point)
        break;
    // ...
    
  • 结果
    在这里插入图片描述

其他

  • 完整代码再等等
  • findClosestPoint有时候会失败,有时候感觉位置不对,得再看看是啥问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/672745.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis这一篇就够了

一.概述 Redis是什么&#xff1f; Redis是远程服务字典服务&#xff0c;是一个开源的使用ANSI C语言编写&#xff0c;支持网络&#xff0c;可基于内存亦可持久化的日志型&#xff0c;Key-Value数据库&#xff0c;并提供多种语言的API。 redis会周期性把更新的数据写入磁盘或把…

米尔MYC-Y6ULX-V2开发板测评记录

文章目录 1、板子上手体验2、板载硬件3、系统信息4、 驱动测试5、编译linux三大件7、摄像头测试9、总结 1、板子上手体验 首先非常感谢芯查查给了这样一个机会来测评这样一款性能十分强大的开发板&#xff0c;我拿到手的是MYC-Y6ULX-V2核心板及开发板&#xff0c;这块板子具有…

SSMP整合案例第六步 在前端页面上利用axios和element-ui与后端交互实现增删改

新增操作 正常我们都是从新增功能书写 查看源码 显示的是这个 在vue里面开下来 这样就能显示 点击确定 就能把数据发送到后台进行保存 //弹出添加窗口handleCreate() {this.dialogFormVisible true;},//重置表单resetForm() {},//添加handleAdd() {//绑定的是确定按钮 发起请…

IDM优势

目录 &#x1f40b;引言 &#x1f40b;IDM的核心优势 &#x1f988;下载速度提升 &#x1f41f;技术原理&#xff1a; &#x1f41f;对比示例&#xff1a; &#x1f988;断点续传 &#x1f41f;技术原理&#xff1a; &#x1f41f;对比示例&#xff1a; &#x1f988;集…

牛客热题:缺失的第一个正整数

牛客热题&#xff1a;数组中出现一次的两个数字> &#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 …

如何使用golang自带工具对代码进行覆盖率测试

在 Go 语言中&#xff0c;测试代码覆盖率通常使用 go test 命令结合 -cover 和 -coverprofile 1. 基本代码覆盖率报告 在项目目录下运行以下命令 go test -cover这将在控制台输出一个代码覆盖率的百分比。但是&#xff0c;这种方式不会保存覆盖率数据&#xff08;可以指定目…

961操作系统知识总结

部分图片可能无法显示&#xff0c;参考这里&#xff1a;https://zhuanlan.zhihu.com/p/701247894 961操作系统知识总结 一 操作系统概述 1. 操作系统的基本概念 重要操作系统类型&#xff1a;批处理操作系统(批量处理作业&#xff0c;单道批处理/多道批处理系统&#xff0c;用…

将 py 文件编译成 pyd 文件

文章目录 一、简介1.1、Python中的文件类型&#xff1a;.py .pyc .pyd1.2、基本原理1.2.1、函数详解&#xff1a;Extension() —— 用于定义扩展模块&#xff08;C/C 扩展&#xff09;的类1.2.2、函数详解&#xff1a;setup() —— 用于配置和构建包的函数 二、构建过程2.0、…

带交互的卡尔曼滤滤波|一维滤波|源代码

背景 一维卡尔曼滤波的MATLAB例程&#xff0c;​背景为温度估计。 代码介绍 运行程序后&#xff0c;可以自己输入温度真实值&#xff1a; 以20℃为例&#xff0c;得到如下的估计值​&#xff1a; 滤波前的值和滤波后的值分别于期望值&#xff08;真实值&#xff09;作差…

海光CPU:国产信创的“芯“动力解读

国产信创CPU-海光CPU CPU&#xff1a;信创根基&#xff0c;国之重器 国产CPU形成三大阵营&#xff1a;自主架构、x86及ARM。自主阵营中&#xff0c;龙芯和申威以LoongArch和SW-64为基石&#xff1b;ARM阵营由鲲鹏、飞腾主导&#xff0c;依托ARM授权研发处理器&#xff1b;x86阵…

Python知识点17---包

提前说一点&#xff1a;如果你是专注于Python开发&#xff0c;那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了&#xff0c;而如果你和作者一样只是操作其他技术的Python API那就足够了。 Python的包&#xff0c;你可以把它看成是一个大的模块&#xff0c;它…

【Java】javafx界面布局

目录 一、面板类 &#xff08;1&#xff09;Pane面板 &#xff08;2&#xff09;HBox面板 &#xff08;3&#xff09;VBox面板 &#xff08;4&#xff09;BorderPane面板 &#xff08;5&#xff09;FlowPane面板 (6)GridPane面板 &#xff08;7&#xff09;StackPane面…

生命在于学习——Python人工智能原理(3.1)

三、深度学习 &#xff08;一&#xff09;深度学习的概念 1、深度学习的来源 深度学习的概念来源于人工神经网络&#xff0c;所以又称深度神经网络。 人工神经网络主要使用计算机的计算单元和存储单元模拟人类大脑神经系统中大量的神经细胞&#xff08;神经元&#xff09;通关…

【精读文献】J. Environ. Manage.|青藏高原生态恢复项目下植被覆盖动态及其对生态系统服务的约束效应

目录 文章简介 01 文章摘要 02 研究背景、目标及创新点 2.1 研究背景 2.2 研究现状 03 研究区域与数据集 3.1 研究区域 3.2 研究数据 04 研究方法 4.1 趋势分析 4.2 残差趋势分析 4.3 偏相关 4.4 生态系统服务评价 4.5 约束线的定义和提取 05 研究结果 5.1 植被…

重学java 55. 集合 Set接口

我救自己万万次&#xff0c;铮铮劲草&#xff0c;绝不动摇 —— 24.6.2 一、Set集合介绍 Set和Map密切相关的 Map的遍历需要先变成单列集合&#xff0c;只能变成set集合 二、HashSet集合的介绍和使用 1.概述 HashSet是Set接口的实现类 2.特点 a、元素唯一 b、元素无序 c、无索引…

单元测试的心法分享

大家好&#xff0c;我是G探险者&#xff01; 今天我们简单聊聊单元测试的哪些事儿~ 两天时间我玩明白了单元测试的套路。 这里我分享一下思路。 在我眼里单元测试室什么&#xff1f; 请看这张草图&#xff1a; 单元测试主要关注单个代码单元&#xff08;通常是类或方法&am…

云原生架构案例分析_2.云原生技术助力某汽车公司数字化转型实践

名词解释&#xff1a; 互联网 在“互联网”模式下&#xff0c;我们仅仅把互联网看作是一种传播工具、传播手段、传播渠道和传播平台&#xff0c;对于互联网的应用大体上是在既有的运作逻辑的基础之上&#xff0c;把互联网作为延伸传媒影响力、价值和功能的一种延伸型工具&…

秒杀基本功能开发(不考虑高并发情况)

文章目录 1.显示秒杀状态1.controller修改GoodsController.java的toDetail方法&#xff0c;响应秒杀状态和秒杀剩余时间 2.前端1.goodsDetail.html 图片下面添加一行秒杀开始时间2.goodsDetail.html 添加计时器js代码 3.测试1.秒杀进行中2.修改db的秒杀开始时间为明天3.出现秒杀…

msvcr120.dll是干嘛的?出现找不到msvcr120.dll丢失怎样解决

msvcr120.dll是Microsoft Visual C 2012 Redistributable的核心文件&#xff0c;它是Microsoft Corporation开发的C/C运行时库文件之一。这个文件通常与应用程序一起安装&#xff0c;为应用程序提供许多基本的运行时功能&#xff0c;包括内存管理、异常处理、输入/输出操作等。…

Jenkins、GitLab部署项目

1、安装JDK 1.1、下载openJdk11 yum -y install fontconfig java-11-openjdk1.2、查看安装的版本号 java -version1.3、配置环境变量 vim /etc/profile在最底部添加即可 export JAVA_HOME/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 export PATH$JAVA_HOME/…