I've been working in 3DSMax for years now and decided to give XNA 4.0 a try. I've got the majority of it working, however the camera is being a pain to me and I can't discern what's gone wrong. I followed tutorials up to this point and am branching out into newer things.
Basically for this setup, I have a 'grid' in 3D space (all have a Y-component of 0) with spheres located here and there along the grid (spheres are FBX models from 3DS). What I'm trying to do is write a quick move command that'll move the camera above and behind one of the objects and then look at it. By using the keyboard, I can scroll through the list of objects and the camera should immediately jump to the specified position. However, in practice, the camera ends up in strange places, doesn't look where it's supposed to, and I'm not even sure it's actually moving!
The location of the objects is stored within a class object as a Vector2 (hence the Y/Z swap below), as they are all on the same plane (no Y-axis used). The following code, in theory, should return the position of the camera, and it's target, based on that class object's position in the world. m_vPosition is a Vector2 that defines the location of the object. That vector is defined at creation-time and is in the Translation Matrix for the object.
public void GetCameraHoverLocation(out Vector3 p_vPos, out Vector3 p_vLook)
{
p_vPos = new Vector3(0, 0, 0);
p_vLook = new Vector3(0, 0, 0);
// Position should be above and behind
p_vPos.X = m_vPosition.X;
p_vPos.Y = 1;
p_vPos.Z = m_vPosition.Y + 10;
p_vLook.X = m_vPosition.X;
p_vLook.Y = 0;
p_vLook.Z = m_vPosition.Y;
}
The code to move the camera into position is:
public void SetCameraPosition(Vector3 p_vPos, Vector3 p_vLookAt)
{
m_mViewMatrix = Matrix.CreateLookAt(p_vPos, p_vLookAt, Vector3.Up);
m_vCameraPos = p_vPos;
m_vCameraView = p_vLookAt;
}
The Position and LookAt are stored for later usage. The ViewMatrix is then given to the shader and bob's your uncle. However, again, the positioning of the camera is alllll wrong. I'm thinking it might be a complete misunderstanding of the Matrix.CreateLookAt function, but it works as written if I don't bother moving it (up to this point that is). Can anyone point me in the right direction on this one? I'm used to the way 3DS does things with cameras (vector for location, vector for target), so that might be polluting my thought process.