C# 如何找到网格的中心?

C# 如何找到网格的中心?,c#,xna,mesh,C#,Xna,Mesh,这是一种找到汽车中心位置的方法吗?我必须手动将车轮移动到汽车中心,旋转车轮并将其向后平移 tireMatrix = Matrix.CreateTranslation(2.6f, -4.5f, 1.75f) * Matrix.CreateRotationX(pitch) * Matrix.CreateRotationZ(roll) *

这是一种找到汽车中心位置的方法吗?我必须手动将车轮移动到汽车中心,旋转车轮并将其向后平移

tireMatrix = Matrix.CreateTranslation(2.6f, -4.5f, 1.75f) *
                             Matrix.CreateRotationX(pitch) *
                             Matrix.CreateRotationZ(roll) *
                             Matrix.CreateTranslation(-2.7f, -4.7f, -1.75f);

手动移动确实有效,但我找不到汽车的确切中心,一定有更好的方法。所有汽车零件都在同一个FBX文件中

我认为它可以工作,但我没有测试它

matrix.X = box.Min.X+(box.Max.X-box.Min.X)/2;
matrix.Y = box.Min.Y+(box.Max.Y-box.Min.Y)/2;
matrix.Z = box.Min.Z+(box.Max.Z-box.Min.Z)/2;

要创建
边界框
,可以使用

更不用说弄清楚了。我必须使用ModelBone将车轮存储为汽车的骨骼,存储车轮的初始变换,我可以在车轮上执行旋转,而无需在任何地方平移它们。 为了将来的参考,或者如果有人想做类似的事情,下面是代码

    Model carModel;
        Matrix carWorldMatrix;

        ModelBone fr_wheel;
        ModelBone fl_wheel;
        ModelBone bl_wheel;
        ModelBone br_wheel;
        //Matrices for storing the initial transform of each wheel 
        Matrix fr_transform;
        Matrix fl_transform;
        Matrix br_transform;
        Matrix bl_transform;

        Matrix[] transforms;

        float wheelRotation;
        float wheelSteerAngle;
        float carRotation;

public void Load(ContentManager content)
{
      carModel = content.Load<Model>("car");

      fr_wheel = carModel.Bones["fr_tire"];
      fl_wheel = carModel.Bones["fl_tire"];
      bl_wheel = carModel.Bones["bl_tire"];
      br_wheel = carModel.Bones["br_tire"];

      fr_transform = fr_wheel.Transform;
      fl_transform = fl_wheel.Transform;
      br_transform = br_wheel.Transform;
      bl_transform = bl_wheel.Transform;

      transforms = new Matrix[carModel.Bones.Count];
}

public void Update(GameTime gameTime)
{
     carModel.Root.Transform = carWorldMatrix;

     Matrix tireRotation = Matrix.CreateRotationX(wheelRotation) *
                           Matrix.CreateRotationY(wheelSteerAngle);

     fr_wheel.Transform = tireRotation * fr_transform;//this will apply the rotation to the     front right wheel

}

public void Draw(ref Camera camera)
{
     carModel.CopyAbsoluteBoneTransformsTo(transforms);

     foreach (ModelMesh mesh in carModel.Meshes)
     {
         foreach (BasicEffect effect in mesh.Effects)
         {
             effect.EnableDefaultLighting();
             effect.World = transforms[mesh.ParentBone.Index];
             effect.View = camera.viewMatrix;
             effect.Projection = camera.projectionMatrix;
         }
         mesh.Draw()
     }
}
模型carModel;
矩阵carworld矩阵;
模型骨fr_轮;
模型骨飞轮;
模型骨bl_轮;
模型骨br_轮;
//用于存储每个车轮的初始变换的矩阵
矩阵fr_变换;
矩阵fl_变换;
矩阵br_变换;
矩阵bl_变换;
矩阵[]变换;
浮轮旋转;
浮轮转向角;
漂浮胡萝卜化;
公共无效加载(ContentManager内容)
{
carModel=内容加载(“car”);
fr_车轮=carModel.Bones[“fr_轮胎”];
fl_车轮=carModel.Bones[“fl_轮胎”];
bl_车轮=carModel.Bones[“bl_轮胎”];
br_wheel=carModel.Bones[“br_tire”];
fr_transform=fr_wheel.transform;
fl_transform=fl_wheel.transform;
br_transform=br_wheel.transform;
bl_transform=bl_wheel.transform;
变换=新矩阵[carModel.Bones.Count];
}
公开作废更新(游戏时间游戏时间)
{
carModel.Root.Transform=carWorldMatrix;
矩阵旋转=矩阵.CreateRotationX(车轮旋转)*
矩阵.CreateRotationY(车轮转向角);
fr_wheel.Transform=Tirrotation*fr_Transform;//这将对右前轮应用旋转
}
公共空白绘制(参考摄影机)
{
carModel.CopyAbsoluteBonetTransformsTo(转换);
foreach(carModel.mesh中的ModelMesh网格)
{
foreach(网格中的基本效果。效果)
{
effect.EnableDefaultLighting();
effect.World=变换[mesh.ParentBone.Index];
effect.View=camera.viewMatrix;
effect.Projection=camera.projectionMatrix;
}
mesh.Draw()
}
}
我不知道“精确”,但你可以在汽车周围放置一个边框,然后找到矩形的中心