Navigation Mesh与Line-of-Sight Test

上图是一个由任意凸多边形构成的导航网格,白线包围区域代表着不可进入的障碍区域,红线包围区域则可以进入或穿越。网格中所有多边形的顶点存储次序均为顺时钟序。在下面的讨论中,我们的运算一概采用左手系进行。

假设当前所处的位置为p0,视线方向矢量为n0,p0位于多边形A中,我们知道每一条边的两侧的多边形的编号,现在的问题是:如果求得该视线途经了哪些多边形?与这些多边形的哪些边相交于何处(即Way point)?该视线终结于哪条边的何处?

首先让我们来解决一个子问题,即判断射线r与某凸多边形p之间的关系。不难想象,r只可能与p不相交、相交于1点或2点(只有穿出、或先射入后穿出)。这里我们最关心的是:(1) r究竟与p相交否?(2) 如果相交,那么r穿出p时,其交点在哪条边上?在哪里?

以A和射线r=(p0,n0)为例,先来判断A与r是否相交,这个太容易了,只需判断A有没有边与r相交即可。遍历A的每一条边e,然后得到每一条边的起点和终点(注意,时刻牢记顶点顺序是顺时钟的)。然后,分别获得起点矢量from和终点矢量to,然后计算test_a=from×n0和test_b=to×n0,再来检查test_a和test_b的Z分量符号:如果相同,则from、to均位于n0的同一侧,e与r不相交;如果test_a.Z>0且test_b.Z<0,则e为射线r在A中的穿出线;如果test_a.Z<0且test_b.Z>0,则要么e是射线的反方向与A的交线,要么e为射线在A中的射入边。这里,我们最关心的是有没有test_a.Z>0且test_b.Z<0的情况,即有没有穿出边。

如图,如果要对r进行LOS test,首先我们要判断一下p0处于哪个多边形,这个点与多边形关系的判断也很容易,这里,我们的p0位于A中。然后,在A中找射线r的穿出边和穿出点(求两射线的交点,trivial),判断穿出边的另一侧的多边形是否可以进入?如果是障碍或网格边缘,则LOS test中止,如果不是,则获得穿出边另一侧的多边形编号,这里是B,然后继续在B中找射线r的穿出边和穿出点,继续前面的一系列步骤,直到找出r的所有途经多边形、所有穿出边和穿出点为止。以上便是一次完整的视线检测过程。是不是足够简单?heh
 
如何判断点p0是否处于凸多边形内?

见上图,这里我们采用叉乘法,虽说只适用于凸多边形,不过计算最简便,不涉及三角运算(内角和法)和开方(面积法),什么水平垂直交叉线检测就直接免了吧,too ugly。假设多边形是顺时钟顶点序,我们采用的是左手系。遍历每条边,作一个边矢量e,从起点到终点;然后作测试矢量t,从边起点到要测试的点p0;计算test=e×t,如果test矢量的Z分量符号始终保持不变,则p0处于多边形内部;一旦其符号发生了改变(只需检测到一次符号改变即可),则p0处于多边形外部。

导航网格和LOS检测用来干什么的?

导航网格一般用来做层级式A*寻径,它可以很容易地推广到3D路径规划,与某些附加特性相配合,能够实现更多的特殊用途;LOS检测主要有两个用途:动态局部Point of View寻径和A*路径优化(平滑+Cutting the Corner)。

