Skip to main content

Oyun programlamak için modelin daha basit gösterimlerini kullanmak oldukça faydalıdır. Çünkü oyunlarda kullanılan modeller genellikle çok karmaşıktır ve bu yüzden doğrudan model üzerlerinde yapılan hesaplamalar çok işlem gerektirir. Bu sorunu aşmak için kullanılan modellerin yapılacak işlemlere göre temsili gösterimleri oluşturulur. Model üzerinde daha hızlı ve basit hesaplamalar yapabilmek için basit olarak modeli sınırlandıran küreleri (bounding sphere) hesaplayacağız. Bu hesaplama işlemini yazmış olduğumuz CModel sınıfı içerisinde yaparak, her modelin kendi küresini hesaplamasını sağlayacağız. Modele öncelikle XNA Framework içinde tanımlı BoundingSphere sınıfını kullanarak başlayalım.

private Matrix[] modelTransforms;
private GraphicsDevice graphicsDevice;
private BoundingSphere boundingSphere;

Daha sonra modelin geometrisine bağlı olarak modeli sınırlandıran küreyi hesaplayan bir method oluşturalım.

private void buildBoundingSphere()
{
    BoundingSphere sphere = new BoundingSphere(Vector3.Zero, 0);
    // Model içinde bulunan bütün küreleri birleştir
    foreach (ModelMesh mesh in Model.Meshes)
    {
        BoundingSphere transformed = mesh.BoundingSphere.Transform(modelTransforms[mesh.ParentBone.Index]);
        sphere = BoundingSphere.CreateMerged(sphere, transformed);
    }
    this.boundingSphere = sphere;
}

 ve son olarak CModel sınıfının yapıcı methodunda eklediğimiz methodu çağıralım.

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();

    this.Position = Position;
    this.Rotation = Rotation;
    this.Scale = Scale;
    this.graphicsDevice = graphicsDevice;
}

Bu hesaplamalara göre oluşturulan küre orijine odaklanmaktadır fakat modelimizi hareket ettirirsek, çevreleyen küresi onunla birlikte gelmemektedir. Bu sorunu aşmak için modele public bir özellik ekleyerek kürenin modelin merkezine ve ölçeğine uygun hale getiren şekilde yazalım.

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;
    }
}