| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Проблема с glLoadIdentity() |
| Автор: KaraKum 13.3.2008, 21:13 | ||
| Доброе время суток. После вызова функции glLoadIdentity() ничего не выводится на экран. Для проверки написал:
Треугольник получается такой гигантский, что должен заполнить весь экран - так и есть, но если перед этим кодом поставить вызов функции glLoadIdentity(), то ничего не рисуется. Скажите, в чём проблема? |
| Автор: baldina 14.3.2008, 09:04 |
| здесь играют роль две матрицы - GL_MODELVIEW_MATRIX и GL_PROJECTION_MATRIX. Ты в какую загружаешь? Какие еще преобразования есть в программе, кроме glLoadIdentity()? Добавлено через 1 минуту и 2 секунды Телепатия мне подсказывает, что во вторую, и твой треугольник оказывается за границами отсечения по глубине. Добавлено через 3 минуты и 36 секунд Кстати, из приведенного кода не следует, что треугольник гигантский и что-то должен заполнить. Весь код желательно увидеть. Если только все матрицы у тебя не Identity - тогда на экране единичный куб. |
| Автор: KaraKum 14.3.2008, 10:32 | ||
| Твоя интуиция - надёжная штука Вот код:
Периодически нужно сбрасывать предыдущую матрицу и устанавливать новую, но если использовать функции glLoadIdentity() и glTranslatef() вместе, то уже ничего нельзя вывести на экран. |
| Автор: Graf_h 14.3.2008, 10:47 |
| Тебе нужно перед преобразованиями записывать состояния матриц а после преобразований их восстановлять и тогда будет тебе счастье |
| Автор: KaraKum 14.3.2008, 11:28 | ||
После
вставил функцию glMatrixMode(GL_PROJECTION); - всё равно ничего не рисуется И заодно ещё вопросик: почему функция glutTimerFunc(40, ProcessTimerEvent, 1); вызывает функцию ProcessTimerEvent() только один раз, хотя должна делать это 25 раз в секунду? |
| Автор: Graf_h 14.3.2008, 11:36 |
| glPushMatrix();//Запоминаеш состояние преобразований glLoadIdentity(); //Здесь сбиваеш все преобразования и загружаеш единичную матрицу glTranslatef(...); // твои преобразования но уже отностельно центра... glBegin(GL_TRIANGLES); glColor3f(1, 0, 0); glVertex3f(0, 100, -80); glColor3f(0, 1, 0); glVertex3f(-100, -100, 80); glColor3f(0, 0, 1); glVertex3f(100, -100, 80); glEnd(); glPopMatrix():// восстановляеш состояние преобразований glFlush(); А насчет ProcessTimerEvent(): нужно ее вызывать и в ProcessTimerEvent и также нужно обновлять окно glutPostRedisplay(); |
| Автор: KaraKum 14.3.2008, 12:09 | ||
Изменил код и теперь он выглядит так:
Но всё равно ничего не рисуется! Насчёт таймера: если я правильно понял, в конце функции ProcessTimerEvent() нужно вызвать glutTimerFunc(40, ProcessTimerEvent, 1); И если так, то плохо, что в таком случае программа пожирает всё процессорное время. |
| Автор: Graf_h 14.3.2008, 12:27 | ||
Вот тебе пример твоей програмы, все работает! Ты задавал очень большие координаты, поэтому триугольник у тебя был большой и ты его не видел |
| Автор: KaraKum 14.3.2008, 13:15 | ||
| Вуаля! В InitGL() добавил функцию glMatrixMode(GL_MODELVIEW); и всё заработало! Большое спасибо Но с таймером так и не решилось:
|
| Автор: Graf_h 14.3.2008, 13:29 |
| Я ставил 2 таймера, и ничего не пожерало работало отлично и без тормозов! Здесь просто 25 раз в секунду вызывается твоя функция и все...Можеш сделать свой таймер, например через GetTickCount() |
| Автор: KaraKum 14.3.2008, 13:54 |
| Да я проверил. Хоть в диспетчере задач и написано, что прога потребляет 100% процессорного времени, но все остальные проги работают нормально, даже проигрыватель. Вобщем всё что хотел узнать - узнал. Спасибо. Вопрос решён. |