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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите нарисовать детальку 
:(
    Опции темы
drazah
Дата 10.5.2011, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

user posted image
PM MAIL   Вверх
BorisVorontsov
Дата 11.5.2011, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

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



Картинка не отображается


--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
Sartorius
Дата 11.5.2011, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Непонятно что тебе нужно. Нарисовать программно? В DirectX? В OpenGl? Нарисовать в 3D Max-е каком-нибудь?
PM MAIL ICQ   Вверх
Vetos
Дата 11.5.2011, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
drazah
Дата 13.5.2011, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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


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

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

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

Т.е. я, например, рисую фронтовую часть верхней фигуры с помощью gluPartialDisk, а как нарисовать скругленную часть (сверху). С каким-то маленьким шагом рисовать много прямоугольников вдоль радиуса скругления? С короной тоже непонятно. 
PM MAIL   Вверх
drazah
Дата 13.5.2011, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

user posted image

Только оно должно быть трехмерным. Вот я думал верхнюю детальку нарисовать программно и раскрасить, а на шестиугольник натянуть текстурку (тоже кстати вопрос как).
PM MAIL   Вверх
Vetos
Дата 14.5.2011, 16:13 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот навоял за пару часов вот это
user posted image
В коде можно изменить значения радиусов и подогнать форму, такую как тебе надо

Это сообщение отредактировал(а) Vetos - 14.5.2011, 16:35


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
Vetos
Дата 14.5.2011, 16:21 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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 - 14.5.2011, 16:31

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  lesson5.rar 32,11 Kb


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
Vetos
Дата 15.5.2011, 15:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всетаки интересно стало доделать доконца, вот что у меня получилось:
user posted image

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

Это сообщение отредактировал(а) Vetos - 15.5.2011, 21:09

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  Polack.rar 160,67 Kb


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
drazah
Дата 16.5.2011, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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


Это сообщение отредактировал(а) drazah - 16.5.2011, 08:49
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

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

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


 




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


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

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