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