OpenGL glTranslatef не работает должным образом
Поэтому я решил сделать что-то вроде 3D-звезд на C ++ с помощью SDL и OpenGL. Я создал класс Point, который содержит значения x, y и z. Я создаю массив точек и заполняю его случайными координатами. Кажется, это работает, но когда я использую glTranslatef (0,0,0.1f) или что-то подобное, звезды не подходят близко, они просто исчезают.
Что я делаю не так?
3 ответа
Я переместил код инициализации OpenGL после кода, в котором я инициализирую SDL SetVideoMode, теперь он работает так, как должен.
Этот код является вашей функцией рендеринга?
Если это так, то вам следует переместить генерацию точек в другое место, чтобы они генерировались только один раз.
Если это не так, вам следует переместить код инициализации в начало функции рендеринга. Матрицы следует очищать каждый кадр.
Если это не сработает:
Попробуйте временно отключить проверку глубины. Если они не исчезают, и вы видите линии, вам необходимо отрегулировать усеченную область обзора. Попробуйте использовать gluLookAt
Также попробуйте перевести их в отрицательную ось z. Если я правильно помню, в opengl координаты объектного пространства дальше от z уменьшается. (0 ближе, чем -1)
Я не уверен, почему они исчезнут, но в вашем примере кода это должно быть инертным. Вы загружаете новую матрицу идентичности вверху для матрицы MODELVIEW, а затем переводите ее после визуализации. Попробуйте переместить glTranslate прямо перед glBegin.
Источник
gltranslatef-определение
Только начал читать по opengl.
Непонятна суть команды gltranslatef.
Подскажите пожалуйста, а то в учебнике всё на ней базируется.
klavdraiver
перенос системы координат.
klavdraiver
сдвиг начала системы координат.
klavdraiver
Перемещение системы координат.
klavdraiver
Умножение текущей матрицы на матрицу сдвига.
В каком смысле сдвиг начала координат? в смысле экран лист бумаги, сетка координат это сетка?
klavdraiver
типа да. После выполнения команды glTranslatef(-1.0, 0.0, 0.0) начало координат сместится по оси Х влево на 1 пункт, и рисование в точке (0;0;0) уже будет на самом деле в точке (-1;0;0).
а реально всё происходит так: при любом рисовании (ну то есть при выводе любой геометрии) все координаты умножаются на матрицу вида и на матрицу проекции. Изначально все матрицы единичные, поэтому координаты не изменяются. Команда glTranslatef изменяет матрицу вида и после этого все координаты при умножении на эту новую матрицу вида будут смещаться соответствующим образом.
Пожалуйста можно также привести пример использования и координаты точки до и после функции.
Вот пример (да простят меня форумчане за OpenGL 1.1, но на устаревшем функционале учиться лучше всего, я и сам учился)
klavdraiver
Неужели в книжках ничего этого нет?
Но тогда почему если сначала без gltranslatef откомпилировать программу к примеру для вывода двух точек, одна с gltranslatef другая без, то второй точки нет, как-будто одни и те-же пиксели.
p.s. это моя программа.
ALPINE
>Вот пример (да простят меня форумчане за OpenGL 1.1, но на устаревшем функционале учиться лучше всего, я и сам учился)
На устаревшем функционале новому не научишься, смысл тогда учить его?
glTranslatef уже никому не нужен.
ALPINE
В книжках есть но мне кажется что этого мало: цитата Краснов. opengl графика в проектах delphi «Перенос точки зрения (системы координат) осуществляется командой glTranslatef с тремя аргументами — величинами переноса для каждой из осей».
Мне кажется недостаточным этой информации
Преобразования над матрицей нужно осуществлять вне блока glBegin/glEnd
Я разобрался. Нельзя в glbegin помещать gltranslatef. p.s.: спасибо за помощь!:)
p.s.2: не подскажете, где найти список команд которые нельзя выводить в glbegin
klavdraiver
Любые команды, кроме атрибутов вершин вроде позиции вершины, текстурных координат, цвета, етц
Источник
glTranslatef работает не корректно
Сначала попытался отрисовать без resizeGL, все фигуры при glTranslatef закрывались белым фоном. с ним же, происходит не понятно, что. треугольник закрывает собой квадрат, а при масштабирование он вообще меняет свой вид.
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Доброе утро, форумчане! Такая вот проблема. Прошу помощи! Никак не могу заставить свой квадрат.
Перемещение glTranslatef
#include «stdafx.h» #include GLfloat x = 0; GLfloat y = 0; void Display() <.
Обьясните пожалуйста glTranslatef
Вообщем я так понял по учебнику что эта команда перемещает кардинатную сетку. Но не очень понятно.
Реакция glTranslatef по Z на колёсико мыши в mousewheel
Всем привет! Не пойму в чём дело : в перспективной проекции перемещение по оси Z работает.
Переписываю свою программу с Delphi 7 под RAD Studio 10. Столкнулся с проблемой — функция в.
Игра работает корректно в Unity, но не работает после билда
Разрабатываю игру на Android. Решил сделать билд для проверки на телефоне. В Unity все скрипты.
Apache+Ubuntu не работает/работает не корректно
Переустановил апачи иии оно не работает. Установка прошла без ошибок, но на старт, рестарт, стоп.
Доброго времени суток! Проблема в следующем. На главном шаблоне модуль работает, но я сейчас.
Источник
how to use glTranslatef,glScalef,glRotatef in openGL
I just want something like this video : https://youtu.be/dGWtdYlryQQ It shows how to use glTranslate , glRotate , gluOrtho2d in OpenGL ,but it’s not guide me anything
In my case, I draw a diamond instead of triangle and here is my condition
- when I press r or R on the keyboard the diamond will rotate clockwise
- when I press t or T on the keyboard the diamond will move to the right side
- when I press + on the keyboard the diamond will bigger
here is my code :
2 Answers 2
The operations on the matrix stack are based on one another. The reference system of each operation is the current transformation.
glTranslate produces a translation by x y z . The current matrix (see glMatrixMode ) is multiplied by this translation matrix, with the product replacing the current matrix, [. ]
glRotate produces a rotation of angle degrees around the vector x y z . The current matrix (see glMatrixMode ) is multiplied by a rotation matrix with the product replacing the current matrix.
This means that glRotate does a rotation around the origin of the current local system.
While glRotatetf followed by glTranslatef results in:
glTranslatef followed by glRotatef results in:
Since you object is displaced, you have to translate it in that way, that the rotation point is placed in the origin:
Then you can rotate it:
And move it back:
Note, on the Fixed Function Pipeline stack you have to «push» this operations in the reverse order. Further you should use the GL_MODELVIEW matrix stack. (See glMatrixMode .)
Remove all the matrix operations from the function keyboard and add the following to the function hut :
Further, your object gets destroyed by the aspect ratio of the view. This can be fixed by taking care of the aspect ratio when setting up the projection matrix:
Источник
OpenGL glTranslatef / glRotatef не работает, как я ожидал
Я пытаюсь создать многоугольник и сдвинуть / повернуть его при отпускании кнопки мыши. Я смогу сделать это, если снова перерисую весь свой многоугольник с помощью glBegin и glEnd , но я не уверен, действительно ли мне это нужно, поскольку я уже нарисовал многоугольник на экране один раз и просто хочу использовать тот же объект и применить к нему вращение / перемещение.
Я помещаю отрывок ниже.
2 ответа
Пожалуйста, поговорите со мной: «Я больше никогда не буду помещать вызовы рисования OpenGL в обработчики событий!»
В обработчике событий вы устанавливаете некоторую переменную в соответствии с событием, затем выполняете вызов перерисовки, а в функции рендеринга вы рисуете в соответствии с содержимым переменных.
Обновить:
Также OpenGL не «запоминает» то, что вы рисуете. Вы отправляете команды рисования, OpenGL делает свое дело, а потом забывает об этом. Остался единственный след — это фрагменты, превращенные в пиксели в буфере кадра. Но на содержимое фреймбуфера не влияет преобразование или какие-либо изменения состояния OpenGL. Только рисование влияет на фреймбуфер.
Вам не нужно снова писать весь код:
В вашей функции отображения (та же функция void, которую вы используете в качестве аргумента для регистрации обратных вызовов для перенасыщения окна как glutDisplayFunc(display) ) поместите фрагмент кода выше.
Внутри последовательности glPushMatrix() .. glPopMatrix() поместите переменный угол (желательно типа GLfloat ) внутри вызова glRotatef() вместе с осью вращения. Вы можете сделать то же самое для аргументов glRotatef() .
Если вы хотите повернуть или перевести с помощью мыши или клавиатуры, используйте glutMouseFunc() или glutKeyboardFunc() , чтобы зарегистрировать обратные вызовы в GLUT. Если вам нужна анимация, вы можете зарегистрировать функцию с помощью glutIdleFunc() .
Фрагмент кода будет:
Функция ожидания (для непрерывной анимации)
Источник