Тема: Глобальна та локальна система координат
Хай. От розбираюсь з XNA, а там же все самому тре робити. І от виникла така задача...
Дано:
Камера
Точка погляду (тобто точка в просторі, на котру дивиться камера)
Необхідно рухати камеру в просторі, але тільки в глобальній системі координат.
Що є зараз?
Зараз я просто рухаю камеру в сторону, але в локальних координатах. Тому при постійному русі вліво, або вправо відносно початкової точки камери, вона буде крутитись навколо точки, в котру дивиться. От вам картинка.
1) Рухаємо камеру вліво
2) Як є зараз
3) Як треба
Все зрозуміло?
От вам деякий код, на c#
Vector3 cameraPosition = new Vector3(1000f,10f,1000f);
Vector3 cameraLookAt = new Vector3(0f,0f,0f);
private Matrix cameraProjectionMatrix;
private Matrix cameraViewMatrix;
void Start(){
cameraViewMatrix = Matrix.CreateLookAt(cameraPosition, cameraLookAt, Vector3.Up);
cameraProjectionMatrix = Matrix.CreatePerspectiveFieldOfView(
MathHelper.ToRadians(45f),
graphics.GraphicsDevice.Viewport.AspectRatio,
0.1f,
10000f);
}
void Update()
{
if (Keyboard.GetState().IsKeyDown(Keys.W))
{
cameraPosition.X += 10f;
}
if (Keyboard.GetState().IsKeyDown(Keys.S))
{
cameraPosition.X -= 10f;
}
if (Keyboard.GetState().IsKeyDown(Keys.A))
{
cameraPosition.Z += 10f;
}
if (Keyboard.GetState().IsKeyDown(Keys.D))
{
cameraPosition.Z -= 10f;
}
if (Keyboard.GetState().IsKeyDown(Keys.Q))
{
cameraPosition.Y += 10f;
}
if (Keyboard.GetState().IsKeyDown(Keys.E))
{
cameraPosition.Y -= 10f;
}
}
строка
cameraViewMatrix = Matrix.CreateLookAt(cameraPosition, cameraLookAt, Vector3.Up);
відповідає у нас за поворот камери, я так зрозумів. Ну а позицію я змінюю в методі
Update
, як бачите, тут все просто, тобто код сам простий, потрібно лише застосувати оту вашу тригонометрію, чи як воно зветься. Треба якось або на основі
cameraViewMatrix
змінювати оту позицію, адже більше немає від чого відштовхнутись, або змінювати позицію камери відносно точки, в котру вона дивиться, ну чи якось так.