public bool ColisionWithTerrain(ObjectShip ship) { if (IsOnHeightmap(ship.ModelMatrix.Translation)) { float height; Vector3 normal; GetHeightAndNormal(ship.ModelMatrix.Translation, out height, out normal); ship.Translate(new Vector3(ship.ModelMatrix.Translation.X, height, ship.ModelMatrix.Translation.Z)); ship.Update(); ship.UpVector = normal; ship.RightVector = Vector3.Cross(ship.ForwardVector, ship.UpVector); ship.RightVector = Vector3.Normalize(ship.RightVector); ship.ForwardVector = Vector3.Cross(ship.UpVector, ship.RightVector); ship.ForwardVector = Vector3.Normalize(ship.ForwardVector); return true; } return false; }
public TerrainScreen() { camera = new FirstPersonCamera(new Vector3(867, 198, -1215)); projectionMatrix = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, aspectRatio, 1, 10000); islandShader = new MultiTextured(); { islandShader.ProjectionMatrix = projectionMatrix; islandShader.ViewMatrix = camera.View; islandShader.InitParameters(); } mvpshader = new JustMvp(); { mvpshader.ProjectionMatrix = projectionMatrix; mvpshader.ViewMatrix = camera.View; mvpshader.InitParameters(); } shipShader = new BasicEffect(BaseClass.Device); { shipShader.Projection = projectionMatrix; shipShader.View = camera.View; } scatteringShader = new Scattaring(); { scatteringShader.ProjectionMatrix = projectionMatrix; scatteringShader.ViewMatrix = camera.View; scatteringShader.InitParameters(); } waterShader = new WaterShader(); { waterShader.ProjectionMatrix = projectionMatrix; waterShader.ViewMatrix = camera.View; waterShader.InitParameters(); } cloudShader = new CloudShader(); { cloudShader.ProjectionMatrix = projectionMatrix; cloudShader.ViewMatrix = camera.View; cloudShader.InitParameters(); } rainShader = new RainShader(); { rainShader.ProjectionMatrix = projectionMatrix; rainShader.ViewMatrix = camera.View; rainShader.InitParameters(); } rainDropsShader = new RainDropsShader(); { rainDropsShader.InitParameters(); } fogShader = new Pirates.Shaders.Fog(); { fogShader.InitParameters(); } rs = new RasterizerState(); rs.CullMode = CullMode.None; //rs.FillMode = FillMode.WireFrame; cloudManager = new CloudManager(); rainManager = new RainManager(); Vector3 minBox = new Vector3(-5000f, 300f, -5000f); Vector3 maxBox = new Vector3(5000f, 1500f, 5000f); int[] allCloudSprites = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; cloudManager.AddCloud(1000, minBox, maxBox, 0.75f, allCloudSprites); cloudManager.Instancer.Update(); minBox = new Vector3(-800, 320f, -800f); maxBox = new Vector3(800f, 0f, 800f); rainManager.AddDrop(250000, minBox, maxBox); cloudManager.Instancer.Update(); island = new Terrain("island4", 10, 1); water = new Terrain("map2", 30, 1); water.Translate(0, 40, 0); water.Update(); reflectionPlane = CreatePlane(40, new Vector3(0, -1, 0), true); reflectionMatrix = Matrix.CreateReflection(reflectionPlane); skydome = new ObjectSkydome(scatteringShader); skydome.Scale(3200); skydome.Rotate(-90, new Vector3(1, 0, 0)); skydome.Update(); Wind.Direction = MathFunctions.AngleToVector(45); //Wind.Force = 1000000f; ship = new ObjectShip(); ship.Translate(-288, 20, -486); ship.Update(); ship.Physics = new ObjectPhysics(50, ship.ModelMatrix); if (island.IsOnHeightmap(ship.ModelMatrix.Translation)) { ship.Physics.material = MaterialType.Island; island.ColisionWithTerrain(ship); } else { ship.Physics.material = MaterialType.Water; water.GetObjectPositionOnWater(ship, waterShader); } }