Войти
ПрограммированиеФорум2D графика и изометрия

OpenGL Камера перемещающаяся над текстурой

#0
12:50, 6 янв 2020

Пытаюсь создать класс камеры перемещающейся над текстурой (Qt 4.8.7). Камера должна перемещаться над текстурой (область видимости только над текстурой) и приближать /удалять фрагмент текстуры. Текстура для простоты квадратная. ноль координат в центре текстуры. ширина и высота 1.0f.
Структура scnmove хранит xyz позицию центра выводимой области и ее ширину w и высоту h. пытаюсь выводить пока тольо точки.

#define LG_FOVY      15.0
#define LG_NEAR_DIST 0.0001
#define M_DEG_TO_RAD M_PI/180

CAMERA::CAMERA(QWidget *parent)
    : Widget(parent)
{
    initCamera(0.0, 0.0, 1.0);
}



void CAMERA::initCamera(GLdouble scnx, GLdouble scny, GLdouble scnz)
{
    //! Инициализация матрицы
    matrix.xx = 1.0; matrix.xy = 0.0; matrix.xz = 0.0; matrix.tx = 0.0;
    matrix.yx = 0.0; matrix.yy = 1.0; matrix.yz = 0.0; matrix.ty = 0.0;
    matrix.zx = 0.0; matrix.zy = 0.0; matrix.zz = 1.0; matrix.tz = 0.0;
    matrix.xw = 0.0; matrix.yw = 0.0; matrix.zw = 0.0; matrix.tw = 1.0;

    scnmove.x = scnx;
    scnmove.y = scny;
    scnmove.z = scnz;

    // Обновление модельно-видовой матрицы 
    matrix.tx = -scnmove.x;
    matrix.ty = -scnmove.y;
    matrix.tz = -scnmove.z;
}

void CAMERA::viewProjection()
{
    GLdouble ratio       = (GLdouble)Widget->width() / Widget->height(),
             TAN_FOVY    = tan(LG_FOVY * M_DEG_TO_RAD),
             LG_FAR_DIST = qMin(0.5 / TAN_FOVY, 0.5 / ratio / TAN_FOVY),
             fH          = TAN_FOVY * LG_NEAR_DIST,
             fW          = fH * ratio;

    glViewport(0, 0, Widget->width(), Widget->height());

    // Генерация матрицы проекций
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(-fW, fW, -fH, fH, LG_NEAR_DIST, LG_FAR_DIST);

    // Генерация модельно-видовой матрицы
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glMultMatrixd((GLdouble*)&matrix);
}
....
void MyGLWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    camera.viewProjection();

    glPointSize(3.0);qglColor(Qt::red);
    glBegin(GL_POINTS);
    glVertex3d((GLdouble)(camera.scnmove.x),
               (GLdouble)(camera.scnmove.y),
               (GLdouble)(0.0));
    glVertex3d((GLdouble)(camera.scnmove.x+camera.scnmove.w/2),
               (GLdouble)(camera.scnmove.y+camera.scnmove.h/2),
               (GLdouble)(0.0));
    glVertex3d((GLdouble)(camera.scnmove.x+camera.scnmove.w/2),
               (GLdouble)(camera.scnmove.y-camera.scnmove.h/2),
               (GLdouble)(0.0));
    glVertex3d((GLdouble)(camera.scnmove.x-camera.scnmove.w/2),
               (GLdouble)(camera.scnmove.y-camera.scnmove.h/2),
               (GLdouble)(0.0));
    glVertex3d((GLdouble)(camera.scnmove.x-camera.scnmove.w/2),
               (GLdouble)(camera.scnmove.y+camera.scnmove.h/2),
               (GLdouble)(0.0));
    glEnd();

    glPointSize(3.0);qglColor(Qt::magenta);
    glBegin(GL_POINTS);
    glVertex3d((GLdouble)(0.0),
               (GLdouble)(0.0),
               (GLdouble)(0.0));
    glVertex3d((GLdouble)(camera.scnmove.w/2),
               (GLdouble)(camera.scnmove.h/2),
               (GLdouble)(0.0));
    glVertex3d((GLdouble)(camera.scnmove.w/2),
               (GLdouble)(-camera.scnmove.h/2),
               (GLdouble)(0.0));
    glVertex3d((GLdouble)(-camera.scnmove.w/2),
               (GLdouble)(-camera.scnmove.h/2),
               (GLdouble)(0.0));
    glVertex3d((GLdouble)(-camera.scnmove.w/2),
               (GLdouble)( camera.scnmove.h/2),
               (GLdouble)(0.0));
    glEnd();
}

