0

これを回避するために、衝突オブジェクトをチェックする関数を作成しようとしています

この関数は、オブジェクトが他のオブジェクトと交差するかどうかをチェックする必要があります:

 static bool CheckCollision(Int32 X, Int32 Y, Int32 Z, Int32 SizeX, Int32 SizeY, Int32 SizeZ)
    {
        bool ret = false;


        for (int i = 0; i < ObjList.Count ; i++ )
        {

            if (Z > ObjList[i].Z + ObjList[i].SizeZ || Z + SizeZ < ObjList[i].Z)
                Console.WriteLine("Z +-");
            else if (Y + SizeY < ObjList[i].Y || Y > ObjList[i].Y + ObjList[i].SizeY)
                Console.WriteLine("Y +-");
            else if (X + SizeX < ObjList[i].X || X > ObjList[i].X + ObjList[i].SizeX)
                Console.WriteLine("X +-");
            else
            {
                Console.WriteLine("||");
                ret = true;
                break;
            }


        }


     //   Console.Write("\n" + ret+"\n");


            return ret;
    }

ObjList - オブジェクト データのリスト:

    private struct S_ObjList
{
    public Int32 X;
    public Int32 Y;
    public Int32 Z;
    public Int32 SizeX;
    public Int32 SizeY;
    public Int32 SizeZ;
}

static List<S_ObjList> ObjList = new List<S_ObjList>();

http://pastebin.com/abDZLk9N - すべてのコード。

CheckCollisionが正しく機能しない。

例

この関数も機能しません (常に true を返します)

        static bool CheckCollision(Int32 X, Int32 Y, Int32 Z, Int32 SizeX, Int32 SizeY, Int32 SizeZ)
    {
        foreach (S_ObjList MyObject in ObjList)
        {

            if ((Z + SizeZ > MyObject.Z || Z < MyObject.Z + MyObject.SizeZ) && (X + SizeX > MyObject.X || X < MyObject.X + MyObject.SizeX) && (Y + SizeY > MyObject.Y || Y < MyObject.Y + MyObject.SizeY))
            {

                return true;

            }

        }
        return false;

    }
4

2 に答える 2

1

X, Y, Z座標を次のように変換できますVector3

[StructLayout(LayoutKind.Sequential, Pack = 1, Size = 12)]
public struct Vector3 : IFormattable
{
    /// <summary>
    /// The X coordinate.
    /// </summary>
    public float X;

    /// <summary>
    /// The Y coordinate.
    /// </summary>
    public float Y;

    /// <summary>
    /// The Z coordinate.
    /// </summary>
    public float Z;

    /// <summary>
    /// Initializes a new <see cref="Vector3"/> instance.
    /// </summary>
    /// <param name="x">The X coordinate.</param>
    /// <param name="y">The Y coordinate.</param>
    /// <param name="z">The Z coordinate.</param>
    public Vector3(float x, float y, float z)
    {
        X = x;
        Y = y;
        Z = z;
    }
}

次に、オブジェクトの中心を として、半径を としてBoundingBox含む、オブジェクトごとにいわゆる (または基本的にその周りの円) を作成します。Vectorfloat

/// <summary>
/// 
/// </summary>
public class SphericalObstacle
{
    private readonly float _radius;
    private readonly Vector3 _center;
    private readonly ulong _vehicleId;

    /// <summary>
    /// Initializes a new instance of the <see cref="SphericalObstacle"/> class.
    /// </summary>
    /// <param name="center">The center.</param>
    /// <param name="radius">The radius.</param>
    /// <param name="parentVehicleId">The parent vehicle id.</param>
    public SphericalObstacle(Vector3 center, float radius, ulong parentVehicleId)
    {
        _radius = radius;
        _center = center;
        _vehicleId = parentVehicleId;
    }

    /// <summary>Gets the vehicle id.</summary>
    public ulong VehicleId { get { return _vehicleId; } }

    /// <summary>Gets the radius.</summary>
    public float Radius { get { return _radius; } }

    /// <summary>Gets the center.</summary>
    public Vector3 Center { get { return _center; } }

    /// <summary>
    /// Checks for sphere collision.
    /// </summary>
    /// <param name="obstacle">The obstacle.</param>
    /// <param name="tolerance">The tolerance.</param>
    /// <returns>
    ///   <c>true</c> if it collides, <c>false</c> otherwise.
    /// </returns>
    public bool CollidesWith(SphericalObstacle obstacle, double tolerance = 0.0d)
    {
        Vector3 difference = Center - obstacle.Center;
        double distance =
            System.Math.Sqrt(System.Math.Pow(difference.X, 2) + System.Math.Pow(difference.Y, 2) + System.Math.Pow(difference.Z, 2));

        double sumRadius = Radius + obstacle.Radius;
        return distance < (sumRadius + tolerance);
    }

    public override string ToString()
    {
        return string.Format("Radius: {0}, Center: {1}", _radius, _center);
    }
}

衝突をチェックしているすべてのオブジェクトに対してこれを行う場合、本質的には、それらの周りに描いた円が互いに衝突するかどうかをチェックしているだけです。

あなたの写真からは、球が必要なのか境界ボックスが必要なのかを完全に判断できませんでしたが、境界ボックスが必要な場合は、わずかに異なる数学で同じ概念をほぼ適用できます。ところで、GameDev.net は、このようなものの良い情報源です。

于 2013-07-16T12:43:06.443 に答える
0

http://pastebin.com/abDZLk9N - 作業コード:)コードの数行のみを変更しました

于 2013-07-16T12:58:29.120 に答える