Я использую DirectX3D 11 для написания приложения, и вектор цели моей камеры определяется переменными xdelta, ydelta и zdelta.
Я должен панорамировать свой вид в XY, когда я двигаю мышью по экрану с нажатыми ПКМ и ЛКМ.
Я решил, что мне нужно добавить дельту движения мыши в пространство VIEW, чтобы оно перемещалось по X и Y относительно моего представления, а не по X и Y в мире.
Однако, будучи новичком в этом, я не уверен, как преобразовать мои координаты VIEW обратно в координаты WORLD.
Я надеюсь, что соблюдаю все правила форматирования, так как я не публикую здесь достаточно, чтобы точно запомнить их все.
Любая помощь будет оценена по достоинству. ниже мой фрагмент кода. Возможно, есть и лучший способ.
if ( m_Input->RMBPressed() == true && m_Input->LMBPressed() == true ) // Pan View
{
if ( curX != mouseX || curY != mouseY ) {
//Get Target Coordinates in View Space
D3DXVECTOR3 targetView = (D3DXVECTOR3 ( mView(2,0), mView(2,1), mView(2,2) );
//Add mouse XY delta vector to target View Coordinates
D3DXVECTOR3 delta ( (float)curX-(float)mouseX,
(float)curY-(float)mouseY, zdelta );
targetView += delta;
//Convert back to World Coordinates
}
}
Я пробую другой подход, который я считаю правильным, но он все еще не работает правильно. Я получаю дельту по X и Y с экрана при движении мыши и сохраняю их в переменных «xdelta» и «ydelta».
Затем я создаю матрицу преобразования
D3DXMATRIX mTrans;
Затем я заполняю значения в матрице
// Rotation
mTrans(0,0) = delta.x;
mTrans(1,1) = delta.y;
// Translation
mTrans(0,3) = delta.x;
mTrans(1,3) = delta.y;
Теперь, чтобы получить их соответствующие координаты просмотра, я думаю, мне следует умножить их на матрицу просмотра, которую я называю mView.
mTrans= mTrans*mView;
Теперь добавьте эти переведенные значения к моей текущей цели X и Y, которая определяется переменными «target_x» и «target_y», она должна перемещать мой целевой вектор относительно моих координат X и Y представления (т.е. ортогонально моему текущему представлению).
target_x += mTrans(0,3);
target_y += mTrans(1,3);
Но это не так. Он перемещает мою цель по осям X и Y мира, а не по осям View X и Y.
БОЛЬШЕ ФРАГМЕНТОВ
Я использую функцию D3DXMatrixLookAtLH, но я пытаюсь рассчитать изменение целевого местоположения на основе движений мыши, чтобы получить новую цель для ввода в эту функцию. Я добавил несколько фрагментов кода:
if ( m_Input->RMBPressed() == true && m_Input->LMBPressed() == true ) // Pan View
{
if ( curX != mouseX || curY != mouseY ) {
//Get mouse XY delta vector
D3DXVECTOR3 delta ( (float)curX-(float)mouseX, (float)curY-(float)mouseY, zdelta );
//Create Transformation Matrix
D3DXMATRIX mTemp;
// Rotation
mTemp (0,0) = delta.x;
mTemp (1,1) = delta.y;
mTemp (2,2) = delta.z;
// Translation
mTemp (0,3) = delta.x;
mTemp (1,3) = delta.y;
mTemp (2,3) = delta.z;
//Convert to View Coordinates
mTemp = mTemp*mView;
xdelta += mTemp(0,3);
ydelta += mTemp(1,3);
// Convert Spherical to Cartesian coordinates: mPhi measured from +y
// and mTheta measured counterclockwise from z.
float height = mRadius * cosf(mPhi);
float sideRadius = mRadius * sinf(mPhi);
float x = xdelta + sideRadius * cosf(mTheta);
float z = zdelta + sideRadius * sinf(mTheta);
float y = ydelta + height;
// Build the view matrix.
D3DXVECTOR3 pos(x, y, z);
D3DXVECTOR3 target(xdelta, ydelta, zdelta);
D3DXVECTOR3 up(0.0f, 1.0f, 0.0f); // Y Axis is up. Looking down Z.
D3DXMatrixLookAtLH(&mView, &pos, &target, &up);
Прежде всего, спасибо за всю вашу информацию. Это помогает мне медленно понимать матрицы DirectX. Я прав в логике ниже? Предположим, что мое изменение мыши составляет 5,0 по X и 5,0 по Y на экране. это моя дельта. Z всегда будет 0,0. Я мог бы найти координаты вида следующим образом.
D3DXVECTOR3 up(0.0f, 1.0f, 0.0f); // Y Axis is up. Looking down Z.
D3DXVECTOR3 delta ( 5.0f, 5.0f, 0.0f );
D3DXVECTOR3 origin ( 0.0f. 0.0f, 0.0f );
D3DMATRIX mTemp;
D3DXMatrixIdentity (&mTemp);
D3DXMatrixLookAtLH (&mTemp, &delta, &origin, &up );
Теперь у меня должны быть координаты вида дельты XY, сохраненные в матрице представления mTemp?
Если да, то лучший способ продолжить, добавив координаты XY delta View к координатам XY mView, а затем переведя обратно в мировые координаты, чтобы получить фактическое мировое значение XY, на которое я должен установить цель?
Я в недоумении, как этого добиться. На самом деле мне не все так ясно, и все книги, которые я купил на эту тему, тоже не ясны.