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()
}
}
我不知道“精确”,但你可以在汽车周围放置一个边框,然后找到矩形的中心