Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Самодельное проецирование и установка камеры, Как включить в свой граф. конв. камеру? 
:(
    Опции темы
VАDIM
Дата 21.11.2010, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 19.10.2010

Репутация: нет
Всего: нет



Всем добрый день. Есть у меня задача: сделать самодельное проецирование точки и установку камеры. Для проецирования у меня есть матрица 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;
PM MAIL   Вверх
VАDIM
Дата 23.11.2010, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 19.10.2010

Репутация: нет
Всего: нет



Хм, проблема решилась, но как-то сама по себе. Посмотрел на последовалетьность функций 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));
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0391 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.