I am sure I gave an example of Terrain collision with my class, if not then I apologies.
Here is an example of terrain collision, I wrote a demo to show a friend how I was doing animation in my engine, here is the code I used
namespace DemoAnimation
{
class DemoAnimation
{
static RCGame game = new RCGame();
static RCModel tiny = new RCModel("Content/Models/tiny", "Tiny");
public static void Main()
{
if (game.ValidateGraphicsCard())
{
game.Input.OnUpdate += new UpdateMethod(KeyboardControls);
game.Input.OnUpdate += new UpdateMethod(CameraControls);
game.OnEngineDraw += new EngineDrawEvent(Draw);
SetupScene();
game.Run();
}
}
private static void SetupScene()
{
RCShaderManager.AddShader(new RCShader(@"Content/Shaders/Ocean"), "WAT");
RCShaderManager.AddShader(new RCShader(@"Content/Shaders/TerrainTextured"), "TTT");
RCShaderManager.AddShader(new RCShader(@"Content/Shaders/TransformTexture"), "TT");
RCShaderManager.AddShader(new RCShader(@"Content/Shaders/BoneAnimationTransform"), "ANIM");
Vector3 LightPosition = new Vector3(0, 10, 5);
RCSkyBox sb = new RCSkyBox(new string[] { "Content/Textures/SkyBox/HazyMind/top",
"Content/Textures/SkyBox/HazyMind/bottom",
"Content/Textures/SkyBox/HazyMind/left",
"Content/Textures/SkyBox/HazyMind/right",
"Content/Textures/SkyBox/HazyMind/front",
"Content/Textures/SkyBox/HazyMind/back" }, "sb");
sb.SetShader("TT");
game.Scene.AddObject(sb, "sb");
string[] textures = new string[] { "Content/Textures/Terrain/sand", "Content/Textures/Terrain/grass", "Content/Textures/Terrain/rock", "Content/Textures/Terrain/snow" };
RCTerrain terrain = new RCTerrain(textures, "Content/Textures/Terrain/TheValley", "Terrain");
terrain.SetShader("TTT");
terrain.LightPosition = LightPosition;
terrain.Position = new Vector3(0, -30, 0);
game.Scene.AddObject(terrain, "terrain");
RCWater water = new RCWater("Content/Textures/SkyBox/HazyMind/cubeMap", "Content/Textures/Terrain/waves2", "water");
water.SetShader("WAT");
water.Width = 256;
water.Height = 256;
water.WaveFrequency = .2f;
water.WaveAmplitude = .1f;
water.DeepWaterColor = Color.Navy.ToVector4();
water.ShallowWaterColor = Color.DarkSeaGreen.ToVector4();
water.ReflectionColor = Color.DarkGray.ToVector4();
water.ReflectionAmount = 0.7f;
water.Position = new Vector3(0, -26, 0);
water.AnimationSpeed = .05f;
game.Scene.AddObject(water, "water");
tiny.SetShader("ANIM");
tiny.Scaling = new Vector3(.025f, .025f, .025f);
tiny.Position = new Vector3(0, 0, -128f);
tiny.Rotate(new Vector3(0, 1, 0), MathHelper.Pi);
game.Scene.AddObject(tiny, "Tiny");
RCHelper.Fog.FogColor = Color.WhiteSmoke;
RCHelper.Fog.FogEnable = false;
RCHelper.Fog.FogStart = .95f;
RCHelper.Fog.FogEnd = .999f;
RCHelper.Fog.FogTableMode = FogMode.Linear;
}
public static void Draw()
{
RCTerrain terrain = (RCTerrain)game.Scene.GetObject("terrain").Object;
Vector3 offset = new Vector3(tiny.Position.X, tiny.Position.Y + 10.4f, tiny.Position.Z);
float y = terrain.GetHeightAt(offset).Z;
if (terrain.Collision(offset, 0))
{
game.WriteText(game.Font, 10, 200, "Collision", Color.Red);
tiny.Position = new Vector3(offset.X, (y - 10.6f), offset.Z);
}
if (y < offset.Y + .2f)
{
tiny.Position = new Vector3(offset.X, (y - 10.4f) - .1f, offset.Z);
}
tiny.Translate(new Vector3(0, 0, -.25f));
if (tiny.Position.Z > 128)
tiny.Position = new Vector3(0, 0, -128f);
}
public static void KeyboardControls()
{
if (game.Input.Keys.Contains(Keys.Escape))
{
if (game.Sounds != null)
game.Sounds.StopAllMusic();
if (game.Graphics.IsFullScreen)
game.Graphics.ToggleFullScreen();
game.Exit();
return;
}
if (game.Input.Keys.Contains(Keys.F))
{
if (!game.Graphics.IsFullScreen)
game.Graphics.ToggleFullScreen();
}
if (game.Input.Keys.Contains(Keys.N))
{
if (game.Graphics.IsFullScreen)
game.Graphics.ToggleFullScreen();
}
if (game.Input.Keys.Contains(Keys.Left))
{
RCCameraManager.ActiveCamera.Translate(new Vector3(-0.1f, 0, 0));
}
if (game.Input.Keys.Contains(Keys.Right))
{
RCCameraManager.ActiveCamera.Translate(new Vector3(0.1f, 0, 0));
}
if (game.Input.Keys.Contains(Keys.Up))
RCCameraManager.ActiveCamera.Translate(new Vector3(0, 0, -0.1f));
if (game.Input.Keys.Contains(Keys.Down))
RCCameraManager.ActiveCamera.Translate(new Vector3(0, 0, 0.1f));
if (game.Input.Keys.Contains(Keys.X))
{
RCCameraManager.ActiveCamera.RevolveTarget = new Vector3(0, 0, 1);
RCCameraManager.ActiveCamera.Position = new Vector3(0, 0, 1);
RCCameraManager.ActiveCamera.Rotation = new Quaternion(0, 0, 0, 1);
}
}
public static void CameraControls()
{
Vector2 mouseMove = game.Input.MouseMoved;
RCCameraManager.ActiveCamera.Rotate(new Vector3(1, 0, 0), mouseMove.Y * 0.01f);
RCCameraManager.ActiveCamera.Rotate(new Vector3(0, 1, 0), mouseMove.X * 0.01f);
}
}
}
The terrain collision for tiny is in the Draw method. For collision detection for model on model take a look at the ray picking code and substitute the ray with the model you want to check for collision against.