1

Тема: Глобальна та локальна система координат

Хай. От розбираюсь з XNA, а там же все самому тре робити. І от виникла така задача...
Дано:
Камера
Точка погляду (тобто точка в просторі, на котру дивиться камера)
Необхідно рухати камеру в просторі, але тільки в глобальній системі координат.
Що є зараз?
Зараз я просто рухаю камеру в сторону, але в локальних координатах. Тому при постійному русі вліво, або вправо відносно початкової точки камери, вона буде крутитись навколо точки, в котру дивиться. От вам картинка.
http://не-дійсний-домен/9SGVE/e40c6ee875.png
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

змінювати оту позицію, адже більше немає від чого відштовхнутись, або змінювати позицію камери відносно точки, в котру вона дивиться, ну чи якось так.

2

Re: Глобальна та локальна система координат

Насправді у твому випадку системи координат не глобальні і локальні, а декартова і радіальна.
Все що тобі треба це перехід з радіальної в декартову.
Але тут одна проблема, якщо камера дивиться на точку, то для неї вліво, це під кутом 90 градусів до радіуса. А для вас це непонятно під яким кутом.
якщо говорити про стрейф який є в іграх, то там йде 90 відносно напрямку камери, але при цьому напрямоку куди камера дивиться також зсувається паралельно. Так що тут залежить що вам треба.