Xna 使用模型跨对象实例奇怪地复制ModelBones

Xna 使用模型跨对象实例奇怪地复制ModelBones,xna,maya,Xna,Maya,这是我问的第一个问题,我会尽量保持简短和详细 基本上,我正在尝试创建一个随机的汽车模型的选择。我有5个模型的每一部分:底盘,发动机,扰流板和车轮。随机化器正在工作,模型正在加载。然而,在其他模型上绘制模型时存在一个问题。通常只有模型的一小部分在其他部分上绘制 这些模型在Maya(2013)中制作,导出为.FBX并加载到XNA中。我按照以下步骤导出:1。制作模型。 2.冻结模型每个部分的变换、中心枢轴点和删除历史记录。 3.适当地组合网格和名称 示例来可视化这一点。显然我不能发布图片,所以这里有一

这是我问的第一个问题,我会尽量保持简短和详细

基本上,我正在尝试创建一个随机的汽车模型的选择。我有5个模型的每一部分:底盘,发动机,扰流板和车轮。随机化器正在工作,模型正在加载。然而,在其他模型上绘制模型时存在一个问题。通常只有模型的一小部分在其他部分上绘制

这些模型在Maya(2013)中制作,导出为.FBX并加载到XNA中。我按照以下步骤导出:1。制作模型。 2.冻结模型每个部分的变换、中心枢轴点和删除历史记录。 3.适当地组合网格和名称

示例来可视化这一点。显然我不能发布图片,所以这里有一个Imgur链接

提前感谢你的帮助。这个问题不仅仅发生在这个例子中。我有每种类型的5个(车轮、发动机、底盘和扰流板),以及具有它们的任何型号的单独涡轮机实例,以及其他杂项。部分。从一个.FBX文件到另一个文件似乎完全是随机的。。。我无法确定这是Maya问题,还是XNA问题,或者两者的结合:(

相关代码。这是在一个汽车类中,我选择了相关的零件

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