Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Самодельное проецирование и установка камеры


Автор: VАDIM 21.11.2010, 18:54
Всем добрый день. Есть у меня задача: сделать самодельное проецирование точки и установку камеры. Для проецирования у меня есть матрица CT[4][4] (current transformation). При помощи афиных преобразований я изменяю матрицу CT так: CT = CT * M - где М - овое преобразование, что добавляется к текущему. Тут все понятно. (и в моей проге все работает)

Но есть непонятки у установкой камеры матрицей моделиования вида. Как матрицей V установить позицию камеры в програме? Вот цитата из Френсис Хил OpenGL: "Функция glLookAt строит матрицу V и умножает ее справа на текущую матрицу", но куда помещается результат? Снова в СТ? Тоисть преобразование будет виглядеть так: CT = V * CT? Я все правильно понимаю? Преобразование V также дополняет текущее преобразование камеры, или устанавливает ее заново значениями записаными в СТ? Пожалуйста помогите разобратся, т. к. не получается сделать установку камери в програме. Кто сам пробовал делать установку камери в програме плиз помогите.

Вот моя функция LookAt:
Код

void LookAt(TVector3D eye, TVector3D look, TVector3D up)
{
        (формулы использованые при вичислениях см. ниже)
    TVector3D n, u, v;
    Diff(eye, look, n);//вичисляю разницу eye i look, помещаю результат в n.
    VectMult(up, n, u);//вичисляю вкторное произведение, помещаю результат в u.
    Normalize(&n);//..нормализирую векторы
    Normalize(&u);
    VectMult(n, u, v);//вичисляю вектор v

    float x, y, z, c
        //заполяню матрицу CT
    x = u.x * CT[0][0] + u.y * CT[1][0] + u.z * CT[2][0];
    y = u.x * CT[0][1] + u.y * CT[1][1] + u.z * CT[2][1];
    z = u.x * CT[0][2] + u.y * CT[1][2] + u.z * CT[2][2];
    c = u.x * CT[0][3] + u.y * CT[1][3] + u.z * CT[2][3] - (eye.x * u.x + eye.y * u.y + eye.z * u.z);

    CT[0][0] = x;
    CT[0][1] = y;
    CT[0][2] = z;
    CT[0][3] = c;

    x = v.x * CT[0][0] + v.y * CT[1][0] + v.z * CT[2][0];
    y = v.x * CT[0][1] + v.y * CT[1][1] + v.z * CT[2][1];
    z = v.x * CT[0][2] + v.y * CT[1][2] + v.z * CT[2][2];
    c = v.x * CT[0][3] + v.y * CT[1][3] + v.z * CT[2][3] - (eye.x * v.x + eye.y * v.y + eye.z * v.z);

    CT[1][0] = x;
    CT[1][1] = y;
    CT[1][2] = z;
    CT[1][3] = c;

    x = n.x * CT[0][0] + n.y * CT[1][0] + n.z * CT[2][0];
    y = n.x * CT[0][1] + n.y * CT[1][1] + n.z * CT[2][1];
    z = n.x * CT[0][2] + n.y * CT[1][2] + n.z * CT[2][2];
    c = n.x * CT[0][3] + n.y * CT[1][3] + n.z * CT[2][3] - (eye.x * n.x + eye.y * n.y + eye.z * n.z);

    CT[2][0] = x;
    CT[2][1] = y;
    CT[2][2] = z;
    CT[2][3] = c;

}



Вычисляю ее значения по формулах: n = eye - look; u = up x n; v = n x u;

Автор: VАDIM 23.11.2010, 17:06
Хм, проблема решилась, но как-то сама по себе. Посмотрел на последовалетьность функций OpenGl glMatrixMode(GL_MODELVIEV), glLoadIdentity(), и LootAt() и до меня дошло, что нужно сначало загружать еденичную матрицу, а потом уже устанавливать камеру. Нужно било всего то написать свою функцию LoadIdentity(). Матрица CT ведь единтвенная в конвеере OpenGl. + нужно било изменить функцию LookAt, ниже приводиться рабочий вариант.

Код

void LookAt(TVector3D eye, TVector3D look, TVector3D up)
{
    TVector3D n, u, v;
    Diff(eye, look, n);
    VectMult(up, n, u);
    Normalize(&n);
    Normalize(&u);
    VectMult(n, u, v);

    float ct[3][4];

    ct[0][0] = u.x * CT[0][0] + u.y * CT[1][0] + u.z * CT[2][0];
    ct[0][1] = u.x * CT[0][1] + u.y * CT[1][1] + u.z * CT[2][1];
    ct[0][2] = u.x * CT[0][2] + u.y * CT[1][2] + u.z * CT[2][2];
    ct[0][3] = u.x * CT[0][3] + u.y * CT[1][3] + u.z * CT[2][3] - Mult(eye, u);

    ct[1][0] = v.x * CT[0][0] + v.y * CT[1][0] + v.z * CT[2][0];
    ct[1][1] = v.x * CT[0][1] + v.y * CT[1][1] + v.z * CT[2][1];
    ct[1][2] = v.x * CT[0][2] + v.y * CT[1][2] + v.z * CT[2][2];
    ct[1][3] = v.x * CT[0][3] + v.y * CT[1][3] + v.z * CT[2][3] - Mult(eye, v);

    ct[2][0] = n.x * CT[0][0] + n.y * CT[1][0] + n.z * CT[2][0];
    ct[2][1] = n.x * CT[0][1] + n.y * CT[1][1] + n.z * CT[2][1];
    ct[2][2] = n.x * CT[0][2] + n.y * CT[1][2] + n.z * CT[2][2];
    ct[2][3] = n.x * CT[0][3] + n.y * CT[1][3] + n.z * CT[2][3] - Mult(eye, n);

    CopyMemory(CT, &ct[0][0], sizeof(ct));
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)