Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Помогите нарисовать детальку


Автор: drazah 10.5.2011, 13:52
Собственно сабж. Мысли есть, но как то все сложно.
Может кто опытным глазом глянет и скажет откуда подступиться, хотя бы на словах (сам алгоритм).

http://imageshost.ru/

Автор: BorisVorontsov 11.5.2011, 15:24
Картинка не отображается

Автор: Sartorius 11.5.2011, 16:34
Непонятно что тебе нужно. Нарисовать программно? В DirectX? В OpenGl? Нарисовать в 3D Max-е каком-нибудь?

Автор: Vetos 11.5.2011, 23:48
Ну на глаз, точки определяешь как черточки на часах, если надо в 3Д то еще нужно подумать на обединении треугольников или квадов, ну вопервых скажи вообще куда тебе это надо?

Автор: drazah 13.5.2011, 09:11
Цитата(Vetos @ 11.5.2011,  23:48)
Ну на глаз, точки определяешь как черточки на часах, если надо в 3Д то еще нужно подумать на обединении треугольников или квадов, ну вопервых скажи вообще куда тебе это надо?


Непонятно что тебе нужно. Нарисовать программно? В DirectX? В OpenGl? Нарисовать в 3D Max-е каком-нибудь?

Извиняюсь, что-то меня переклинило.

Значит, нужно это нарисовать программно, с помощью OpenGL.
Проблему вызывают "корона" и закругления сверху и снизу. 

Т.е. я, например, рисую фронтовую часть верхней фигуры с помощью gluPartialDisk, а как нарисовать скругленную часть (сверху). С каким-то маленьким шагом рисовать много прямоугольников вдоль радиуса скругления? С короной тоже непонятно. 

Автор: drazah 13.5.2011, 09:26
Вообще, раз уже пошло такое дело, то полностью мне надо нарисовать это:

http://imageshost.ru/

Только оно должно быть трехмерным. Вот я думал верхнюю детальку нарисовать программно и раскрасить, а на шестиугольник натянуть текстурку (тоже кстати вопрос как).

Автор: Vetos 14.5.2011, 16:13
Вот навоял за пару часов вот это
http://s2.ipicture.ru/Gallery/Viewfull/4462737.html
В коде можно изменить значения радиусов и подогнать форму, такую как тебе надо

Автор: Vetos 14.5.2011, 16:21
Если тебе это подходит то вот код который я написал:
-определяем типы и переменные:
Код

typedef struct _vert{
    GLfloat Coord[3];
}vert;

vert Vertex[256];

typedef struct _quad{
    GLuint Vertices[4];
    GLfloat Normal[3];
}quad;

quad Quads[70];

-инициализация(создание) детальки:
Код

void CreateCorone(){
//расчет всех точек нижней части короны
    //сзади
    int vertcount=0;
    for(int i=-35; i<36; i+=10 )
    {
        Vertex[vertcount].Coord[0] = 10 * sin( 3.14f/180*i ); 
        Vertex[vertcount].Coord[1] = 10 * cos( 3.14f/180*i );
        Vertex[vertcount].Coord[2] = -2; 
        Vertex[vertcount+8].Coord[0] = 12 * sin( 3.14f/180*i ); 
        Vertex[vertcount+8].Coord[1] = 12 * cos( 3.14f/180*i );
        Vertex[vertcount+8].Coord[2] = -2; 
        Vertex[vertcount+16].Coord[0] = 15 * sin( 3.14f/180*i ); 
        Vertex[vertcount+16].Coord[1] = 15 * cos( 3.14f/180*i );
        Vertex[vertcount+16].Coord[2] = -2; 
        vertcount++;
    }
    vertcount+=16;
    int nextface = vertcount;
    //спереди
    for(int i=-35; i<36; i+=10 )
    {
        Vertex[vertcount].Coord[0] = 10 * sin( 3.14f/180*i ); 
        Vertex[vertcount].Coord[1] = 10 * cos( 3.14f/180*i );
        Vertex[vertcount].Coord[2] = 2; 
        Vertex[vertcount+8].Coord[0] = 12 * sin( 3.14f/180*i ); 
        Vertex[vertcount+8].Coord[1] = 12 * cos( 3.14f/180*i );
        Vertex[vertcount+8].Coord[2] = 2; 
        Vertex[vertcount+16].Coord[0] = 15 * sin( 3.14f/180*i ); 
        Vertex[vertcount+16].Coord[1] = 15 * cos( 3.14f/180*i );
        Vertex[vertcount+16].Coord[2] = 2; 
        vertcount++;
    }
//присвоение квадам индексов точек
    //сзади
    int quadcount=0;
    for(int i=0;i<7;i++)
    {
        Quads[quadcount].Vertices[0] = i;
        Quads[quadcount].Vertices[1] = i+8;
        Quads[quadcount].Vertices[2] = i+9;
        Quads[quadcount].Vertices[3] = i+1;
        quadcount++;
        if((i%2)==0){
        Quads[quadcount].Vertices[0] = i+8;
        Quads[quadcount].Vertices[1] = i+16;
        Quads[quadcount].Vertices[2] = i+17;
        Quads[quadcount].Vertices[3] = i+9;
        quadcount++;}
    };
    //спереди
    for(int i=nextface;i<nextface+7;i++)
    {
        Quads[quadcount].Vertices[0] = i;
        Quads[quadcount].Vertices[1] = i+1;
        Quads[quadcount].Vertices[2] = i+9;
        Quads[quadcount].Vertices[3] = i+8;
        quadcount++;
        if((i%2)==0){
        Quads[quadcount].Vertices[0] = i+8;
        Quads[quadcount].Vertices[1] = i+9;
        Quads[quadcount].Vertices[2] = i+17;
        Quads[quadcount].Vertices[3] = i+16;
        quadcount++;}
    };
    //снизу и сверху
    for(int i=0; i<7; i++)
    {
        Quads[quadcount].Vertices[0] = i;
        Quads[quadcount].Vertices[1] = i+1;
        Quads[quadcount].Vertices[2] = i+nextface+1;
        Quads[quadcount].Vertices[3] = i+nextface;
        quadcount++;
        if((i%2)==0){
        Quads[quadcount].Vertices[0] = i+16;
        Quads[quadcount].Vertices[1] = i+16+nextface;
        Quads[quadcount].Vertices[2] = i+17+nextface;
        Quads[quadcount].Vertices[3] = i+17;
        quadcount++;}
        else{
        Quads[quadcount].Vertices[0] = i+8;
        Quads[quadcount].Vertices[1] = i+8+nextface;
        Quads[quadcount].Vertices[2] = i+8+nextface+1;
        Quads[quadcount].Vertices[3] = i+9;
        quadcount++;}
    }
    //побокам
    for(int i=0; i<8; i++)
    {
        if((i%2)==0){
        Quads[quadcount].Vertices[0] = i+8;
        Quads[quadcount].Vertices[1] = i+8+nextface;
        Quads[quadcount].Vertices[2] = i+16+nextface;
        Quads[quadcount].Vertices[3] = i+16;
        quadcount++;}else{
        Quads[quadcount].Vertices[0] = i+8;
        Quads[quadcount].Vertices[1] = i+16;
        Quads[quadcount].Vertices[2] = i+16+nextface;
        Quads[quadcount].Vertices[3] = i+8+nextface;
        quadcount++;}    
    }
    Quads[quadcount].Vertices[0] = 0;
    Quads[quadcount].Vertices[1] = nextface;
    Quads[quadcount].Vertices[2] = nextface+8;
    Quads[quadcount].Vertices[3] = 8;
    quadcount++;
    Quads[quadcount].Vertices[0] = 7;
    Quads[quadcount].Vertices[1] = 15;
    Quads[quadcount].Vertices[2] = 7+nextface+8;
    Quads[quadcount].Vertices[3] = 7+nextface;
    quadcount++;
    //расчитаем нормали, это нужно для освещения
    CalcNormals( Quads, quadcount );
}

