我需要实现一个工具来检测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球体。
答案 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;
}