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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему ничего не видно? в OGL 
:(
    Опции темы
Гость_Pol
Дата 2.5.2005, 15:25 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Недавно начал изучать OGL и столкнулся с такой проблемой :
набираю пример из книжки - все ок, но как только я меняю выводимый обьект в дисплейном списке
glNewList();
glEndList();
то сразу же на экране ничего не появляется.
Как с этим бороться?
  Вверх
Batou
Дата 2.5.2005, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



побольше подробностей плzzz
--------------------
.GitS.Мысли творят действительность , а бремя доказательства лежит на сомневающемся.
PM MAIL WWW   Вверх
gepard
Дата 3.5.2005, 04:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Подробнее, мы не экстрасенсы...


--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
Guest
Дата 3.5.2005, 16:05 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Код

#include<gl\glut.h>
#include<string>
#include<windows.h>

using namespace std;


int WinWidth = 640;//Ширина окна
int WinHeight = 480;//Высота окна

GLfloat rotation_angle_x = 0;//Уго поворота сцены вокруг оси Ox
GLfloat rotation_angle_y = 0;//Уго поворота сцены вокруг оси Oy
GLfloat axial_displacement_x = 0;//Сдвиг по оси Ox
GLfloat axial_displacement_y = 0;//Сдвиг по оси Oy
GLfloat axial_displacement_z = -9;//Сдвиг по оси Oz

GLint active_plane = 0;//Активная плоскость : 0 - Oxy, 1 - Oxz
const string tstr[2] = {"Translate Oxy", "Translate Oxz"};
int mouse_coord_x, mouse_coord_y;//координаты курсора мыши по оси Ox и Oy соответственно

bool left_button_down = false;//показывает нажата ли левая кнопка мыши или нет
bool right_button_down = false;//показывает нажата ли правая кнопка мыши или нет

GLint list = 0;


GLint n_cols=0;
GLint n_rows=0;


void Init()//Инициализация OpenGL
{
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_COLOR_MATERIAL);
    glColor3f(0.1,0.7,0.2);
    glClearColor(0.5,0.5,0.75,1);
    
    list = glGenLists(1);
    //GLint i,j;
    glNewList(list, GL_COMPILE);
        glutSolidTeapot(0.1);
        glBegin(GL_LINE);
            glVertex3i(0,0,0);
            glVertex3i(10,0,0);
            glVertex3i(0,0,0);
            glVertex3i(0,10,0);
            glVertex3i(0,0,0);
            glVertex3i(0,0,10);
        glEnd();
    glEndList();
}

void Display(void)// Обновление содержимого экрана
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//очистка рабочего буфера

    glPushMatrix();//сохранение в стек текущей матрицы вида
    glTranslatef(axial_displacement_x,axial_displacement_y,axial_displacement_z);//Задание смещения вдоль осей Ox, Oy, Oz соответственно
    glRotatef(rotation_angle_x,1,0,0);//Задание вращения по оси Ox вдоль прямой проведенной через начало координат и точкой (1,0,0)
    glRotatef(rotation_angle_y,0,1,0);//Задание вращения по оси Oy вдоль прямой проведенной через начало координат и точкой (0,1,0)
    glCallList(list);//Вывод обьекта на экран
    glPopMatrix();//восстановление предыдущего значения текущей матрицы преобразований
    glutSwapBuffers();//переключение буферов

}

void Keyboard(unsigned char key, int x, int y)//Обработка сообщений от клавиатуры
{
    switch(key)
    {
        case VK_ESCAPE: // если нажата клавиша <ESC> - выход
            if(list) glDeleteLists(list,1);//удалить дисплейный список
            exit(0);
        break;
    }
}

void KeyboardSpecial(int key, int x, int y)
{
    switch(key)
    {
        case GLUT_KEY_F1://Если нажата клавиша <F1>
        {
            active_plane = (active_plane + 1)%2;//Смена плоскости перемещения
            glutSetWindowTitle(tstr[active_plane].c_str());//Изменение заголовка окна
        }

    }
}

void Reshape(int Width,int Height)//Обработка изменения размера окна
{
    glViewport(0,0,Width,Height);
    WinWidth = Width;//Запоминание новой ширины
    WinHeight = Height;//Запоминание новой высоты
    glMatrixMode(GL_PROJECTION);//изменение матрицы проекций
    glLoadIdentity();//приравнивание матрицы проекций к единичной
    gluPerspective(45,GLdouble(WinWidth)/WinHeight,1,100);//создание матрицы перспективы
    //glOrtho(10,10,10,10,100,100);
    glMatrixMode(GL_MODELVIEW);//возврат к матрице вида
    glLoadIdentity();//приравнивание матрицы вида к единичной
    glutPostRedisplay();//вызов функции Display(), т.е. перерисовка окна
}

void Mouse(int button, int state, int x, int y)//Обработка щелчков мыши
{
    if(button == GLUT_LEFT_BUTTON)//Левая кнопка мыши
    {
        switch(state)
        {
            case GLUT_DOWN://Если нажата,
                left_button_down = true;//установить флаг
                mouse_coord_x = x;//Запимнить координату X мыши
                mouse_coord_y = y;//Запимнить координату Y мыши
                break;
            case GLUT_UP:
                left_button_down = false;
                break;
        }
    }
    if(button == GLUT_RIGHT_BUTTON)//Правая кнопка мыши
    {
        switch(state)
        {
            case GLUT_DOWN://Если нажата,
                right_button_down = true;//установить флаг
                mouse_coord_x = x;//Запимнить координату X мыши
                mouse_coord_y = y;//Запимнить координату Y мыши
                break;
            case GLUT_UP:
                right_button_down = false;
                break;
        }
    }
}

