用数学方法算基元碰撞检测 (4)

 

Point In Cylinder

Point  :   P

Cylinder:  |(P – O) - ((P – O) • N) * N | <= R

  0 <= (P – O)• N <= L

 

Structure: { V3d   O;

            float R;

            V3d  N;

            FloatL;  }

                  

           V = P – O;

           dp = V • N;

           if ( dp < 0 || dp > L )     return Outside;

 

           T = V –dp * N;

 

           if ( T^2 > R^2 )            return Outside;

 

           return Inside;

 

Point In Cone

Point  :   P

Cone   :   |(P – O) – ((P – O) • N) * N| <= ((P – O) • N) * R / L

  0 <= (P – O)• N <= L

 

   The Data Structure of Cone is same as Cylinder.

                        

           V = P – O;

           dp = V • N;

           if ( dp < 0 || dp > L )     return Outside;

 

           T = V –dp * N;

 

           r = dp * R / L

          

           if ( T^2 > r^2 )            return Outside;

 

           return Inside;

 

 

Sphere & Cylinder

Sphere :   | P – C | <= r

Cylinder:  |(P – O) - ((P – O) • N) * N | <= R

  0 <= (P – O)• N <= L

 

  OC = C – O;

           dp = OC • N

 

           if ( (dp > L + r) || (dp < -r) )      return No Intersection;

 

           T = OC - dp * N;

 if ( dp > L )

 {

f = sqrt( r^2 – (dp - L)^2 );

if ( T^2 > (R + f)^2 )             return No Intersection;

 

   return Intersectant;

 }

 else if ( dp >= 0 )

 {

if ( T^2 > (R + r)^2 )             return No Intersection;

 

   return Intersectant;

 }

 else

 {

f = sqrt( r^2 – dp^2 );

if ( T^2 > (R + f)^2 )             return No Intersection;

 

   return Intersectant;

 }

 

 

 

Line Segment & Cylinder

Line Seg:  P = P0 + t * V      t ∈ [0, 1]

Cylinder:  |(P – O) - ((P – O) • N) * N | <= R

  0 <= (P – O)• N <= L

 

 OP = P – O = P0 + t * V – O = (P0 – O) + t * V;

           dp = OP • N

           

           dp0 = (P0 – O)• N         t = 0

           if ( dp0 > L )     return No Intersection;

 

           dp1 = (P0 – O + V)• N     t = 1

           if ( dp1 < 0 )     return No Intersection;

 

|(P0 – O) + t * V – (((P0 – O) + t * V) • N) * N | <= R

|(P0 – O) + t * V – ((P0 – O) • N) * N – ((t * V) • N) * N | <= R

|(P0 – O) – ((P0 – O) • N) * N + t * V - t * (V • N) * N | <= R

|((P0 – O) – ((P0 – O) • N) * N) + t * (V - (V • N) * N) | <= R

 

F = (P0 – O) – ((P0 – O) • N) * N;

G = V - (V • N) * N;

 

G^2 * t^2 + 2 * (F • G) * t + F^2 – R^2 = 0;

A = G^2;

B = 2 * (F • G);

C = F^2 – R^2;

 

if ( A > 0 )   //V is not parallel to N

{

          Δ= B^2 – 4AC;

            if ( Δ < 0 )               return No Intersection;

 

          t = (-B ± sqrt(B^2 – 4AC)) / 2A;  

 

          t1 <= t2;

 

          if ( t2 < 0 || t1 > 1 )    return No Intersection;

 

          return Intersectant;

       }

 

if ( C <= 0 )                 return Intersectant;

 

return No Intersection;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值