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. 爬虫时遇到的' 编码错误gbk ' 的解决方案

    # 每次请求一次,然后写文件,这样可以规避多次请求触发反爬虫 r = requests.get('https://www.pearvideo.com/video_1522192') html = r. ...

  2. Linux内核 设备树操作常用API【转】

    转自:https://www.linuxidc.com/Linux/2017-02/140818.htm 一文中介绍了设备树的语法,这里主要介绍内核中提供的操作设备树的API,这些API通常都在&qu ...

  3. Task.Run与Task.Factory.StartNew的区别

    Task是可能有延迟的工作单元,目的是生成一个结果值,或产生想要的效果.任务和线程的区别是:任务代表需要执行的作业,而线程代表做这个作业的工作者. 在.Net 4中,Task.Factory.Star ...

  4. javascript 路径读取

    //获取当前文件全路径 <script language="javascript"> alert(window.location.href); alert(window ...

  5. LQFP(未整理完成)

    注意:文中所提供的链接有可能会失效.不定期维护,如有异常,期待指正,谢谢! LQFP48 7 x 7 mm 图片来源:https://www.st.com/resource/en/datasheet/ ...

  6. 修正锚点跳转位置 避免头部fixed固定部分遮挡

    如下锚点标签: <div id="id1"> <span class="kkAnchor"></span> 正文正文正文正文 ...

  7. mysql查看索引与锁

    http://www.cnblogs.com/cocos/archive/2011/05/06/2039428.html Mysql乐观锁与悲观锁 http://www.cnblogs.com/esi ...

  8. Java Spring Boot VS .NetCore (五)MyBatis vs EFCore

    Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...

  9. Kubernetes 学习1 k8s架构概述

    一.概述 1.意思:舵手,飞行员 2.特点 a.自动装箱,自我修复,水平扩展,服务发现和负载均衡,自动发布和回滚. b.密钥和配置管理,存储编排,批量处理执行. 二.架构术语 1.集群 master( ...

  10. LCA最近公共祖先

    不会 准备研究一波!!! #include<bits/stdc++.h> ; using namespace std; vector<int> g[maxn]; ][maxn] ...