При этом вершины отображаются только если закомментировать glFrustum иначе не отображается вообще ничего.

Подскажите что делаю не так? и может поделитесь примером такой камеры или ссылочкой где про это доступно можно почитать.

#1
18:21, 6 янв 2020

много всего плохо. в первую очередь камера не над текстурой перемещается, а над геометрией (в твоём случае это почему-то точки, хотя должен быть quad) с натянутой на неё текстурой. во-вторых, плохо то, что ты используешь гигадревний функционал opengl1.0, который мало того, что уже нигде не применяется, после него ещё придётся полностью переучиваться на современный. тут гораздо проще написать заново нормально, чем исправлять ошибки, так что рекомендую для обучения https://learnopengl.com/ — это, пожалуй, лучшая серия уроков с более-менее нормальными практиками использования opengl.

#2
19:50, 6 янв 2020

Suslik
> во-вторых, плохо то, что ты используешь гигадревний функционал opengl1.0,
> который мало того, что уже нигде не применяется, после него ещё придётся
> полностью переучиваться на современный. тут гораздо проще

ну да, ещё полгода и шейдера взойдут

#3
20:32, 6 янв 2020

плохо то, что ты используешь гигадревний функционал opengl1.0

в моем случае железо поддерживает только opengl 2.0. Текстура тоже не отображается, отсекается где то границами.точки вывел постаринке только для понимания происходящего, для отладки это проще чем массивы...

Координату z для текстуры и для точек  выше ставлю ноль.
Как я понимаю после изменения модельно-видовой матрицы ноль координат оказывается в точке scnmove.xyz но не отображается ни эта точка (0,0,0) ни границы вокруг нее.
Также не отображается точка scnmove.xyz и границы вокруг нее. Это и ставит в тупик.

Я сознательно делал размеры геометрии схожими с размерами текстуры. Текстурные координаты s t от 0 до 1. Координаты в геометрии х: -0.5...0.5 y: -0.5...0.5 (это я и описывал выше).

#4
0:54, 7 янв 2020

Suslik
> во-вторых, плохо то, что ты используешь гигадревний функционал opengl1.0,
> который мало того, что уже нигде не применяется, после него ещё придётся
> полностью переучиваться на современный

В продакшене, на шарпе писанный, ещё как применяется! :)
(не игровое приложение)

urii
попробуй gluPerspective, вместо glFrustum. яйца те же, но для самопроверки норм.
и/или z (в initCamera) отрицательный

#5
7:50, 9 янв 2020

/или z (в initCamera) отрицательный

Z ставил самый разный , но эффекта не получил
Код с glfrustum взял из примера который благополучно работает (3d камера)

#6
13:29, 9 янв 2020

urii
> в моем случае железо поддерживает только opengl 2.0.
Уж извини за флуд, но ты где такое железо нашел? Это чего у тебя за комп такой?

#7
8:31, 14 янв 2020

urii
Как там дела в нулевых?

#8
14:11, 14 янв 2020

urii
Как там дела в нулевых?

Увы суровая действительность.
Импортозамещение, отечественная элементная база...

ПрограммированиеФорум2D графика и изометрия

Тема в архиве.