创建一个3D球体和3D盒子C ++

时间:2015-01-26 15:02:42

标签: c++ 3d

我需要实现一个工具来检测c ++中3D框和3D Sphere之间的交互。现在写,我找到了一种如何使用该代码检测交叉点的方法。

    inline float squared(float v) { return v * v; }  
    bool doesCubeIntersectSphere(vec3 C1, vec3 C2, vec3 S, float R)  
    {
         float dist_squared = R * R;
         /* assume C1 and C2 are element-wise sorted, if not, do that now */
         if (S.X < C1.X)          dist_squared -= squared(S.X - C1.X);
         else if (S.X > C2.X)         dist_squared -= squared(S.X - C2.X);

         if (S.Y < C1.Y)          dist_squared -= squared(S.Y - C1.Y);
         else if (S.Y > C2.Y)         dist_squared -= squared(S.Y - C2.Y);

         if (S.Z < C1.Z)          dist_squared -= squared(S.Z - C1.Z);
         else if (S.Z > C2.Z)         dist_squared -= squared(S.Z - C2.Z);

         return dist_squared > 0;  
    }

我需要的是使用原始矢量和半径和

创建3D球体的C ++代码示例

我需要使用原始矢量和半径以及通过其最大和最小角矢量的3D框创建3D球体。

1 个答案:

答案 0 :(得分:0)

我可能弄错了,但是(假设Axis-Aligned框): 从原点到角C1或C2的矢量长度应为半径r,右?

以下对我的推导的解释:从中心到所有角落距离相等的轴对齐框是一个完美的立方体。将这样的立方体平移到原点使得两个角恰好在从原点到点{x = 1,y = 1,z = 1}的线处。因此,这两个角将具有坐标{d,d,d}和{-d,-d,-d},其中d是&#34;距离&#34;沿轴X,Y,Z的角落。说第一个角落的距离是平方并添加向量的所有分量,并取平方根,例如:

| C1 | = | {d,d,d} ​​| = sqrt(d * d + d * d + d * d)= sqrt(3 * d * d)

因此解决:

r = sqrt(3 * d * d)

&LT; =&GT;

r * r = 3 * d * d

&LT; =&GT;

d = sqrt(r * r / 3)

&LT; =&GT;

d = r / sqrt(3)

这需要转换回球体的中心,因此:

C1 = {S.x + d,S.y + d,S.z + d}

C2 = {S.x-d,S.y-d,S.z-d}

你的解释有点模糊,所以我做了一些假设。也许我错了。无论如何,这里是一些未经测试的代码,显示我的意思:

void makeCube(vec3 S, float R, vec3* C1, vec3* C2)  
{
   static const float sqrt_one_third = sqrtf(1.0f/3.0f);
   float d = R * sqrt_one_third;
   C1->X = S.X + d; 
   C1->Y = S.Y + d; 
   C1->Z = S.Z + d;

   C2->X = S.X - d; 
   C2->Y = S.Y - d; 
   C2->Z = S.Z - d;
}