Пытаюсь создать класс камеры перемещающейся над текстурой (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 иначе не отображается вообще ничего.
Подскажите что делаю не так? и может поделитесь примером такой камеры или ссылочкой где про это доступно можно почитать.
много всего плохо. в первую очередь камера не над текстурой перемещается, а над геометрией (в твоём случае это почему-то точки, хотя должен быть quad) с натянутой на неё текстурой. во-вторых, плохо то, что ты используешь гигадревний функционал opengl1.0, который мало того, что уже нигде не применяется, после него ещё придётся полностью переучиваться на современный. тут гораздо проще написать заново нормально, чем исправлять ошибки, так что рекомендую для обучения https://learnopengl.com/ — это, пожалуй, лучшая серия уроков с более-менее нормальными практиками использования opengl.
Suslik
> во-вторых, плохо то, что ты используешь гигадревний функционал opengl1.0,
> который мало того, что уже нигде не применяется, после него ещё придётся
> полностью переучиваться на современный. тут гораздо проще
ну да, ещё полгода и шейдера взойдут
плохо то, что ты используешь гигадревний функционал 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 (это я и описывал выше).
Suslik
> во-вторых, плохо то, что ты используешь гигадревний функционал opengl1.0,
> который мало того, что уже нигде не применяется, после него ещё придётся
> полностью переучиваться на современный
В продакшене, на шарпе писанный, ещё как применяется! :)
(не игровое приложение)
urii
попробуй gluPerspective, вместо glFrustum. яйца те же, но для самопроверки норм.
и/или z (в initCamera) отрицательный
/или z (в initCamera) отрицательный
Z ставил самый разный , но эффекта не получил
Код с glfrustum взял из примера который благополучно работает (3d камера)
urii
> в моем случае железо поддерживает только opengl 2.0.
Уж извини за флуд, но ты где такое железо нашел? Это чего у тебя за комп такой?
urii
Как там дела в нулевых?
urii
Как там дела в нулевых?
Увы суровая действительность.
Импортозамещение, отечественная элементная база...
Тема в архиве.