dtNavMeshQuery::raycast(dtPolyRef startRef, const float* startPos, const float* endPos,

const dtQueryFilter* filter, const unsigned int options,

dtRaycastHit* hit, dtPolyRef prevRef):

做2D的检测,忽略y轴

1 先让curRef = startRef;

2 while (curRef)

{

3 在curRef上进行碰撞dtIntersectSegmentPoly2D

hit->hitEdgeIndex = segMax;

把碰撞到的polygon存起来hit->path[n++] = curRef;

segMax == -1的时候说明射线的end在这个poly里面

那就不用往下碰撞了,直接hit->pathCount = n;

4 接下来碰撞nextpoly for循环

对于这个poly的所有link

找到segMax那条边

并且根据其ref找到nextPoly和nextTile

if (nextPoly->getType() == DT_POLYTYPE_OFFMESH_CONNECTION)//有可能是segMax么?

如果这个link->side == 0xff也就是不是tileboundry,nextRef = link->ref;

if (link->bmin == 0 && link->bmax == 255)也就是link跨越了整个边

下一个polyref就找到了

else

就是只覆盖了部分边的link

float z = startPos[2] + (endPos[2]-startPos[2])*tmax;求交点,

如果是在lmin和lmax之间,则说明相交。

下一个polyref就找到了

竖着的两个格子也是一样的

5 lastPos用来存之前的curPos

curpos移动到碰撞点 dtVmad(curPos, startPos, dir, hit->t);

获得segMax对应的边的两个顶点e1,e2

算出curPos的高度值 curPos[1] = e1[1] + eDir[1] * s;

eDir是e1到e2的向量,s是curpos在线段上的插值

计算curpos移动这一段的cost,也就是lastPos, curPos之间的cost

累加到hit->pathCost

6接下来就是,end不在poly的里面,又没有找到nextref的情况

那就是we hit a wall.

计算碰撞点在xz平面上的法线hit->hitNormal,并且dtVnormalize

7 如果没有碰撞上这个poly,进入nextPoly,因为毕竟还有nextRef

raycast 一小段距离碰撞到的poly的更多相关文章

  1. 需要中文版《The Scheme Programming Language》的朋友可以在此留言(内附一小段译文)

    首先给出原著的链接:http://www.scheme.com/tspl4/. 我正在持续翻译这本书,大概每天都会翻译两小时.若我个人拿不准的地方,我会附上原文,防止误导:还有些不适合翻译的术语,我会 ...

  2. 处理TCP连包的一小段代码

    学习网络编程也有一段时间了,一直听说TCP数据会连包,但一直不知道怎么测试好.最近测试了下:发送方使用对列,将发送的数据存入队列,然后开线程,专门发送.发送多包数据之间不延时.在接收方,他们确实连在一 ...

  3. Cookie是存储在客户端上的一小段数据

    背景 在HTTP协议的定义中,采用了一种机制来记录客户端和服务器端交互的信息,这种机制被称为cookie,cookie规范定义了服务器和客户端交互信息的格式.生存期.使用范围.安全性. 在JavaSc ...

  4. 昨天周末晚上没有出去,码了一小段,先留着kangkang。

    昨天周末晚上没有出去,码了一小段,先留着kangkang. import numpy as npimport matplotlibmatplotlib.use('Agg')import matplot ...

  5. 软件工程-构建之法 理解C#一小段程序

    一.前言 老师给出的要求: 阅读下面程序,请回答如下问题: 问题1:这个程序要找的是符合什么条件的数? 问题2:这样的数存在么?符合这一条件的最小的数是什么? 问题3:在电脑上运行这一程序,你估计多长 ...

  6. 一天一小段js代码(no.4)

    最近在看网上的前端笔试题,借鉴别人的自己来试一下: 题目: 写一段脚本,实现:当页面上任意一个链接被点击的时候,alert出这个链接在页面上的顺序号,如第一个链接则alert(1), 依次类推. 有一 ...

  7. img外头包着a时底部出现的一小段高度的解决方法。图片水平垂直居中用css解决的方法。

    <a><img/></a> 这种结构有时候在界面预览的时候会出现一段多出来的高度.这个高度,一开始我很奇怪是什么原因产生的.鼠标移动到a标签上会有高度出现,一开始我 ...

  8. <a>标签里面嵌图片<img>下面出现一小段空白的原因

    今天做项目的时候,发现在a标签,里面嵌入<img>会出现空白 css 内容: a{ border:1px solid black; } img{ width:200px; } html内容 ...

  9. 曹工说JDK源码(4)--抄了一小段ConcurrentHashMap的代码,我解决了部分场景下的Redis缓存雪崩问题

    曹工说JDK源码(1)--ConcurrentHashMap,扩容前大家同在一个哈希桶,为啥扩容后,你去新数组的高位,我只能去低位? 曹工说JDK源码(2)--ConcurrentHashMap的多线 ...

随机推荐

  1. RT-SA-2019-007 Code Execution via Insecure Shell Functiongetopt_simple

    Advisory: Code Execution via Insecure Shell Function getopt_simple RedTeam Pentesting discovered tha ...

  2. day 17 - 1 递归函数

    递归函数 什么是递归 了解什么是递归 : 在函数中调用自身函数 最大递归深度默认是 997/998 —— 是 python 从内存角度出发做得限制 能看懂递归 能知道递归的应用场景 初识递归 —— 二 ...

  3. pythonのdjango Session体验

    Session Django中默认支持Session,其内部提供了5种类型的Session供开发者使用: 数据库(默认)缓存文件缓存+数据库加密cookie1.数据库Session Django默认支 ...

  4. GNU MAKE参考文档

    1.GNU MAKE翻译 https://blog.csdn.net/xiejinfeng850414/article/details/8625468 2.Linux Makefile 生成 *.d ...

  5. vue.js过滤器

    import Vue from 'vue' import { ENV } from '@/config/conf' const dateFormat = (str) => { var date ...

  6. 18 常用模块 random shutil shevle logging sys.stdin/out/err

    random:随机数 (0, 1) 小数:random.random() ***[1, 10] 整数:random.randint(1, 10) *****[1, 10) 整数:random.rand ...

  7. MySQL/MariaDB数据类型

    1.为什么要定义MySQL数据类型 定义MySQL数据类型其实就是为了对数据进行分类,实现对不同的分类进行不同的处理 1.使系统能够根据数据类型来操作数据. 2.预防数据运算时出错.例如,通过强大的数 ...

  8. C# .Net List<T>中Remove()、RemoveAt()、RemoveRange()、RemoveAll()的区别,List<T>删除汇总

    在List<T>中删除主要有Remove().RemoveAt().RemoveRange().RemoveAll()这几个方法.下面一一介绍使用方法和注意点. 我们以List<st ...

  9. 移动 ProgramData\Package Cache 文件夹

    装完vs2017 发现C盘快木有空间了… 瞅瞅C盘下有啥能删的好释放下空间 就找到了 Package Cache 文件夹,占用空间接近15G… 查查这个文件夹还不建议删除… (http://super ...

  10. 提取C3D视频特征(官方文档&实践)

    C3D Introduction 卷积神经网络(CNN)近年被广泛应用于计算机视觉中,包括分类.检测.分割等任务.这些任务一般都是针对图像进行的,使用的是二维卷积(即卷积核的维度为二维).而基于视频的 ...