在3D模型的一个实例上更改纹理

时间:2013-11-03 18:55:06

标签: c# model 3d xna textures

我创建了一个代表房间的球形模型数组。

Model[] roomModel = new Model[21];

在我的LoadContent方法中:

for (int x = 0; x < 21; x++)
{
    roomModel[x] = Content.Load<Model>("Models\\sphere_model");
}

在我的Draw方法中:

for (int x = 0; x < 21; x++)
{
    //copy any parent transforms
    Matrix[] transforms = new Matrix[roomModel[x].Bones.Count];
    roomModel[x].CopyAbsoluteBoneTransformsTo(transforms);                

    //draw the model; a model can have multiple meshes, so loop.
    foreach (ModelMesh mesh in roomModel[x].Meshes)
    {
        //this is where the mesh orientation is set, as well as our camera and projection
        foreach (BasicEffect effect in mesh.Effects)
        {
            effect.EnableDefaultLighting();
            effect.World = transforms[mesh.ParentBone.Index] * Matrix.CreateRotationY(modelRotation) * Matrix.CreateTranslation(modelPosition[x]);
            effect.View = Matrix.CreateLookAt(cameraPosition, new Vector3(0.0f,-100.0f,0.0f), Vector3.Up);
            effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(42.0f), aspectRatio, 1.0f, 10000.0f);                                                
        }
        mesh.Draw();
    }
}

我只想更改我的一个球形模型上的纹理,比如roomModel [5]。当我使用此代码时,它会更改所有房间模型。

foreach (ModelMesh mesh in roomModel[5].Meshes)
{   
    foreach (BasicEffect effect in mesh.Effects)
    {
        effect.Texture = textureToSet;                    
    }
}  

如何让它改变其中一个roomModel的纹理而不是所有的?我能想到的就是为每个房间创建一个单独的模型,但这听起来很昂贵。

1 个答案:

答案 0 :(得分:1)

我认为这是由于Content Manager的行为:

  

ContentManager的每个实例只会加载任何给定的资源   一旦。第二次请求资源时,它将返回相同的内容   它上次返回的实例。

所以,当你设置

roomModel[x] = Content.Load<Model>("Models\\sphere_model");

你给每个模型提供相同的参考。

我认为这就是你最后一段代码改变所有模型的原因。