我一直想知道如何在C#XNA中实现重力和碰撞。我一直试图让所有这些工作,但不能让它工作。现在解释一下到目前为止我所做的事情:
我已导入两个3D模型;即一个球和一个立方体。我把球放在立方体里面,想要将重力施加到球上并与之发生碰撞。这样它就会在立方体内部反弹。要绘制立方体和球,我有一个drawModel方法模式:
private void DrawModel(Model model, Vector3 position)
{
Matrix[] transform = new Matrix[model.Bones.Count];
float aspectRatio = graphics.GraphicsDevice.Viewport.AspectRatio;
model.CopyAbsoluteBoneTransformsTo(transform);
Matrix projection =
Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f),
aspectRatio, 1.0f, 10000.0f);
Matrix view = Matrix.CreateLookAt(new Vector3(0.0f, 0.0f, 800.0f),
Vector3.Zero, Vector3.Up);
foreach (ModelMesh mesh in model.Meshes)
{
foreach (BasicEffect effect in mesh.Effects)
{
effect.EnableDefaultLighting();
effect.View = view;
effect.Projection = projection;
effect.World = transform[mesh.ParentBone.Index] *
Matrix.CreateTranslation(position) *
Matrix.CreateRotationY(MathHelper.ToRadians(yaw)) *
Matrix.CreateRotationX(MathHelper.ToRadians(pitch));
}
mesh.Draw();
}
}
位置的我使用Vector3.Zero。
对于重力,我有这个:
modelVelocity += (gravity * elapsed) / friction;
ballPosition += modelVelocity * elapsed;
当程序运行且速度为Vector3.Down时,速度为随机数 摩擦是一个常数。哪种作品,但不是我真正想要它+我100%不理解它。我已经通过一些教程和论坛了解了这一点。
protected void Bounce()
{
if (ballPosition.X >= boxWidth || ballPosition.X <= -boxWidth)
modelVelocity.X *= -1;
if (ballPosition.Y >= boxHeight || ballPosition.Y <= -boxHeight)
modelVelocity.Y *= -1;
if (ballPosition.Z >= boxLength || ballPosition.Z <= -boxLength)
modelVelocity.Z *= -1;
碰撞是非常便宜的,因为它不是真正的碰撞。这就是我把它放在盒子里的方式
重力工作的方式就像我想要的那样。但是当它不再弹跳时,它会在盒子中出现故障而继续下降。另外,我有点想抛弃&#39;按空格键。
我的主要问题是如何在不使用我的方法的情况下在盒子内部进行碰撞以及如何正确地进行引力。但是如果有人在XNA中有关于3d的其他提示。我真的很感激,因为我对此很新。