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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: 3D планеты, помогите новичку  (Прочитано 14872 раз)
ufna
Гость
« Ответ #15 : Октябрь 03, 2010, 20:27 »

дак есть же в QtDemo примерчики красивые, там даже что-то крутится вокруг чего-то
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Октябрь 03, 2010, 20:31 »

Цитировать
Кстати там есть ф-ция для создания сферы.
не подскажете? вся проблема в том, что этого времени нет. Да и openGL меня интересует в самой меньшей степени, так как дальше им заниматься не собираюсь (другие планы). Просто пришлось по теме диплома его использовать. Если сможете помочь, буду признателен. только не надо заставлять учить, было бы время и желание - так бы и сделал=)
Подсказать ф-цию gluSphere не проблема, но ведь на этом Ваши проблемы не кончатся  Улыбающийся. В задаче ничего особенного нет, но в любом случае повозиться придется. Считая все доделки - с неделю (считая что всей "кухней" владеем, иначе больше). Я сам не смогу, напишите в личку, порекомендую нормальных пацанов с этого форума. Разумеется это работа за деньги.
Записан
spirits25
Гость
« Ответ #17 : Октябрь 10, 2010, 19:42 »

 
Код:
   glPushMatrix();
    qMultMatrix(mat);
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, faceColor);

    //stars();
    GLUquadric* quad = gluNewQuadric();
    gluSphere (quad, 10.0d, 40, 40);
    gluDeleteQuadric(quad);

    glTranslated(15.0d,15.0d,15.0d);
    glColor3d(1,0,0);

    GLUquadric* quad2 = gluNewQuadric();
    gluSphere (quad2, 2.0d, 10, 10);
    gluDeleteQuadric(quad2);

    GLUquadric* quad3 = gluNewQuadric();
    glTranslated(-35.0d,30.0d,10.0d);
    gluSphere (quad3, 5.5d, 10, 10);
    gluDeleteQuadric(quad3);

    glPopMatrix();

допустим есть такой вывод сфер. пространство у меня 100 единиц. Как лучше сделать функцию void stars(), чтобы на заднем плане звёзды были видны, а на переднем, соответственно, нет?
и ещё, GLUquadric* quad = gluNewQuadric(); для каждого объекта ведь не нужно новый создавать?
« Последнее редактирование: Октябрь 10, 2010, 19:45 от spirits25 » Записан
spirits25
Гость
« Ответ #18 : Октябрь 25, 2010, 18:37 »

может хотя бы это подскажите. есть сфера, нужно текстуру натянуть.
сфера строится с помощью функции:

Код:
//-----------------------------------------------------------------------------
// Name: renderSphere()
// Desc: Create a sphere centered at cy, cx, cz with radius r, and
//       precision p. Based on a function Written by Paul Bourke.
//       http://astronomy.swin.edu.au/~pbourke/opengl/sphere/
//-----------------------------------------------------------------------------
void renderSphere( float cx, float cy, float cz, float r, int p )
{
    const float PI     = 3.14159265358979f;
    const float TWOPI  = 6.28318530717958f;
    const float PIDIV2 = 1.57079632679489f;

    float theta1 = 0.0;
    float theta2 = 0.0;
    float theta3 = 0.0;

    float ex = 0.0f;
    float ey = 0.0f;
    float ez = 0.0f;

    float px = 0.0f;
    float py = 0.0f;
    float pz = 0.0f;

    // Disallow a negative number for radius.
    if( r < 0 )
        r = -r;

    // Disallow a negative number for precision.
    if( p < 0 )
        p = -p;

    // If the sphere is too small, just render a OpenGL point instead.
    if( p < 4 || r <= 0 )
    {
        glBegin( GL_POINTS );
        glVertex3f( cx, cy, cz );
        glEnd();
        return;
    }

    for( int i = 0; i < p/2; ++i )
    {
        theta1 = i * TWOPI / p - PIDIV2;
        theta2 = (i + 1) * TWOPI / p - PIDIV2;

        glBegin( GL_TRIANGLE_STRIP );
        {
            for( int j = 0; j <= p; ++j )
            {
                theta3 = j * TWOPI / p;

                ex = cosf(theta2) * cosf(theta3);
                ey = sinf(theta2);
                ez = cosf(theta2) * sinf(theta3);
                px = cx + r * ex;
                py = cy + r * ey;
                pz = cz + r * ez;

                glNormal3f( ex, ey, ez );
                glTexCoord2f( -(j/(float)p) , 2*(i+1)/(float)p );
                glVertex3f( px, py, pz );

                ex = cosf(theta1) * cosf(theta3);
                ey = sinf(theta1);
                ez = cosf(theta1) * sinf(theta3);
                px = cx + r * ex;
                py = cy + r * ey;
                pz = cz + r * ez;

                glNormal3f( ex, ey, ez );
                glTexCoord2f( -(j/(float)p), 2*i/(float)p );
                glVertex3f( px, py, pz );
            }
        }
        glEnd();
    }
}

