游戏中的平截体相交测试

发表于:2014-12-11 10:13

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:李奥霍克    来源:51Testing软件测试网采编

分享:
  OBB多了一个四元数用来表示旋转,因为坐标轴不一样了,如何计算OBB了,让我们看下DX是怎么实现的
  DX是通过计算惯性张量来实现计算OBB的,由于本人物理实在拙计,不进行讲解,计算出惯性张量,然后用其特征向量作为轴,即可算出朝向
  计算OBB的方法有很多种,计算出最小的OBB包围盒算法是存在的,O(n^3),实现起来过于复杂
  1.DX是以所有点的中心点来作为参考点进行计算惯性张量的,惯性张量是个3*3的矩阵,好吧,想把大家都懂了,这玩意也就是个变换至O空间的旋转矩阵了,    然后将所有点变换至该空间下求最小点和最大点,想必大家都懂了~QAQ.计算惯性张量的办法参考维基
  有长方体,那么当然有包围圆,包围圆可以通过一种简便的方法做出,先计算AABB的,最小点和最大点,取其中心作为圆心,那些球径就是各点到球心的最大距离,接下来介绍我们的主角平截头体
  平截头体
  这玩意有以下几个属性,位置,朝向,四个方向的比列(tan值),近,远裁剪面如下图
  也就是定义了6个面,一般的,平截头体是有摄像机的投影矩阵出来的,那究竟是怎么计算的,假设在视角空间内,所有点的经过投影变换后进入NDC空间,即x,y,z都是[-1,1],也就是投影矩阵将平截体变换成了一个正方体,那么在NDC空间里面,平截头体对面的6个面就是这是这样的,PLANE = (normal,d)
  { 1.0f, 0.0f, 1.0f, 1.0f }, // right (at far plane)
  { -1.0f, 0.0f, 1.0f, 1.0f }, // left
  { 0.0f, 1.0f, 1.0f, 1.0f }, // top
  { 0.0f, -1.0f, 1.0f, 1.0f }, // bottom
  { 0.0f, 0.0f, 0.0f, 1.0f }, // near
  { 0.0f, 0.0f, 1.0f, 1.0f } // far,
  将六个平面通过逆变换便可得到视角空间下对应的值,也就是可以求出平截头体几个的属性了,几个三角函数就不详细讲解了,这取决于你具体是把那条边做参考边,DX中,左右是把X轴做参考变,上下是y轴,值得注意,求进和远需要除以W!
  一些基础的知识已经引入,就让我们开始正文
  平截头与包围球相交检测
  平截头体是由6个面构成的,所以,我们只需要分别于六个面检查即可,包围球有中心C和球径R,令某一平面方程为(N,D).令K = N*C+D 即球心到平面的距离,如果abs(K) <= R,那么一定相交,如果k < -R,那么在平面的后面(相对法线而言),如果K> R,那么在平面的前面[平面将空间分为两个两个空间],就是下图这三种情况了
  与AABB相交检测
  给定一个向量V = PQ,通过AABB的中心,并且与平面法线N同向,PQ可以通过以下代码求出
for(int j = 0; j < 3; ++j) {
// Make PQ point in the same direction as
// the plane normal on this axis.
if(planeNormal[j] >= 0.0f) {
P[j] = box.minPt[j];
Q[j] = box.maxPt[j];
} else {
P[j] = box.maxPt[j];
Q[j] = box.minPt[j];
}
}
  那么通过下图可以看出,1.如果P在平面的前面,那么Q肯定在,2.如果Q在后面,那么P也在,如果P后Q前,那么与平面相交
22/2<12
价值398元的测试课程免费赠送,填问卷领取吧!

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计

法律顾问:上海漕溪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2022
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号