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

Sphere & AABB

Sphere:   | P – C | <= R

AABB :A  { V3d inf, sup;}

 

           //摘自Real Time Rendering

 

           d = 0;

           for each i [x, y, z]

            {

               if ( C.i < A.inf.i )

              {

              d += (C.i –A.inf.i)^2;
              }

              else

              if ( C.i > A.sup.i )

              {

              d += (C.i –A.sup.i)^2;
               }

           }

 

 if ( d > R^2 )return No Intersection;

 

           return Intersectant;

 

 

Sphere & OBB

Sphere:   | P – Q | <= R

OBB :     {  V3d C, U, V, W;

  V3d L; }      //C是中心点坐标,U、V、W是三个轴方向,L的三个分量是U、V、W是三个方向的半长,表示Box长宽高各一半大小

 

Method(1)

             做空间变换,使得变成Sphere & AABB的相交判断,这种做法是Real Time Rendering上写的

 

Method(2)

             S = Q – C;

             x = S • U;

             y = S • V;

             z = S • W;

 

      d = 0;

       for each i [x, y, z]

{

          if ( i < -L.i )

{

              d += (i + L.i)^2;

}

           else

          if (i > L.i )

{

              d += (i –L.i)^2;

}

}

 

      if ( d > R^2 )return No Intersection;

 

       return Intersectant;

 

Ellipsoid & AABB

Ellipsoid:    (x - x0)^2 / a^2 + (y - y0)^2 / b^2 + (z - z0)^2 / c^2 <= 1       (a>0, b>0, c>0)

AABB   :  A  { V3d inf, sup;}

 

Method(1)

                    做空间变换,将Ellipsoid变换成Sphere,然后做Sphere & AABB的相交判断

 

Method(2)

                    P0 = { x0, y0, z0 };

           d = 0;

           for each i [x, y, z], j ∈ [a, b, c]

           {

              if ( P0.i < A.inf.i )

               {

              d += (P0.i –A.inf.i)^2 / j^2;
              }

               else

              if ( P0.i > A.sup.i )

              {

              d += (P0.i –A.sup.i)^2 / j^2;
              }

            }

 

 if ( d > 1 )  return No Intersection;

 

           return Intersectant;

 

Ellipsoid& OBB

Ellipsoid:    (x - x0)^2 / a^2 + (y - y0)^2 / b^2 + (z - z0)^2 / c^2 <= 1       (a>0, b>0, c>0)

OBB   :  {  V3d C, U, V, W;

  V3d L; }

 

Method(1)

                    做空间变换,将Ellipsoid变换成Sphere,然后做Sphere & OBB 的相交判断

 

Method(2)

                    做空间变换,将OBB变换成AABB,然后做Ellipsoid & AABB的相交判断

 

Method(3)

                    做两次空间变换,将Ellipsoid变换成Sphere,OBB变换成AABB,然后做Sphere & AABB的相交判断

 

Method(4)

             P0 = { x0, y0, z0 };

             S = P0 – C;

             x = S • U;

             y = S • V;

             z = S • W;

 

       d = 0;

       for each i [x, y, z], j ∈ [a, b, c]

{

          if ( i < -L.i )

{

              d += (i + L.i)^2 / j^2;

}

          else

          if ( i > L.i )

{

              d += (i –L.i)^2 / j^2;

}

}

 

       if ( d > 1 )  return No Intersection;

 

return Intersectant;

 

 

Line Segment & Sphere, Optimized

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

Sphere :  | P – C | <= R

 

//摘自Real Time Rendering

          L = C – P0;

s = V • L / |V|;

l2 = L^2;

if ( s < 0 && l2 > r^2 )   return No Intersection;

 

m2 = l2 – s^2;

if ( m2 > r^2 )           return No Intersection;

 

returnIntersectant;

//q = sqrt(r^2 – m^2);

//if ( l^2 > r^2 ) t = (s – q) / |V|;

//elset = (s + q) / |V|

           



在计机视觉领域,基元(Primitives)通常指的是图像中的基本形状或特征,例如边缘、角点、线条等。OpenCV(Open Source Computer Vision Library)是一个开源的计机视觉和机器学习软件库,它提供了大量的法和函数来处理图像和视频数据。使用OpenCV进行基元检测,可以借助库中提供的各种检测器和滤波器来实现。 下面是一些常用的基元检测方法和它们在OpenCV中的使用: 1. 边缘检测:边缘是图像中亮度变化最明显的地方,常用的方法有Canny边缘检测器。在OpenCV中,可以使用`cv2.Canny()`函数实现。 2. 角点检测:角点是指两条边缘相遇形成的点,具有较强的特征信息。OpenCV提供了如Harris角点检测器(`cv2.cornerHarris()`)和Shi-Tomasi角点检测器(`cv2.goodFeaturesToTrack()`)。 3. 线条检测:线条检测可以使用霍夫变换(Hough Transform)。在OpenCV中,可以使用`cv2.HoughLines()`和`cv2.HoughLinesP()`函数分别检测直线和线段。 4. 圆检测:圆的检测可以使用霍夫变换的圆检测版本,通过`cv2.HoughCircles()`函数实现。 以下是一个使用OpenCV进行边缘检测的简单示例代码: ```python import cv2 import numpy as np # 读取图像 image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE) # 使用高斯模糊滤波降噪 blurred = cv2.GaussianBlur(image, (5,5), 0) # 应用Canny边缘检测 edges = cv2.Canny(blurred, 50, 150) # 显示原图和边缘检测后的图像 cv2.imshow('Original Image', image) cv2.imshow('Canny Edges', edges) cv2.waitKey(0) cv2.destroyAllWindows() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值