Russian Qt Forum
Ноябрь 25, 2024, 00:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: QT + OpenGL  (Прочитано 34630 раз)
taifun
Гость
« Ответ #30 : Ноябрь 11, 2009, 11:49 »

Точно окружность - это окружность, а диск - это диск. Не прав был.

значит строим диск, но не получается  Непонимающий
Код:
glBegin(GL_QUADS);
        for(int v = 0; v < numV; v++, v1+=dv){
            for(int u = 0; u < numU; u++, u1+=du){

                float angle1 = u1 * PI2 + PI * 1.5f;
                float x1 = cos(angle1) * v1;
                float y1 = sin(angle1) * v1;

                float angle2 = (u1 + du) * PI2 + PI * 1.5f;
                float x2 = cos(angle2) * v1;
                float y2 = sin(angle2) * v1;

                float angle3 = u1 * PI2 + PI * 1.5f;
                float x3 = cos(angle1) * (v1 + dv);
                float y3 = sin(angle1) * (v1 + dv);

                float angle4 = (u1 + du) * PI2 + PI * 1.5f;
                float x4 = cos(angle2) * (v1 + dv);
                float y4 = sin(angle2) * (v1 + dv);

                glVertex3f(x1, y1, center[2]);
                glVertex3f(x2, y2, center[2]);
                glVertex3f(x3, y3, center[2]);
                glVertex3f(x4, y4, center[2]);

            }
        }
    glEnd();
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #31 : Ноябрь 11, 2009, 12:08 »

значит строим диск, но не получается  Непонимающий

Давайте сначала улучшим процесс вычисления вертекса. Сведем все расчеты в 1 ф-цию и будем вызывать ее так

Код:
...
CalcDiskVertex(u, v, center, minRad, maxRad);
CalcDiskVertex(u + du, v, center, minRad, maxRad);
CalcDiskVertex(u + du, v + dv, center, minRad, maxRad);
CalcDiskVertex(u, v + dv, center, minRad, maxRad);
...
Где

minRad - радиус дырки (может быть 0)
maxRad - радиус диска

Теперь сама ф-ция

Код:
void CalcDiskVertex( float u, float v, const float center[3], float minRad, float maxRad )
{
  float angle = u * PI2 - PI / 2;  // используем параметр "u" для угла поворота

  float radius = minRad + (v  + 0.5f) * (maxRad - minRad);    // используем параметр "v" для радиуса

  glVertex3f(center[0] + cos(angle) * radius, center[1] + sin(angle) * radius, center[2]);  // готовченко!
}
Записан
taifun
Гость
« Ответ #32 : Ноябрь 12, 2009, 11:44 »

сфера - и опять не хватает мозгов, с 8 часов сижу :

Код:
void VMMutomo::drwShpere (const float center[3], float radius, int numU, int numV){
    if (numU < 1) numU = 1;
    if (numV < 1) numV = 1;

    float u1 = -0.5f, v1 = -0.5f;
    float du = 1.0f / numU;
    float dv = 1.0f / numV;
    float shift = radius/2;
    float startPoint[3] = { center[0] - shift, center[1] - shift, center[2] - shift};

    glBegin(GL_QUADS);
        for(int v = 0; v < numV; v++, v1+=dv){
            for(int u = 0; u < numU; u++, u1+=du){


                CalcShereVertex(u1,      v1,      u1,      center, radius);
                CalcShereVertex(u1 + du, v1,      u1 + du, center, radius);
                CalcShereVertex(u1 + du, v1 + dv, u1 + du, center, radius);
                CalcShereVertex(u1,      v1 + dv, u1,      center, radius);

            }
        }
    glEnd();
}

void VMMutomo::CalcShereVertex(float x, float y, float z, const float center[3], float radius){
    float ang1 = x * PI2 ;
    float ang2 =  ........;
    float x1 = center[0] + sin(ang1) * cos(ang2) * radius;
    float y1 = center[1] + sin(ang1) * sin(ang2) * radius;
    float z1 = center[2] + cos(ang2) * radius;
    glVertex3f(x1, y1, z1);
}
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #33 : Ноябрь 12, 2009, 12:12 »

сфера - и опять не хватает мозгов, с 8 часов сижу :
Такое самобичевание ни к чему Улыбающийся Возьмите лист бумаги, нарисуйте оси XY и окружность с центром (0, 0). Это сечение сферы в плоскости XY. Поставьте точку на окружности. Если у нас есть параметр "v" [-0.5f; +0.5f] то с координатой у все ясно

y = sin(v * PI) * radius;

x и z вычисляются почти так же как и для цилиндра, разница в том что радиус переменный. Больше y - меньше радиус и наоборот. Найдите как вычислить радиус для x и z. 
Записан
taifun
Гость
« Ответ #34 : Ноябрь 12, 2009, 15:27 »

