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

2024-06-02 22:36

本文主要是介绍【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(): voidend(): 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].pointbreak;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: NavMeshQueryprivate _crowd: Crowdprivate _agent: CrowdAgentprivate _agentTarget: null | Vector3public crowdHelper: CrowdHelperconstructor(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有时候会失败,有时候感觉位置不对,得再看看是啥问题

这篇关于【recast-navigation-js】使用three.js辅助绘制Agent的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1025275

相关文章

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2