Math 锥盒碰撞

Math 锥盒碰撞,math,geometry,collision-detection,Math,Geometry,Collision Detection,我想在一个圆锥体(底部是圆的,所以它基本上是球体的一部分)和一个长方体之间实现碰撞检测。我不太在意它是AABB还是OBB,因为转换应该足够简单。我找到的每个解都使用一个三角形圆锥体,但我的圆锥体更像是一个有角度和距离的“圆弧” 是否有一个简单的解决方案来执行此碰撞检测?或者这是一个进行多种测试的案例?比如说,在一个球体上得到交点,r是我的圆锥体距离,然后测试它们是否在某个角度内相交?我很好奇,并计划用GLSL数学风格做一些必要的事情。所以这里有一个不同的方法。让我们考虑一下锥的定义:< /P>

我想在一个圆锥体(底部是圆的,所以它基本上是球体的一部分)和一个长方体之间实现碰撞检测。我不太在意它是AABB还是OBB,因为转换应该足够简单。我找到的每个解都使用一个三角形圆锥体,但我的圆锥体更像是一个有角度和距离的“圆弧”


是否有一个简单的解决方案来执行此碰撞检测?或者这是一个进行多种测试的案例?比如说,在一个球体上得到交点,r是我的圆锥体距离,然后测试它们是否在某个角度内相交?

