-2

StackOverflowExceptionC# プログラムで を取得しています。

Cmodel.cs

public class CModel
{
    public Vector3 Position { get; set; }

    public Vector3 Rotation { get; set; }

    public Vector3 Scale { get; set; }

    public Model Model { get; private set; }

    public BoundingSphere BoundingSphere
    {
        get
        {
            // no need for rotation, as this is a sphere
            Matrix worldTransform = Matrix.CreateScale(Scale) *
            Matrix.CreateTranslation(Position); // THIS IS WHERE THE EXCEPTION OCCURS

            BoundingSphere transformed = BoundingSphere;
            transformed = transformed.Transform(worldTransform);

            return transformed;
        }
    }
    private Matrix[] modelTransforms;
    private GraphicsDevice graphicsDevice;
    private BoundingSphere boundingsphere;
    public CModel(Model Model, Vector3 Position, Vector3 Rotation,
    Vector3 Scale, GraphicsDevice graphicsDevice)
    {
    this.Model = Model;

    modelTransforms = new Matrix[Model.Bones.Count];
    Model.CopyAbsoluteBoneTransformsTo(modelTransforms);

    buildBoundingSphere();
    }


    public void Draw(Matrix View, Matrix Projection)
    {
        // Calculate the base transformation by combining
        // translation, rotation, and scaling
        Matrix baseWorld = Matrix.CreateScale(Scale)
        * Matrix.CreateFromYawPitchRoll(
        Rotation.Y, Rotation.X, Rotation.Z)
        * Matrix.CreateTranslation(Position);
        foreach (ModelMesh mesh in Model.Meshes)
        {
            Matrix localWorld = modelTransforms[mesh.ParentBone.Index]
            * baseWorld;
            foreach (ModelMeshPart meshPart in mesh.MeshParts)
            {
                BasicEffect effect = (BasicEffect)meshPart.Effect;
                effect.World = localWorld;
                effect.View = View;
                effect.Projection = Projection;
                effect.EnableDefaultLighting();
            }
            mesh.Draw();
        }
    }
        private void buildBoundingSphere()
        {
            BoundingSphere sphere = new BoundingSphere(Vector3.Zero, 0);

            // Merge all the model's built in bounding spheres
            foreach (ModelMesh mesh in Model.Meshes)
            {
                BoundingSphere transformed = mesh.BoundingSphere.Transform(
                    modelTransforms[mesh.ParentBone.Index]);

                sphere = BoundingSphere.CreateMerged(sphere, transformed);
            }

            this.boundingsphere = sphere;
        }
    }
}
4

4 に答える 4

4

ゲッターに再帰呼び出しがあり、それ自体を呼び出して次の原因になりますStackOverflowException

public BoundingSphere BoundingSphere
{
    get
    {
       ...
       BoundingSphere transformed = BoundingSphere;
       ...
    }
}

何を書くつもりだったのかは完全には明らかではありませんが、状態を保持したい場合は、代わりに境界球を格納するためのバッキング フィールドが必要になります。

于 2012-06-03T15:00:51.797 に答える
1

あなたの get メソッドはそれ自体を呼び出します: BoundingSpherecalls BoundingSphere

private BoundingSphere _boundingsphere = null;
public BoundingSphere BoundingSphere
{
    get
    {
        // no need for rotation, as this is a sphere
        **Matrix worldTransform = Matrix.CreateScale(Scale)
            * Matrix.CreateTranslation(Position);**

        BoundingSphere transformed = _boundingsphere;
        transformed = transformed.Transform(worldTransform);

        return transformed;
    }
    set
    {
        _boundingsphere = value;
    }
}

次のフォームを使用する場合:

public BoundingSphere BoundingSphere { get; set }

実際の値を格納する変数を指定する必要はありませんが、get または set を明示的に実装する場合は、追加の変数を宣言し、get および set の実装で使用する必要があります。

于 2012-06-03T15:05:10.487 に答える
-1

私はあなたが変える必要があると思います

get 
{ 
    ...
    BoundingSphere transformed = BoundingSphere; // public property
    ...
}

これに

get 
{ 
    ...
    BoundingSphere transformed = boundingsphere; // private variable
    ...
} 
于 2012-08-20T19:06:19.590 に答える
-1
  1. コール スタックまたは例外のスタック トレースを調べます。
  2. ループを識別します。
  3. ループを断ち切る方法を考えてください。
于 2012-06-03T15:03:35.433 に答える