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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нет объёмности (неправильное построение сцены) 
:(
    Опции темы
Tatikoma
Дата 19.1.2012, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте.
Я загружаю модель из файла, и отрисовываю её так:
Код

    glMatrixMode(GL_MODELVIEW);
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);
    glNormalPointer (GL_FLOAT, 0, objChainN);
    glVertexPointer(3, GL_FLOAT, 0, objChain);
    glDrawArrays(GL_TRINAGLES, 0, sizeChain);
    glDisableClientState(GL_NORMAL_ARRAY);
    glDisableClientState(GL_VERTEX_ARRAY);

в результате получаю картинку :
user posted image
, собственно хочется визуальной объёмности, а не результата моей криворукости, подскажите в чём проблема.

Инициализация:
Код

    glClearColor(1, 1, 1, 1);
    glEnable(GL_TEXTURE_2D);
    glShadeModel(GL_SMOOTH);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHTING);
    GLfloat LightAmbient[]= { 1.5f, 1.5f, 1.5f, 1.0f }; 
    GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f }; 
    GLfloat LightPosition[]= { 0.0f, 0.0f, -0.2f, 0.0f };  
    glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);   
    glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);   
    glLightfv(GL_LIGHT1, GL_POSITION, LightPosition);   
    glEnable(GL_LIGHT1);
    glEnable(GL_COLOR_MATERIAL);



Это сообщение отредактировал(а) Tatikoma - 19.1.2012, 15:07
PM MAIL   Вверх
tzirechnoy
Дата 19.1.2012, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



Чисто визуально выглядит, будто нормали наложылись только на часть модэли (на ту, которая с блёстками), притом совсем не те, что нужно.

Если всё ещё в тупике -- покажыте код, который грузит модэль и сам файл модэли.


PM MAIL   Вверх
Tatikoma
Дата 19.1.2012, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



файл модели .obj пример его содержания:
Код

...
v 1.250000 0.000000 0.000000
...
vn -0.016962 0.965787 0.258782
...
f 436//147 449//147 437//147

Если я всё правильно разобрался то первое это точки, второе это нормали(у меня была такая же идея что причина в нормалях но развить не смог), а по третьим данным я собирают треугольники. В правильности считывания точек, у меня есть уверенность, т.к. если заменить glDrawArrays(GL_TRINAGLES, 0, sizeChain); на glDrawArrays(GL_LINE_STRIP, 0, sizeChain); то вижу каркас модели каким он и должен быть. собственно нормали считываю так:
Код

static GLfloat objChainN[5000][3];
...
QFile objFile(filename);
    if (!objFile.open( QIODevice::ReadOnly | QIODevice::Text)) {
        qDebug() << "Error";
        return;
    }

    QTextStream di(&objFile);
...
if (word.compare("vn") == 0)
        {
            di >> objChainN[sizeN][0];

            di >> objChainN[sizeN][1];

            di >> objChainN[sizeN][2];
            sizeN++;
        }
...

использование нормалей я привёл в первом сообщении, спасибо за отклик
PM MAIL   Вверх
tzirechnoy
Дата 19.1.2012, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



Ну, так вот по третьим данным (f ...) и надо нормали собирать. Насколько правильно Вы это делаете?

Добавлено через 1 минуту и 51 секунду
Да, на .obj есть документацыя -- http://www.martinreddy.net/gfx/3d/OBJ.spec
PM MAIL   Вверх
Tatikoma
Дата 19.1.2012, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Сделал, получилось, громадное спасибо вам!
PM MAIL   Вверх
Tatikoma
Дата 25.1.2012, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



И вот меня за терзали сомнения, а правильны ли нормали?
user posted imageuser posted image

Это сообщение отредактировал(а) Tatikoma - 25.1.2012, 11:26
PM MAIL   Вверх
tzirechnoy
Дата 25.1.2012, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



Нет. Во-первых, Вы явно присвоили всем треугольникам один комплект нормалей. Кроме того, это могло так повезти -- но возможно, что и не комплект нормалей, а одну нормаль одному углу каждого треугольника.

(Выложыте ужэ код куда-нибудь, компилирующийся. А то это гадание на рисунках -- весьма условно).
PM MAIL   Вверх
Tatikoma
Дата 25.1.2012, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ещё немного доработал код но теперь, вид как на первой картинке только совсем без бликов.

widget.cpp
widget.h

или целиком проект лучше?

Это сообщение отредактировал(а) Tatikoma - 25.1.2012, 19:28
PM MAIL   Вверх
tzirechnoy
Дата 25.1.2012, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



