球体中的物体(边界球体),希望它限制球体内的运动

时间:2011-04-20 22:35:16

标签: c# visual-studio xna

那么我怎样才能限制我的物体在球体中的移动?我尝试使用边界框和交集方法,但它似乎不起作用?

编辑1:

这不是一个问题......我问的是:我有2个边界球体,一个大一个小,小的将在大内移动但我不想让它走出大边界球怎么办我做到了吗?

3 个答案:

答案 0 :(得分:1)

有一种更快的方法可以确保中心距离不超过半径差。它不需要每次都取平方根。

在设置或更改其中一个半径时预先计算max_distance_squared,并将其存储在可以重复使用的某个位置:

local max_distance = big.radius - small.radius
max_distance_squared = max_distance*max_distance    

现在你可以省略取平方根来获得距离:

local dx = big.center_x - small.center_x
local dy = big.center_y - small.center_y
if (dx*dx + dy*dy <= max_distance_squared)
  # great
else
  # explode

节省的时间可以稍微提高帧速率或模拟速度。

答案 1 :(得分:0)

小球体中心距大球体中心的距离不得超过(BigRadius - SmallRadius)。如果要计算接触的位置,可以通过接触所需的半径差与从起点到终点的半径总差的比例来缩放运动矢量(除非运动大到足以穿过由大边界球轴之一定义的平面

class Sphere {
    public Vector3 Pos;
    public double Radius;
}

void Test() 
{
    Sphere big = new Sphere() { Pos = new Vector3(0, 0, 0), Radius = 10.0 };
    Sphere small = new Sphere() { Pos = new Vector3(8, 0, 0), Radius = 1.0 };
    Vector3 move = new Vector3(0, 10, 0);

    // new position without check, if within sphere ok
    Vector3 newPos = small.Pos + move;
    if (Vector3.Distance(newPos, big.Pos) < big.Radius - small.Radius)
        return;

    // diff in radius to contact with outer shell
    double space = (big.Radius - small.Radius) - Vector3.Distance(small.Pos, big.Pos);

    // movement past moment of hitting outer shell
    double far = Vector3.Distance(newPos, big.Pos) - (big.Radius - small.Radius);

    // scale movement by ratio to get movement to hit shell
    move = move * (space / (space + far));
    newPos = small.Pos + move;
}

我认为这将起作用,除非机芯穿过由大球体的一个坐标定义并向外移动的平面。也许你可以为X,Y或Z的移动符号添加特殊检查.Pos - small.Pos(小球体中心与大球体中心的相对位置)X,Y或Z ...

答案 2 :(得分:0)

if (Vector3.Distance(bigSphere, smallSphere) < bigSphereradius - smallSphereradius) {
 // inside
}

或者使用BoundingSphere类:

http://msdn.microsoft.com/en-us/library/bb195373.aspx

PS。如果向量归一化,那么半径也必须是:)