public TankClass(GraphicsDevice device, ContentManager content, ClsBattlefield terreno) { modelTank = content.Load <Model>("tank"); world = terreno.matrixTerreno; effect = new BasicEffect(device); view = Matrix.CreateLookAt(new Vector3(1.0f, 2.0f, 2.0f), Vector3.Zero, Vector3.Up); float aspectRatio = (float)device.Viewport.Width / device.Viewport.Height; projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f), aspectRatio, 2.0f, 1000.0f); turretBone = modelTank.Bones["turret_geo"]; canonBone = modelTank.Bones["canon_geo"]; rEngineBone = modelTank.Bones["r_engine_geo"]; lEngineBone = modelTank.Bones["l_engine_geo"]; rBackWheelBone = modelTank.Bones["r_back_wheel_geo"]; lBackWheelBone = modelTank.Bones["l_back_wheel_geo"]; rSteerBone = modelTank.Bones["r_steer_geo"]; lSteerBone = modelTank.Bones["l_steer_geo"]; rFrontWheelBone = modelTank.Bones["r_front_wheel_geo"]; lFrontWheelBone = modelTank.Bones["l_front_wheel_geo"]; hatchBone = modelTank.Bones["hatch_geo"]; turretTransform = turretBone.Transform; canonTransform = canonBone.Transform; rEngineTransform = rEngineBone.Transform; lEngineTransform = lEngineBone.Transform; rBackWheelTranform = rBackWheelBone.Transform; lBackWheelTransform = rBackWheelBone.Transform; rSteerTransform = rSteerBone.Transform; lSteerTransform = lSteerBone.Transform; rFrontWheelTransform = rFrontWheelBone.Transform; lFrontWheelTransform = lFrontWheelBone.Transform; hatchTransform = hatchBone.Transform; boneTransforms = new Matrix[modelTank.Bones.Count]; directionTank = Vector3.UnitX; //Inicialização do tanque PositionTank = new Vector3(64.0f, terreno.Interpolacao(PositionTank.X, PositionTank.Z), 64.0f); NormalTank = terreno.GetNormals((int)PositionTank.X, (int)PositionTank.Z); DirectionTank = Vector3.UnitX; SpeedTank = 0.5f; }
public void Draw(Matrix camview, ClsBattlefield terreno) { Matrix translation = Matrix.CreateTranslation(positionTank.X, terreno.Interpolacao(positionTank.X, positionTank.Z), positionTank.Z); Matrix rotation = Matrix.CreateRotationY(yaw); normalTank = terreno.GetNormals((int)positionTank.X, (int)positionTank.Z); //Matrix rotation = Matrix.Identity; rotation.Up = normalTank; rotation.Forward = directionTank; rotation.Right = Vector3.Cross(normalTank, directionTank); world = rotation * translation; modelTank.Root.Transform = Matrix.CreateScale(0.005f) * world; turretBone.Transform = Matrix.CreateRotationY(turretAngle) * turretTransform; canonBone.Transform = Matrix.CreateRotationX(canonAngle) * canonTransform; //lEngineBone.Transform = Matrix.CreateTranslation(positionTank) * lEngineTransform; //rEngineBone.Transform = Matrix.CreateTranslation(positionTank) * rEngineTransform; //hatchBone.Transform = Matrix.CreateTranslation() * hatchTransform; modelTank.CopyAbsoluteBoneTransformsTo(boneTransforms); foreach (ModelMesh mesh in modelTank.Meshes) { foreach (BasicEffect effect in mesh.Effects) { effect.World = boneTransforms[mesh.ParentBone.Index]; effect.View = camview; effect.Projection = projection; effect.EnableDefaultLighting(); } // Draw each mesh of the model mesh.Draw(); } }