(.text+0x20): undefined reference to `main'


Ну да, ну да.
PM MAIL   Вверх
Tatikoma
Дата 25.1.2012, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



PM MAIL   Вверх
tzirechnoy
Дата 26.1.2012, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



Нормали вроде вполне правильные. Со светом надо работать:

1) Не задан material (glMaterialfv). Что он там подставляет -- судя по всему, implementation-defined.
2) Не задана, но включена текстура.
3) Значения цветов в glLight выходят за 1.0.

PM MAIL   Вверх
tzirechnoy
Дата 26.1.2012, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



Ну и, конечно, код загрузки .obj -- совсем кривой. То есть этот файл он загружает, но так нельзя.
PM MAIL   Вверх
Tatikoma
Дата 27.1.2012, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(tzirechnoy @ 26.1.2012,  12:37)
Нормали вроде вполне правильные. Со светом надо работать:

1) Не задан material (glMaterialfv). Что он там подставляет -- судя по всему, implementation-defined.
2) Не задана, но включена текстура.
3) Значения цветов в glLight выходят за 1.0.

материал задал :
Код

    GLfloat front_color[] = {0,1,0,1};
    GLfloat back_color[] = {0,0,1,1};
    glMaterialfv(GL_FRONT, GL_DIFFUSE, front_color);
    glMaterialfv(GL_BACK, GL_DIFFUSE, back_color);

если выключить текстуру, то объект не виден совсем, обязательно надо текстурировать?
значение цветов по правил.
Код

  GLfloat LightAmbient[]= { 1.0f, 1.0f, 1.0f, 1.0f };

особо чтению файла внимания не уделял, важно было получить результат - нормальное отображение объекта.
что по вашему там не корректно?
PM MAIL   Вверх
tzirechnoy
Дата 27.1.2012, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



По некорректному в файле (но, повторюсь, работающему на этом примере):  

 -- вертексы и нормали читаются по слогам, окончание строки никак не проверяется (хотя ограничитель -- именно строка).
 -- в элементах подразумевается единственный разделитель - пробел (там ещё табы), по-моему к тому жэ в единственном числе
 -- в элементах не отрабатываются варианты присутствия текстурных координат и отсутствия и текстурных и нормалей.


По свету:

 1) нет, текстурировать совсем необязательно. Оно, скорее всего, не невидно, оно просто всё белое.
 2) Выкиньте glOrtho. Ну, или хотя бы сделайте его в GL_PROJECTION. Поскольку все так делают. 
Не то, чтобы в принцыпе нельзя было glOrtho в GL_MODELVIEW -- но во-первых, в реальных сцэнах свет как раз всё освещает вне зависимости от всяких спецыфических проекцый, связанных со строением глаза, во-вторых именно (и только) чтобы не было проблем со светом ввели две матрицы -- GL_MODELVIEW и GL_PROJECTION, а в-третьих Ваш параллелипипед со сторонами 1:100 как раз и сносит крышу свету.
 3) Лучшэ задать все 3 базовых цвета света и 4 материала вручную -- надёжней и понятней. Типичным началом будет для материала задать DIFFUSE и AMBIENT в равные значения где-нибудь в районе 0.8(*цвет), EMISSION обнулить, SPECULAR в зависимости от предполагаемой глянцэвости. В свете приравнять SPECULAR и DIFFUSE, баланс между ними и AMBIENT ужэ по виду теней, всё от 0.2 до 1.0.


Код

    glDisable(GL_TEXTURE_2D);
    glDisable(GL_TEXTURE_3D);
    glDisable(GL_TEXTURE_1D);
    glClearColor(1, 1, 1, 1); 
    glShadeModel(GL_FLAT);
    glEnable(GL_DEPTH_TEST);
    glDisable(GL_CULL_FACE);
    glEnable(GL_LIGHTING);
    GLfloat LightAmbient[]= { 0.9f, 0.9f, 0.9f, 1.0f }; // п~Wп╫п╟я~Gп╣п╫п╦я~O я~Dп╬п╫п╬п╡п╬пЁп╬ я~Aп╡п╣я~Bп╟ ( п~]п~^п~Rп~^п~U )
    GLfloat LightDiffuse[]= { 0.9f, 0.9f, 0.9f, 1.0f }; // п~Wп╫п╟я~Gп╣п╫п╦я~O п╢п╦я~Dя~Dя~Cп╥п╫п╬пЁп╬ я~Aп╡п╣я~Bп╟ ( п~]п~^п~Rп~^п~U )
    GLfloat LightSpecular[] = { 0.2f, 0.2f, 0.2f, 1.0f };
    GLfloat LightPosition[]= { +0.4f, +0.4f, +18, 0.0f };     // п~_п╬п╥п╦я~Fп╦я~O я~Aп╡п╣я~Bп╟ ( п~]п~^п~Rп~^п~U )
    GLfloat MatSpecular[] = { 0.1, 0.1, 0.9, 1.0 };
    GLfloat MatEmission[] = {0.1, 0.1, 0.1, 1 };
    GLfloat MatAmbient[] = {0.1, 0.1, 0.8, 1.0};
    GLfloat MatDiffuse[] = {0.8, 0.0, 0.0, 1.0};
    glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 0); 
    glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient);    // пёя~Aя~Bп╟п╫п╬п╡п╨п╟ п╓п╬п╫п╬п╡п╬пЁп╬ п║п╡п╣я~Bп╟
    glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);    // пёя~Aя~Bп╟п╫п╬п╡п╨п╟ п~Tп╦я~Dя~Dя~Cп╥п╫п╬пЁп╬ п║п╡п╣я~Bп╟
    glLightfv(GL_LIGHT0, GL_SPECULAR, LightSpecular);
    glLightfv(GL_LIGHT0, GL_POSITION, LightPosition);   // п~_п╬п╥п╦я~Fп╦я~O я~Aп╡п╣я~Bп╟
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, MatSpecular);
    glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, MatEmission);
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, MatAmbient);
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MatDiffuse);
    glEnable(GL_LIGHT0);
    glDisable(GL_COLOR_MATERIAL);


PS А, да, при рисовании включите GL_NORMALIZE. Для этого файла это, опять жэ, неважно -- но вообще говоря в .obj нормали необязательно нормализованы.
PM MAIL   Вверх
Tatikoma
Дата 28.1.2012, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Большое спасибо за помощь и пояснения буду разбираться.
Такое чтение файла связано с тем что я точно знаю его содержание ибо сам же его и создаю, с параметрами не позволяющими произвести не корректное чтение. Ну это так к слову.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

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

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


 




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


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

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