Unity Raycast问题

时间:2014-04-09 19:46:26

标签: c# unity3d

我试图制作一个圆圈(带有动态位置)和另一个不应该通过第一个圆圈的圆圈 - 如下图所示

我这样做的原因是因为大的那个对象可能会有很多其他对象。

circle image

但问题是Physics.Raycast并不总能检测到我的球体:

broken circle image

蓝线是光线投射

基本上我所做的是通过整个大圆圈进行光线投射,并找出较小的圆圈。

这是我检测大圆上物体的代码:

void GetCollisions () {
    Angle FixedRenderAngle, k;
    RaycastHit hit;
    Vector3 p1, p2;
    float d, d1, radius;

    for ( int i = 0; i < Radiuses.Count; i++ ) {
        if ( Angles[i] == null )
            Angles[i] = new List<Angle>();

        radius = Radiuses[i];
        FixedRenderAngle = 360f / (float)NumberOfCalls;
        AnglesLast[i] = 0;
        Angle j = 0f, pj;
        bool exception = false;

        for ( int l = 0; l < NumberOfCalls; l++) {
            j+= FixedRenderAngle;
            pj = j - FixedRenderAngle;
            p1 = pj.PointByRadius ( radius );
            p2 = j.PointByRadius ( radius );
            Debug.DrawRay ( p1, p2 - p1, Color.cyan, 3f );
            if ( Physics.Raycast ( p1, p2 - p1, out hit, Vector3.Distance ( p1, p2 ) ) ) {
                d = Vector3.Distance ( p1, p2 );
                d1 = Vector3.Distance ( p1,hit.point );
                k =  pj + (j -pj) * (d1/d); 

                AddToAngles ( ref k, i );
            }

            if ( Physics.Raycast ( p2, p1 - p2, out hit, Vector3.Distance ( p1, p2 ) ) ) {
                if ( AnglesLast[i] == 0 ) exception = true;

                d = Vector3.Distance ( p1, p2 );
                d1 = Vector3.Distance ( p1,hit.point );
                k =  pj + (j -pj) * (d1/d); 

                AddToAngles ( ref k, i );
            }
        }

        if ( exception == true ) {
            Angle tmp = Angles[i][AnglesLast[i] - 1];
            for ( int l = AnglesLast[i] - 1; l > 0 ; l-- )
                Angles[i][l] = Angles[i][l-1];
            Angles[i][0] = tmp;
        }
    }
}

Angle是一个浮点数表示度数(0到360)的类,它的函数PointByRadius返回一个Vector3,表示基于角度和给定半径应该在圆上的位置。< / p>

我做错了什么或者有些事我不了解光线投射?任何帮助,将不胜感激。 (当然,任何其他方法都有帮助)

1 个答案:

答案 0 :(得分:0)

Physics.SphereCast?它有点像OverlapSphere,但可能更多你需要的东西? (虽然很难确切地说出你想要做什么......例如,当你说圈子时,你的意思是实际的圆圈只在XY上移动或者它们在Z中移动吗?你在尝试哪个圆圈隐藏大小的东西?你试图在视觉上隐藏一个较大的圆圈吗?)

根据物体移动和尺寸的速度,光线投射(和一般的PhysX碰撞器)可能会变得不稳定,至少在我的经验中。您也可以尝试弄乱您的物理时间步长,看看问题的部分原因,比如更频繁地进行,看看您是否仍然遇到问题行为。不确定,只是抛出想法。