我很好奇,并计划用GLSL数学风格做一些必要的事情。所以这里有一个不同的方法。让我们考虑一下锥的定义:< /P>

  • 创建一组基本几何图元
  • 您需要支持点、线、三角形、凸三角网格、球面扇形(圆锥体)

  • 在点和三角形、网格、圆锥体之间进行内部测试
  • 对于
    三角形
    任何边和点边原点之间的交叉结果应指向三角形的同一侧(与法线相同)。若并没有,那个么这个点就在外面

    对于凸网格,点面原点和面法线指向之间的点积应为=0 浮动d=点(u,w); 浮点数e=点(v,w); 浮动D=a*c-b*b;//始终>=0 浮点数t0,t1; //计算两个最近点的直线参数 如果(Dc?d/b:e/c);//使用最大分母 } 否则{ t0=(b*e-c*d)/d; t1=(a*e-b*d)/d; } 如果(t01.0)t0=1.0; 如果(t11.0)t1=1.0; 返回线(l0.p0+(l0.dp*t0),l1.p0+(l1.dp*t1); } 最近的直线(直线l0,三角形t0) { 浮动t; p点; 线cl,ll; cl.l=1e300; t=dot(l0.p0-t0.p0,t0.n);p=l0.p0-t*t0.n;if((fabs(t)>1e-6)和&(in(p,t0)){ll=line(l0.p0,p.p0);if(cl.l>ll.l)cl=ll;} t=dot(l0.p1-t0.p0,t0.n);p=l0.p1-t*t0.n;if((fabs(t)>1e-6)和&(in(p,t0)){ll=line(l0.p1,p.p0);if(cl.l>ll.l)cl=ll;} ll=最近的(l0,直线(t0.p0,t0.p1));如果(cl.l>ll.l)cl=ll; ll=最近的(l0,直线(t0.p1,t0.p2));如果(cl.l>ll.l)cl=ll; ll=最近的(l0,直线(t0.p2,t0.p0));如果(cl.l>ll.l)cl=ll; 返回cl; } 最近的线(线l0,凸面网格m0) { int i; 线cl,ll; cl=直线(vec3(0.0,0.0,0.0),vec3(0.0,0.0,0.0));cl.l=1e300; 对于(i=0;ill.l)cl=ll; } 返回cl; } //--------------------------------------------------------------------------- 最近的直线(三角形t0,点p0){line cl;cl=最近的(p0,t0);cl.swap();返回cl;} 最近的直线(三角形t0,轴a0){line cl;cl=最近的(a0,t0);cl.swap();返回cl;} 直线最近(三角形t0,直线l0){line cl;cl=最近(l0,t0);cl.swap();返回cl;} 最近的直线(三角形t0、三角形t1) { 浮动t; p点; 线路l0、l1、l2、l3、l4、l5、cl、ll; l0=直线(t0.p0,t0.p1);l3=直线(t1.p0,t1.p1); l1=直线(t0.p1,t0.p2);l4=直线(t1.p1,t1.p2); l2=直线(t0.p2,t0.p0);l5=直线(t1.p2,t1.p0); cl.l=1e300; t=dot(t0.p0-t1.p0,t1.n);p=t0.p0-t*t1.n;if((fabs(t)>1e-6)和&(in(p,t1)){ll=line(t0.p0,p.p0);if(cl.l>ll.l)cl=ll;} t=dot(t0.p1-t1.p0,t1.n);p=t0.p1-t*t1.n;if((fabs(t)>1e-6)和&(in(p,t1)){ll=line(t0.p1,p.p0);if(cl.l>ll.l)cl=ll;} t=dot(t0.p2-t1.p0,t1.n);p=t0.p2-t*t1.n;if((fabs(t)>1e-6)和&(in(p,t1)){ll=line(t0.p2,p.p0);if(cl.l>ll.l)cl=ll;} t=dot(t1.p0-t0.p0,t0.n);p=t1.p0-t*t0.n;if((fabs(t)>1e-6)和&(in(p,t0)){ll=line(p.p0,t1.p0);if(cl.l>ll.l)cl=ll;} t=dot(t1.p1-t0.p0,t0.n);p=t1.p1-t*t0.n;if((fabs(t)>1e-6)和&(in(p,t0)){ll=line(p.p0,t1.p1);if(cl.l>ll.l)cl=ll;} t=dot(t1.p2-t0.p0,t0.n);p=t1.p2-t*t0.n;if((fabs(t)>1e-6)和&(in(p,t0)){ll=line(p.p0,t1.p2);if(cl.l>ll.l)cl=ll;} ll=最近的(l0,l3);如果(cl.l>ll.l)cl=ll; ll=最近的(l0,l4);如果(cl.l>ll.l)cl=ll; ll=最近的(l0,l5);如果(cl.l>ll.l)cl=ll; ll=最近的(l1,l3);如果(cl.l>ll.l)cl=ll; ll=最近的(l1,l4);如果(cl.l>ll.l)cl=ll; ll=最近的(l1,l5);如果(cl.l>ll.l)cl=ll; ll=最近的(l2,l3);如果(cl.l>ll.l)cl=ll; ll=最近的(l2,l4);如果(cl.l>ll.l)cl=ll; ll=最近的(l2,l5);如果(cl.l>ll.l)cl=ll; 返回cl; } 最近线(三角形t0,凸网格m0) { int i; 线cl,ll; cl=直线(vec3(0.0,0.0,0.0),vec3(0.0,0.0,0.0));cl.l=1e300; 对于(i=0;ill.l)cl=ll; } 返回cl; } //--------------------------------------------------------------------------- 直线最近(凸网格m0,点p0){line cl;cl=最近(p0,m0);cl.swap();返回cl;} 直线最近(凸网格m0,轴a0){line cl;cl=最近(a0,m0);cl.swap();返回cl;} 最近的线(凸网格m0,线l0){line cl;cl=最近的(l0,m0);cl.swap();返回cl;} 直线最近(凸网格m0,三角形t0){line cl;cl=最近(t0,m0);cl.swap();返回cl;} 最近线(凸网格m0,凸网格m1) { inti0,i1; 线cl,ll; cl=直线(vec3(0.0,0.0,0.0),vec3(0.0,0.0,0.0));cl.l=1e300; 对于(i0=0;i0=cos(s0.ang))//cap ll=直线(ll.p0,ll.p1+(ll.dp*s0.R/ll.l)); cl=ll; //圆锥体 w=标准化(s0.dp);u=vec3(1.0,0.0,0.0); 如果(fabs(dot(u,w))>0.75)u=vec3(0.0,1.0,0.0); v=交叉(u,w); u=交叉(v,w); u=标准化(u)*s0.r; v=标准化(v)*s0.r; da=2.0*M_PI/浮点数(N-1); cb=cos(s0.ang); sb=sin(s0.ang); 对于(a=0.0,i=0;ill.l)cl=ll; } 返回cl; } //--------------------------------------------------------------------------- 布尔相交(凸网格m0,球面扇形s0) { cl线; cl=最近的(m0,s0); 如果(cl.l=0 浮动b=点(u,v); 浮点c=点(v,v);//始终>=0 浮动d=点(u,w); 浮点数e=点(v,w); 浮点D=a*c-b*b;//始终>=0 浮点数t0,t1; 点3dp; Liner,rr; int f;//检查垂直于:1:l0,2:l1的距离 f=0;r.l=-1.0; //计算l
        `bool intersect(convex_mesh m0,spherical_sector s0);`