D3DXVECTOR3 eye(cam_x,cam_y,cam_z);
D3DXVECTOR3 at(cam_x+1,cam_y+0,cam_z+0);
D3DXVECTOR3 up(0,up_y,0);
D3DXMatrixLookAtLH(&matView,&eye,&at,&up);
D3DXMatrixRotationYawPitchRoll(&z2,xxx,0,0);
D3DXMatrixRotationYawPitchRoll(&z4,0,yy,0);
D3DXMatrixTranslation(&z5,50,0,0);
z3=matView*z2*z4*z5;
g_pd3dDevice->SetTransform(D3DTS_VIEW,&z3);
Камера от 1-го лица
Вроде пробывал делать,у меня получалось поворачивать её относительно оси y.А вот по оси x он начинал поворачивать её относительно начальных координат.
Если кому не жалко поделитесь исходником!Ну или функцией.
для начала что юзаете (дрект икс, опен гл)
Дополнительно вопрос: на чем вращение основываете? Кватернионы, углы Эйлера, али как еще? И что у вас с мировой системой координат? Как сцену строите?
Код:
XXX и YY я вставляю в обработчик клавы.Код находится в фун-ии рендера.
В начале координат камера работает просто отлично,исправно накланяется и поварачивается.Но вот стоит её только отодвинуть её на определённое растояние, как по оси х начинается проблемма,а именно камера начинает двигаться относительно начала координат(тоесть глобальных координат)Насколько я понимаю ,нужно определить координаты локальными.Я исполь. функцию matrix Transform и установил координаты поворота в точках позиции камеры.Но ничего не помогло((
з.ы. я юзаю директ х
Код:
#define COEFF 0.05f
#define DEGTORAD(x) ((x) * (M_PI / 180.f))
float _euler[2];
void update()
{
POINT mShift;
int cx = GetSystemMetrics(SM_CXSCREEN) / 2;
int cy = GetSystemMetrics(SM_CYSCREEN) / 2;
GetCursorPos( &mShift );
SetCursorPos( cx, cy );
mShift.x = cx - mShift.x;
mShift.y = cy - mShift.y;
if (mShift.y)
{
_euler[0] -= (float)mShift.y * COEFF;
if (_euler[0] >= 360.f)
_euler[0] -= 360.f;
else if (_euler[0] < 0.f)
_euler[0] += 360.f;
}
if (mShift.x)
{
_euler[1] -= (float)mShift.x * COEFF;
if (_euler[1] >= 360.f)
_euler[1] -= 360.f;
else if (_euler[1] < 0.f)
_euler[1] += 360.f;
}
float fPitch = DEGTORAD( _euler[0] );
float fYaw = DEGTORAD( _euler[1] );
// тут вращаем (Rotate) единичную модельно-видовую матрицу по X (на fPitch), потом по Y (на fYaw).
...
}
#define DEGTORAD(x) ((x) * (M_PI / 180.f))
float _euler[2];
void update()
{
POINT mShift;
int cx = GetSystemMetrics(SM_CXSCREEN) / 2;
int cy = GetSystemMetrics(SM_CYSCREEN) / 2;
GetCursorPos( &mShift );
SetCursorPos( cx, cy );
mShift.x = cx - mShift.x;
mShift.y = cy - mShift.y;
if (mShift.y)
{
_euler[0] -= (float)mShift.y * COEFF;
if (_euler[0] >= 360.f)
_euler[0] -= 360.f;
else if (_euler[0] < 0.f)
_euler[0] += 360.f;
}
if (mShift.x)
{
_euler[1] -= (float)mShift.x * COEFF;
if (_euler[1] >= 360.f)
_euler[1] -= 360.f;
else if (_euler[1] < 0.f)
_euler[1] += 360.f;
}
float fPitch = DEGTORAD( _euler[0] );
float fYaw = DEGTORAD( _euler[1] );
// тут вращаем (Rotate) единичную модельно-видовую матрицу по X (на fPitch), потом по Y (на fYaw).
...
}
Конечно, это только как пример для разбора вращения на углах Эйлера.
[COLOR="Gray"]upd: Упростил до простого вращения, без перемещения.[/COLOR]