-функция отрисовки всей беды:
Код

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    
    glLoadIdentity();                                    
    glTranslatef(0.0f,-13.0f,-30.0f);                        
    glRotatef(rtri,0.0f,1.0f,0.0f);      
    glColor3f(1.0f,0.5f,0.0f);
    glBegin(GL_QUADS);
    for(int i=0; i<70; i++)
    {
        glNormal3fv(Quads[i].Normal);
        glVertex3fv(Vertex[Quads[i].Vertices[0]].Coord);
        glVertex3fv(Vertex[Quads[i].Vertices[1]].Coord);
        glVertex3fv(Vertex[Quads[i].Vertices[2]].Coord);
        glVertex3fv(Vertex[Quads[i].Vertices[3]].Coord);
    }

    glEnd();


-ну и наконец функция расчета нормалей:
Код

void CalcNormals( quad * Quads, int quadsCount )
{
    GLfloat v1[3], v2[3], d;
    for(int i=0; i<quadsCount; i++)
    {
        for(int j=0;j<3;j++) 
        {   
            v1[j]=Vertex[Quads[i].Vertices[0]].Coord[j]-Vertex[Quads[i].Vertices[1]].Coord[j]; 
            v2[j]=Vertex[Quads[i].Vertices[1]].Coord[j]-Vertex[Quads[i].Vertices[2]].Coord[j]; 
        }
        Quads[i].Normal[0] = v1[1]*v2[2]- v1[2]*v2[1]; 
        Quads[i].Normal[1] = v1[2]*v2[0]- v1[0]*v2[2]; 
        Quads[i].Normal[2] = v1[0]*v2[1]- v1[1]*v2[0];
        d = sqrt(Quads[i].Normal[0]*Quads[i].Normal[0]+Quads[i].Normal[1]*Quads[i].Normal[1]+Quads[i].Normal[2]*Quads[i].Normal[2]);  
        Quads[i].Normal[0] /= d; 
        Quads[i].Normal[1] /= d; 
        Quads[i].Normal[2] /= d;
    }
};


Думаю если тебе это пригодиться, то верхнюю часть ты сделаешь и сам, единственное не забывай размещать точки в квадах против часовой стрелки от лицевой стороны, иначе нормали будут смотреть не в ту сторонуsmile Удачи! 

Автор: Vetos 15.5.2011, 15:48
Всетаки интересно стало доделать доконца, вот что у меня получилось:
http://s2.ipicture.ru/

Все присутствует в архиве: Текстура, исполняемый файл, исходный код. Незабудь плюсанутьsmile
Выглядит кривовато, но если поиграть с радиусами, углами, масштабированием и текстурными координатами,
можно подогнать под то что надо! 

Автор: drazah 16.5.2011, 08:48
Добрался до интернета - буду курить код.
Vetos, ты мужик! Спасибо огромное smile

Плюсануть не дают - мало постов ((. Извини.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)