void MouseMotion(int x, int y)
{
    if(left_button_down)//Левая кнопка мыши нажата
    {
        rotation_angle_x += 0.5*(y - mouse_coord_y);//Изменение угла поворота вокруг Ox
        rotation_angle_y += 0.5*(x - mouse_coord_x);//Изменение угла поворота вокруг Oy
        mouse_coord_x = x;
        mouse_coord_y = y;
        glutPostRedisplay();
    }
    if(right_button_down)//Правая кнопка мыши нажата
    {
        axial_displacement_x += 0.01*(x - mouse_coord_x);//Перемещение вдоль Ox
        if(active_plane) axial_displacement_z += 0.01*(y-mouse_coord_y);//Перемещение вдоль Oz
        else axial_displacement_y += 0.01*(mouse_coord_y-y);//Перемещение вдоль Oy
        mouse_coord_x = x;
        mouse_coord_y = y;
        glutPostRedisplay();
    }
}

void MousePassiveMotion(int x, int y)
{
    char buf[80];
    sprintf(buf,"Mouse coords is: x=%d; y=%d", x, y);
    glutSetWindowTitle(buf);
}

int main(int argc, char *argv[])
{

    
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(WinWidth, WinHeight);
    glutInitWindowPosition((glutGet(GLUT_SCREEN_WIDTH)-WinWidth)/2,(glutGet(GLUT_SCREEN_HEIGHT)-WinHeight)/2);
    glutCreateWindow("Demo");
    Init();
    glutDisplayFunc(Display);
    glutKeyboardFunc(Keyboard);
    glutSpecialFunc(KeyboardSpecial);
    glutReshapeFunc(Reshape);
    glutMouseFunc(Mouse);
    glutMotionFunc(MouseMotion);
         glutPassiveMotionFunc(MousePassiveMotion);
    glutMainLoop();
    
    return 0;
}



Собственно код программы
  Вверх
Гость_Pol
Дата 3.5.2005, 16:06 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











предыдущий пост мой smile
  Вверх
DENNN
Дата 4.5.2005, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

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



Код

void Display(void)// Обновление содержимого экрана
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//очистка рабочего буфера
    glPushMatrix();//сохранение в стек текущей матрицы вида
    glTranslatef(axial_displacement_x,axial_displacement_y,axial_displacement_z);//Задание смещения вдоль осей Ox, Oy, Oz соответственно
    glRotatef(rotation_angle_x,1,0,0);//Задание вращения по оси Ox вдоль прямой проведенной через начало координат и точкой (1,0,0)
    glRotatef(rotation_angle_y,0,1,0);//Задание вращения по оси Oy вдоль прямой проведенной через начало координат и точкой (0,1,0)
    glCallList(list);//Вывод обьекта на экран
    glPopMatrix();//восстановление предыдущего значения текущей матрицы преобразований
    glutSwapBuffers();//переключение буферов
}

Я бы здесь все же сделал
Код

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
    glTranslatef(axial_displacement_x,axial_displacement_y,axial_displacement_z);//Задание смещения вдоль осей Ox, Oy, Oz соответственно
    glRotatef(rotation_angle_x,1,0,0);//Задание вращения по оси Ox вдоль прямой проведенной через начало координат и точкой (1,0,0)
    glRotatef(rotation_angle_y,0,1,0);//Задание вращения по оси Oy вдоль прямой проведенной через начало координат и точкой (0,1,0)
    glCallList(list);//Вывод обьекта на экран

Собственно в чем смысл сохранения непонятно какой матрицы? Ведь только в этот момент ты и выполняешь прорисовку.
Да, если мне не изменяет память, то неплохо сказать через
Код

void glDrawBuffer(
  GLenum mode   
);

В какой буфер/буфера идет отрисовка, прежде чем переключать их через glutSwapBuffers();
И проверь, что gluPerspective() вызывается с корректными параметрами (просто лень с утра самому анализировать твои циферки smile ). кроме того, после задания перспективной проекции неплохо расположить камеру хотя бы через gluLookAt(); smile

Это сообщение отредактировал(а) DENNN - 4.5.2005, 08:41
PM ICQ   Вверх
Nemesis
Дата 4.6.2005, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 20.2.2005
Где: Москва

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



Все очень просто, код правильный, просто ты рисуешь линии, которые выходят за пределы видимости. Исправь маленькую вещь:

Код

void Init()//Инициализация OpenGL    
{    
    glEnable(GL_DEPTH_TEST);    
    glEnable(GL_LIGHTING);    
    glEnable(GL_LIGHT0);    
    glEnable(GL_COLOR_MATERIAL);    
    glColor3f(0.1,0.7,0.2);    
    glClearColor(0.5,0.5,0.75,1);    
     
    list = glGenLists(1);    
    //GLint i,j;    
    glNewList(list, GL_COMPILE);    
        glutSolidTeapot(0.1);    
        glBegin(GL_LINE);    
            glVertex3i(0,0,0);    
            glVertex3i(10,0,0);    
            glVertex3i(0,0,0);    
            glVertex3i(0,10,0);    
            glVertex3i(0,0,0);    
            glVertex3i(0,0,10);    
        glEnd();    
    glEndList();    
}


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

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

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


 




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


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

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