directx c камера от первого лица

#c #camera #directx

#c #камера #directx

Вопрос:

я создаю 3D-комнату, по которой вы можете ходить с помощью камеры от первого лица, я определил положение глаз, как показано ниже:

 float eyeX = 0; 
float eyeY = 100;
float eyeZ = 75;
  

вот мой код просмотра:

 D3DXMatrixLookAtLH( amp;g_matView, amp;D3DXVECTOR3( eyeX, eyeY,eyeZ ),
                        amp;D3DXVECTOR3( LookatX, LookatY, LookatZ ),
                        amp;D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) );
    g_pd3dDevice->SetTransform( D3DTS_VIEW, amp;g_matView );
  

мой код позволяет мне перемещать камеру, но не так, как камеру от первого лица, и я изо всех сил пытаюсь добиться этого.

     //   forwards = UP ARROW 
    //   Backwards = DOWN ARROW  
    //   rotate left = LEFT ARROW     
    //   rotate right = RIGHT ARROW    



    case WM_KEYDOWN:
    {
        // Handle any non-accelerated key commands
        switch (wparam)
        {

    case VK_RIGHT:
    if(eyeX >=-50)
        {
            --eyeX;
        }

    return (0);


    case VK_LEFT:
    if(eyeX <=50)
        {
              eyeX;
        }
    return (0);


    case VK_DOWN:
    if(eyeZ >=-50)
        {
            --eyeZ;
        }

    return (0);


    case VK_UP:
    if(eyeZ <=50)
        {
              eyeZ;
        }
    return (0);


    case VK_SPACE:
    if(eyeY >=-50)
        {
            --eyeY;
        }

    return (0);


    case VK_SHIFT:
    if(eyeY <=50)
        {
              eyeY;
        }
    return (0);

        }
        break;
    }



    LookatX = eyeX   5.0f;
    LookatY = eyeY;
    LookatZ = eyeZ;

    case WM_DESTROY: 
    {
        // kill the application         
        PostQuitMessage(0);

        return(0);
    }

    default:
        break;

} // end switch
  

может ли кто-нибудь предложить некоторые изменения, которые позволили бы мне перемещаться по моей комнате, как камера от первого лица?

Комментарии:

1. У вас возникли проблемы с перемещением игрока или поворотом (осмотром) камеры?

Ответ №1:

Вместо использования D3DXMatrixLookAtLH вы могли бы сохранить матрицу просмотра.

Настройка

(Обратите внимание, что я придумываю названия функций, возможно, вам придется создавать их самостоятельно)

Начните с чего-то вроде

 Matrix view = Matrices.createIdentity();
  

Затем для каждого кадра вы устанавливаете матрицу просмотра (точно так же, как вы делаете с матрицей, которую получаете из MatrixLookAtLH)

Перемещение по

Обычно модификация матрицы модели происходит следующим образом.

 model = Matrix.multiply(model,transformation).
  

Однако вы управляете камерой в обратном направлении

 view = Matrix.multiply(transformation, view)
  

Просто запустите оператор switch, сгенерируйте преобразование и обновите матрицу просмотра.

например:

 if (key == 'w')
  view = Matrix.multiply(Matrices.createTranslate(0,0,-5), view);

if (key = 'j') // Key to turn
  view = Matrix.multiply(Matrices.createRotateY(.1), view);
  

Формулы для генерации этих матриц можно найти в википедии (или DirectX может предоставить их самостоятельно).

(Все это основано на простом программном средстве визуализации, которое я создал некоторое время назад, но оно должно применяться то же самое к DirectX)

РЕДАКТИРОВАТЬ: О, похоже, у DirectX уже есть все эти функции для вас в http://msdn.microsoft.com/en-us/library/windows/desktop/bb281696 (v = против 85).aspx