Xna 使用模型跨对象实例奇怪地复制ModelBones
这是我问的第一个问题,我会尽量保持简短和详细 基本上,我正在尝试创建一个随机的汽车模型的选择。我有5个模型的每一部分:底盘,发动机,扰流板和车轮。随机化器正在工作,模型正在加载。然而,在其他模型上绘制模型时存在一个问题。通常只有模型的一小部分在其他部分上绘制 这些模型在Maya(2013)中制作,导出为.FBX并加载到XNA中。我按照以下步骤导出:1。制作模型。 2.冻结模型每个部分的变换、中心枢轴点和删除历史记录。 3.适当地组合网格和名称 示例来可视化这一点。显然我不能发布图片,所以这里有一个Imgur链接 提前感谢你的帮助。这个问题不仅仅发生在这个例子中。我有每种类型的5个(车轮、发动机、底盘和扰流板),以及具有它们的任何型号的单独涡轮机实例,以及其他杂项。部分。从一个.FBX文件到另一个文件似乎完全是随机的。。。我无法确定这是Maya问题,还是XNA问题,或者两者的结合:( 相关代码。这是在一个汽车类中,我选择了相关的零件Xna 使用模型跨对象实例奇怪地复制ModelBones,xna,maya,Xna,Maya,这是我问的第一个问题,我会尽量保持简短和详细 基本上,我正在尝试创建一个随机的汽车模型的选择。我有5个模型的每一部分:底盘,发动机,扰流板和车轮。随机化器正在工作,模型正在加载。然而,在其他模型上绘制模型时存在一个问题。通常只有模型的一小部分在其他部分上绘制 这些模型在Maya(2013)中制作,导出为.FBX并加载到XNA中。我按照以下步骤导出:1。制作模型。 2.冻结模型每个部分的变换、中心枢轴点和删除历史记录。 3.适当地组合网格和名称 示例来可视化这一点。显然我不能发布图片,所以这里有一
namespace CGD_RRR_Flipbook
{
//This is a class for the physics, position, color and perhaps race position (i.e. rank) of a car
public class Car : PhysicsObject
{
public string partName;
public int partNumber = 1; //(Initialised for wheel rotation requirements)
public List<string> partList = new List<string>();
//Animation Mesh and Bones Setup
//Chassis
public ModelBone chassis_01 { get; set; }
public ModelBone chassis_02 { get; set; }
public ModelBone chassis_03 { get; set; }
public ModelBone chassis_04 { get; set; }
public ModelBone chassis_05 { get; set; }
//Chassis Turbines
public ModelBone chassis_01_Turbine { get; set; }
public Matrix chassis_01_TurbineTransform { get; set; }
public ModelBone chassis_02_Turbine { get; set; }
public Matrix chassis_02_TurbineTransform { get; set; }
public ModelBone chassis_05_Turbine_Right { get; set; }
public Matrix chassis_05_Turbine_RightTransform { get; set; }
public ModelBone chassis_05_Turbine_Left { get; set; }
public Matrix chassis_05_Turbine_LeftTransform { get; set; }
//Engine
public ModelBone engine01 { get; set; }
public Matrix engine01Transform { get; set; }
public Matrix[] boneTransforms { get; set; }
//Movable Mesh and Bones setup
public int partPosition = 1; //Sets x-position amount
public float wheelRotationValueBase { get; set; }
public float wheelRotationValueUpdate { get; set; }
public float engineRotationValueBase { get; set; }
public float engineRotationValueUpdate { get; set; }
public Car(
ParticleSystem exhaustSmokeParticles,
ParticleSystem exhaustFlameParticles,
ParticleSystem exhaustBoostParticles,
ParticleSystem carDustParticles,
ParticleSystem sandstormParticles,
ParticleSystem explosionParticles,
HUDController _hudController, PlayerIndex _playerIndex, Terrain _terrain, GraphicsDevice _device, Effect _effect, Random randomNumber,
Controls keyBindings, int _player, SoundController _soundcontroller, string fileName = "", ContentManager content = null)
: base(fileName, content)
{
//Load Model
chassis_01_Turbine = model.Bones["Chassis_01_Turbine"];
chassis_01_TurbineTransform = chassis_01_Turbine.Transform;
chassis_02_Turbine = model.Bones["Chassis_02_Turbine"];
chassis_02_TurbineTransform = chassis_02_Turbine.Transform;
chassis_05_Turbine_Left = model.Bones["Chassis_05_Turbine_Left"];
chassis_05_Turbine_LeftTransform = chassis_05_Turbine_Left.Transform;
chassis_05_Turbine_Right = model.Bones["Chassis_05_Turbine_Right"];
chassis_05_Turbine_RightTransform = chassis_05_Turbine_Right.Transform;
chassis_01 = model.Bones["Chassis_01"];
chassis_02 = model.Bones["Chassis_02"];
chassis_03 = model.Bones["Chassis_03"];
chassis_04 = model.Bones["Chassis_04"];
chassis_05 = model.Bones["Chassis_05"];
engine01 = model.Bones["Engine_01"];
engine01Transform = engine01.Transform;
绘图功能
public override void draw(Camera cam)
{
model.Root.Transform = worldMat; //sets model root transform to world
float wheelRotationValue = (wheelRotationValueBase + wheelRotationValueUpdate);
float engineRotationValue = (wheelRotationValueBase + wheelRotationValueUpdate);
//Chassis Engine Rotation Animation
Matrix engineRotation = Matrix.CreateRotationZ(engineRotationValue * 20);
chassis_01_Turbine.Transform = engineRotation * chassis_01_TurbineTransform;
chassis_02_Turbine.Transform = engineRotation * chassis_02_TurbineTransform;
chassis_05_Turbine_Left.Transform = engineRotation * chassis_05_Turbine_LeftTransform;
chassis_05_Turbine_Right.Transform = engineRotation * chassis_05_Turbine_RightTransform;
//Wheel Rotation Animation
//Matrix wheelRotation = Matrix.CreateRotationX(wheelRotationValue); //Create rotation Matrix
boneTransforms = new Matrix[model.Bones.Count]; //Creates array for holding modelBone transform matricies for use in draw method.
model.CopyAbsoluteBoneTransformsTo(boneTransforms); //Allocate trasform matricies
if (model != null)
{
foreach (ModelMesh mesh in model.Meshes)
{
//Draw parts assigned to car from partList.
foreach (string part in partList)
{
//Allows only the part in the list to be drawn, as opposed to all the possible parts.
if (mesh.Name == part)
{
effect.EnableDefaultLighting();
effect.PreferPerPixelLighting = true;
effect.World = boneTransforms[mesh.ParentBone.Index];// + worldMat;
effect.Projection = cam.projMat;
effect.View = cam.viewMat;
mesh.Draw();
}
}
}
}
}
}
随机化函数
//Car Randomiser Function. Looks for model bones allocated in FBX file.
public void carRandomiser()
{
//Delete contents of list.
partList.Clear();
//Spawn car engine
partNumber = rand.Next(0) + 1;
partName = ("Engine_0") + partNumber.ToString();
partList.Add(partName);
//Spawn car chassis
partNumber = rand.Next(5) + 1;
partName = ("Chassis_0") +partNumber.ToString();
partList.Add(partName);
//Spawn engine turbine for selected engine.
if (partName == ("Chassis_01"))
{
partList.Add("Chassis_01_Turbine");
}
if (partName == ("Chassis_02"))
{
partList.Add("Chassis_02_Turbine");
}
if (partName == ("Chassis_05"))
{
partList.Add("Chassis_05_Turbine_Left");
partList.Add("Chassis_05_Turbine_Right");
}
}
}
}如果随机底盘是chassis_03或chassis_04,会发生什么?它们应该会产生。随机发生器的引擎涡轮部分仅适用于那些有涡轮的。如果你明确使用手工挑选的零件组装汽车,会发生这种情况吗?是的。使用engine-01和chassis-01明确地复制了问题。问题是:当我在draw方法中显式地绘制模型时,它也会发生变化。
//Car Randomiser Function. Looks for model bones allocated in FBX file.
public void carRandomiser()
{
//Delete contents of list.
partList.Clear();
//Spawn car engine
partNumber = rand.Next(0) + 1;
partName = ("Engine_0") + partNumber.ToString();
partList.Add(partName);
//Spawn car chassis
partNumber = rand.Next(5) + 1;
partName = ("Chassis_0") +partNumber.ToString();
partList.Add(partName);
//Spawn engine turbine for selected engine.
if (partName == ("Chassis_01"))
{
partList.Add("Chassis_01_Turbine");
}
if (partName == ("Chassis_02"))
{
partList.Add("Chassis_02_Turbine");
}
if (partName == ("Chassis_05"))
{
partList.Add("Chassis_05_Turbine_Left");
partList.Add("Chassis_05_Turbine_Right");
}
}
}