x и z вычисляются почти так же как и для цилиндра, разница в том что радиус переменный. Больше y - меньше радиус и наоборот. Найдите как вычислить радиус для x и z. 

радиус для x и z  будет radius * (-y), то есть получается так:

Код:
void CalcShereVertex(float x, float y, float z, const float center[3], float radius){
    float ang1 = x * PI2;
    float ang2 = y * PI;
    float x1 = center[0] + cos(ang1) * (radius * (-y));
    float y1 = center[1] + sin(ang2) * radius;
    float z1 = center[2] + sin(ang1) * (radius * (-y));
    glVertex3f(x1, y1, z1);
}
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #35 : Ноябрь 12, 2009, 15:42 »

радиус для x и z  будет radius * (-y), то есть получается так:
Представьте что сфера - это арбуз. Вы отрезаете скибку сверху - ее радиус маленький. А посредине - самый большой. Так что не может быть -y. Думайте
Записан
taifun
Гость
« Ответ #36 : Ноябрь 12, 2009, 15:56 »

Radius = cos(v*pi) *radius
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #37 : Ноябрь 12, 2009, 16:11 »

Radius = cos(v*pi) *radius
Молодец, правильно. И эта формула берется не с потолка, ее можно вывести. Уравнение сферы

x*x + y*y + z*z = radius*radius;

Положим radius = 1 (для сферы радиус = масштаб, домножить на него всегда успеем)

x*x + y*y + z*z = 1.0f;

Отсюда

radius_xz = sqrt(1.0f - y * y);
radius_xz = sqrt(1.0f - sin(v * PI) * sin(v * PI));
radius_xz = cos(v * PI);

Ну что, пора замахнуться на торус (бублик). Или можно отдохнуть с наложением текстур Улыбающийся
Интересно также "раскрасить" модель, например u - красный цвет, v - синий
Записан
taifun
Гость
« Ответ #38 : Ноябрь 13, 2009, 08:45 »

ага, вот только закончу с сферой, вот строится полусфера:
Код:
void drwShpere (const float center[3], float radius, int numU, int numV){
    if (numU < 1) numU = 1;
    if (numV < 1) numV = 1;

    float u1 = -0.5f, v1 = -0.5f;
    float du = 1.0f / numU;
    float dv = 1.0f / numV;
    float shift = radius/2;
    float startPoint[3] = { center[0] - shift, center[1] - shift, center[2] - shift};

    glBegin(GL_QUADS);
        for(int v = 0; v < numV; v++, v1+=dv){
            for(int u = 0; u < numU; u++, u1+=du){


                CalcShereVertex(u1,      v1,      u1,      center, radius);
                CalcShereVertex(u1 + du, v1,      u1 + du, center, radius);
                CalcShereVertex(u1 + du, v1 + dv, u1 + du, center, radius);
                CalcShereVertex(u1,      v1 + dv, u1,      center, radius);

            }
        }
    glEnd();
}

void CalcShereVertex(float x, float y, float z, const float center[3], float radius){
    float ang1 = x * PI2;
    float ang2 = y * PI;
    float x1 = center[0] + sin(ang2) * cos(ang1) * radius;
    float y1 = center[1] + sin(ang2) * sin(ang1) * radius;
    float z1 = center[2] + cos(ang2) * radius;
    glVertex3f(x1, y1, z1);
}

а сфера никак ... я так полагаю чет с координатой z1 не то
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #39 : Ноябрь 13, 2009, 12:53 »

а сфера никак ... я так полагаю чет с координатой z1 не то
Ну наверное потому что Вы обозвали ее "Shere" - вот она и не хочет Улыбающийся

Код:
void CalcSphereVertex(float u, float v, const float center[3], float radius)
{
    float ang1 = u * PI2 - PI / 2;
    float ang2 = v * PI;
    float x1 = center[0] + cos(ang1) * cos(ang2) * radius;
    float y1 = center[1] + sin(ang2) * radius;
    float z1 = center[2] + sin(ang1) * cos(ang2) * radius;
    glVertex3f(x1, y1, z1);
}
Записан
taifun
Гость
« Ответ #40 : Ноябрь 13, 2009, 14:39 »

блин вроде с матиматекой не все так плохо у меня было в школе, алгебра - 4, геометрию 5 вообще обожал (или может дело в том что вообще отсутствует практика работы с полигонами) .... Пока почитаю про освещение и текстуры, а то чет сфера вообще уныло выглядит без освящения, а на скриншотах на разных сайтах по ОпенЖЛ замечательно выглядит, а с понедельника или на выходных буду думать над бубликом
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #41 : Ноябрь 13, 2009, 15:09 »

блин вроде с матиматекой не все так плохо у меня было в школе, алгебра - 4, геометрию 5 вообще обожал (или может дело в том что вообще отсутствует практика работы с полигонами) ....
Улыбающийся Не расстраивайтесь, 3D только кажется простым но это впечатление обманчиво.
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 23.