#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