необходимо текстуру (собственно карту земли) натянуть на неё..
ведб по-любому есть у кого-то исходники этого. Заранее спасибо=)
Записан
spirits25
Гость
« Ответ #19 : Декабрь 14, 2010, 21:49 »

наговнокодил примерно следующее:
Код:
void Patch::draw() const
{
    GLbyte *pBytes;
    glPushMatrix();
    qMultMatrix(mat);
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, faceColor);

    GLint Width, Height, Components;
    GLenum Format;
    GLUquadric* quad = gluNewQuadric();
//----------
    glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
    pBytes = gltLoadTGA("earth.tga", &Width, &Height, &Components, &Format);

    if (pBytes == NULL)
        exit (2);
    glTexImage2D(GL_TEXTURE_2D, 0, Components, Width, Height, 0, Format, GL_UNSIGNED_BYTE, pBytes);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    glEnable(GL_TEXTURE_2D);
   
    glBindTexture(GL_TEXTURE_2D,15);
//----------
    gluQuadricTexture(quad, GL_TRUE);
    gluQuadricDrawStyle(quad, GLU_FILL);
    gluSphere (quad, 10.0d, 20, 20);
    gluDeleteQuadric(quad);
    free(pBytes);
    glTranslated(15.0d,15.0d,15.0d);
    glColor3d(1,0,0);
    glDisable(GL_TEXTURE_2D);

//----------------------------------------------------------------------------------
    GLUquadric* quad2 = gluNewQuadric();
     glEnable(GL_TEXTURE_2D);
     GLbyte *pBytes2;
    glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
    pBytes2 = gltLoadTGA("luna.tga", &Width, &Height, &Components, &Format);

    if (pBytes2 == NULL)
        exit (2);
    glTexImage2D(GL_TEXTURE_2D, 0, Components, Width, Height, 0, Format, GL_UNSIGNED_BYTE, pBytes2);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

    glBindTexture(GL_TEXTURE_2D,15);

    gluQuadricTexture(quad2, GL_TRUE);
    gluQuadricDrawStyle(quad2, GLU_FILL);
    gluSphere (quad2,  2.0d, 10, 10);


    gluDeleteQuadric(quad2);
    free(pBytes2);
    glTranslated(15.0d,15.0d,15.0d);
    glColor3d(1,0,0);
    glDisable(GL_TEXTURE_2D);

//------------------------------------------------------------------
    GLUquadric* quad3 = gluNewQuadric();
     glEnable(GL_TEXTURE_2D);
     GLbyte *pBytes3;
    glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
    pBytes3 = gltLoadTGA("luna.tga", &Width, &Height, &Components, &Format);

    if (pBytes3 == NULL)
        exit (2);
    glTexImage2D(GL_TEXTURE_2D, 0, Components, Width, Height, 0, Format, GL_UNSIGNED_BYTE, pBytes3);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

    glBindTexture(GL_TEXTURE_2D,15);

    gluQuadricTexture(quad3, GL_TRUE);
    gluQuadricDrawStyle(quad3, GLU_FILL);
    gluSphere (quad3, 5.5d, 20, 20);
    gluDeleteQuadric(quad3);
    free(pBytes3);
    glTranslated(-35.0d,30.0d,10.0d);
    glColor3d(1,0,0);
    glDisable(GL_TEXTURE_2D);

    glPopMatrix();

это рисует три сферы (большая в центре с текстурой земли, одна с текстурой луны и маленькая). Мне нужно к маленькой приделать два параллелепипеда по сторонам (солнечные батареи). рисую, но ничего не видно. Почему? подскажите, плиз..
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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