2013-08-19 2 views
1

Если я это сделать:XNA - Копии Same модели источника

Model test1 = content.Load<Model>(@"Models/floorTile"); 
Model test2 = content.Load<Model>(@"Models/floorTile"); 
Model test3 = content.Load<Model>(@"Models/floorTile"); 

foreach (ModelMesh mesh in test1.Meshes) 
    foreach (Effect effect in mesh.Effects) 
     ((BasicEffect)effect).DiffuseColor = Color.Red.ToVector3(); 

все три модели будут назначены красный цвет, а не только test1.

Это упрощенная версия моей проблемы, в реальной версии, я использую фактический эффект HLSL, и хотя я знаю, как клонировать единственный эффект для работы с несколькими уникальными fbxs, я не уверен, как создать более одного экземпляра 3dmodel и присваивать каждому свою собственную текстуру, вместо того, чтобы ссылаться на одну текстуру/эффект, и поэтому каждый «floorTile» в моей сцене всегда будет выглядеть одинаково.

Единственное обходное решение, которое я могу придумать, - создать для каждой модели другую модель флеширования fbx, но у меня много плиток, так что это будет далеко не идеально.

ответ

0

Единственное решение, которое я могу придумать что-то вроде этого:

foreach (var mesh in Model.Meshes) 
{ 
    foreach (BasicEffect effect in mesh.Effects) 
    { 
     effect.EnableDefaultLighting(); 
     effect.TextureEnabled = true; 
     effect.Texture = modelTexture; 
     effect.Projection = Camera.Projection; 
     effect.View = Camera.View; 
     effect.World = AbsoluteBoneTransforms[mesh.ParentBone.Index] * FinalWorldTransforms; 
    } 
    mesh.Draw(); 
} 

Вы можете иметь более чем один Model (как Model1, model2 и Model3) и различных modelTexture применять на них.
Как вы можете видеть, это использует BasicEffect, я не знаю, может ли быть полезно, если вы используете HLSL.

+0

Спасибо, я думаю, что я вижу, что вы говорите, и это будет работать без BasicEffects. Правда, в каждом обратном вызове я могу поменять цвет и получить разные цвета для той же модели, , но если у меня есть 30 квадратов, и все это разные цвета, это означало бы, что мне пришлось бы менять текстуры в 30 раз каждый призыв к рисованию, даже если фактический цвет для квадрата никогда не меняет цвет. Я надеюсь, что есть еще лучший способ. – user1693188

+0

Надеюсь, но у меня не слишком много опыта работы с 3D и эффектами, которые помогут вам. – pinckerman

+0

Обмен текстурой менее важен, чем тот факт, что вы выполняете 30 обратных вызовов в одном кадре, когда вы можете их комбинировать. Тем не менее, для оптимизации вашей сцены требуется оптимизация. Без этой дополнительной оптимизации это решение является стандартным способом делать такие вещи: вы обычно не копируете всю модель, а просто рисуете * по-разному *. –