COPY NAV导航网格寻路 -- 光照射线法相关推荐

  1. COPY NAV导航网格寻路(4) -- 生成nav网格

    假设上图是一个游戏地图,红色的区域是不可行走的区域,浅灰色区域是可行走区域,要想在游戏中实现nav寻路,必须将可行走区域转化为nav网格并保存为一种固定形式的数据,如下图浅红色的三角形. nav网格必 ...

  2. NAV导航网格寻路(4) -- 生成nav网格

    这篇是转的文章,原文 http://blianchen.blog.163.com/blog/static/131056299201037102315211/ 假设上图是一个游戏地图,红色的区域是不可行 ...

  3. Cocos Creator3.x NavMesh导航网格寻路(一)

    前言 在游戏开发过程中,寻路可能是大多数游戏都必不可少的功能.2d游戏中最常用的就是A* 寻路了.在3d游戏中,对于一些简单的,没有高度地面A* 寻路同时也是可以使用的,但是对于一些地面比较复杂的游戏 ...

  4. [unity3d]recast navigation navmesh 导航网格 寻路算法 源码分析

    recast navigation navmesh导航网格算法源码分析 Author:  林绍川 recast navigation navmesh是unity3d ue4内置的寻路算法 本文为了方便 ...

  5. Cocos Creator3.x NavMesh导航网格寻路

    前言 在游戏开发过程中,寻路可能是大多数游戏都必不可少的功能.2d游戏中最常用的就是A* 寻路了.在3d游戏中,对于一些简单的,没有高度地面A* 寻路同时也是可以使用的,但是对于一些地面比较复杂的游戏 ...

  6. Cocos Creator3.x:NavMesh 导航网格寻路(二)

    前言 继Cocos Creator 3.x :NavMesh寻路后,菜鸟继续对寻路功能进行完善和测试,对除了web平台之外的其他平台进行支持与测试,目的是使咱们的寻路动能可以支持更多的场景. 在线体验 ...

  7. 了解导航网格 Navigation Mesh

    原文:https://www.jianshu.com/p/490a9128b248 这篇文章,首先会介绍什么是导航网格,它在 3D 游戏中起到了什么样的作用.然后会介绍目前导航寻路最常用的第三方开源库 ...

  8. Unity --- 导航网格 与 导航的使用

    导航网格和导航组件有关 这个导航组件有啥用呢? --- 答案就是用来进行寻路的 这个导航组件不仅帮我们获取对应的导航信息,而且还会帮我们进行位置的移动 有了导航组件的话,我们的游戏物体将会具有自动绕过 ...

  9. 03、NavMesh--导航网格寻路

    一.概述: NavMesh是3D游戏世界中用于实现动态物体自动寻路的一种技术,他将游戏场景中复杂的结构组织关系简化为带有一定信息的网格, 进而在这些网格的基础上通过一些列的计算来实现自动寻路. 二.简 ...

  10. 《UnityAPI.NavMeshAgent导航网格代理》(Yanlz+Unity+SteamVR+云技术+5G+AI+VR云游戏+Unity+NavMeshAgent+立钻哥哥++OK++)

    <UnityAPI.NavMeshAgent导航网格代理> 版本 作者 参与者 完成日期 备注 UnityAPI_NavMeshAgent_V01_1.0 严立钻 2020.09.10 # ...

最新文章

  1. python相关性分析特征过滤_特征选择-Filter过滤法后续(相关,互信息法)
  2. 《系统集成项目管理工程师》必背100个知识点-09初步可行性研究可能出现的结果...
  3. eclipse 代码提示后面的百分比是什么意思?
  4. 红帽 jboss_红帽峰会2015所需的JBoss BPM内容指南
  5. 网络验证php接口逆向,一个专利查错的逆向(网络验证)
  6. struts2.0标签库
  7. 在linux下卸妆软件,太原化妆学校告诉你如何正确卸妆
  8. 浅谈:飞秋 程序设计之网络通信
  9. mysql 将a表数据插入b表_查询A表数据插入到B表中 sql
  10. spring-boot配置文件中server.context-path不起作用
  11. asp定时生成静态HTML的代码
  12. 我的IT之路------来自黑马程序员
  13. 基于微信小程序的点餐与预约餐桌的管理系统+后台管理
  14. js 获取设备或浏览器唯一标识的方式
  15. [Mysql] 创建和操纵数据表
  16. HDU - 4082 Hou Yi's secret
  17. 如何安装 ONLYOFFICE Workspace丨安装教程丨使用教程
  18. 乌鸦与树(crow)
  19. 前端练习--京东图片链接
  20. 长期稳定的搬砖项目——steam搬砖

热门文章

  1. linux虚拟机scsi类型,linux虚拟机的scsi设备id与盘符不一致问题的解决
  2. Phase2 Day11 Set Map
  3. r430服务器如何用u盘做系统,DELL R430服务器U盘安装操作系统指南.docx
  4. 未来5-10年计算机视觉发展趋势
  5. 2021年危险化学品经营单位安全管理人员实操考试视频及危险化学品经营单位安全管理人员操作证考试
  6. Mac应用程序、软件、工具仓库
  7. 一个java swt桌面程序开发到打包的总结(1)(收集)
  8. Discuz X 3.4 系列漏洞梳理
  9. 通王CMS采集-TWCMS文章采集-通王CMS关键词采集伪原创发布详解
  10. oracle timesten tt的启动与停止