Как преобразовать движение мыши в панорамирование камеры

Я использую 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, на которое я должен установить цель?

Я в недоумении, как этого добиться. На самом деле мне не все так ясно, и все книги, которые я купил на эту тему, тоже не ясны.


person JeffS    schedule 31.01.2012    source источник


Ответы (1)


Вы можете вычислить мировые координаты из локальных координат, умножив свои локальные координаты на мировую матрицу. Если вы хотите, чтобы ваша камера двигалась, просто определите их текущее положение с помощью 3D-вектора, а затем используйте D3DXMatrixLookAtLH для расчета матрицы вида из вашего текущего положения. Ознакомьтесь с этим руководством для получения более подробной информации: http://www.braynzarsoft.net/index.php?p=D3D11WVP

person asmi84    schedule 01.02.2012
comment
Я использую функцию D3DXMatrixLookAtLH, но я пытаюсь рассчитать изменение целевого местоположения на основе движений мыши, чтобы получить новую цель для ввода в эту функцию. Я добавил несколько фрагментов кода: - person JeffS; 01.02.2012
comment
Цель может быть просто нормализованным вектором, он определяет только направление, в котором смотрит камера, поэтому, когда вы перемещаете вектор камеры, сделайте то же самое с целевым вектором. - person asmi84; 01.02.2012
comment
О, теперь я вижу. Прежде всего, помните, что умножение матриц не является коммуникативным — порядок имеет значение. Во-вторых, рассчитайте вектор направления взгляда только на основе ваших поворотов. Затем вычислите вектор положения вашей камеры. Добавьте эти два, чтобы получить координаты цели, а затем передайте их функции D3DXMatrixLookAtLH. И последнее, но не менее важное: если вы не знакомы с операциями с матрицами, не пытайтесь настраивать их напрямую, используйте функции D3DXMatrix*. - person asmi84; 01.02.2012
comment
Спасибо за всю твою помощь. У меня все еще есть некоторые проблемы, но это из-за моего отсутствия опыта работы с DirectX. Я написал больше выше. еще раз спасибо. - person JeffS; 01.02.2012
comment
Да, я вижу это. Посмотрите этот урок: braynzarsoft.net/index.php?p=D3D11WVP Он объясняет различные пространства более подробно. И другие уроки могут быть интересны или вам тоже. - person asmi84; 01.02.2012