Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Технологии программирования > Программирование графики
Перезагрузить страницу 3D графикИ и OpenGL
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Sergio Sergio вне форума
Member
 
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 09.06.2003
По умолчанию 3D графикИ и OpenGL - 05.08.2003, 16:01

Если кто-нибудь пробовал рисовать 3D графики с помощью OpenGL, пришлите пожалуйста примерчик на g_serg_unk@mail.ru
Ответить с цитированием
  (#2 (permalink)) Старый
Ikshot Ikshot вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.06.2002
По умолчанию 05.08.2003, 23:39

Интерфейса именно для графиков у GL нету.

Усли точек очень много, и лежат они очень плотно, можно просто так:

Код:
float vertices[1600][3];

//Вычиление функции y=sin(x+z)
void CalculateVertices()
{
     int index=0;
     for(float x=0;x<4;x+=0.1)
          for(float z=0;z<4;z+=0.1)
          {
  vertices[index][0]=x;
  vertices[index][2]=z;
  vertices[index][1]=sin(x+z);
  index++;
          }
}

//Установка начальных режимов
void init (void)
{
    glClearColor(0.3,0.3,0.3,0.0);
    glEnable(GL_DEPTH_TEST);
    glShadeModel(GL_FLAT);
    CalculateVertices();

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3,GL_FLOAT,0,&vertices[0][0]);
}

//Отобразить точки графика
void display(void)
{
    //Очистить экран
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glColor3f(1.0,1.0,1.0);
    glLoadIdentity();

    glRotatef(angle,1,1,0);
    glDrawArrays(GL_POINTS,0,1600);

    //Переключить буферы
    glutSwapBuffers();
}
Но вообще-то это не кайф: во-первых осветить и текстурировать не получится, поскольку точки, а не полигоны (можно правда и точку текстурировать, но это тоже не кайф в данном случае).

Вариантов решения несколько - можно пересортировать точки после получения и рисовать не GL_POINTS, а скажем GL_TRIANGLE_STRIP.

Двугой радикальный вариант - воспользоваться интерфейсом вычислителей OpenGL, который строит кривые и поверхности Безье или NURBS интерфейсом GLU, там все можно делать и строить и текстурировать и освещать, но здесь есть один подводный камень: указанные интерфейсы строят НЕ ГРАФИК твоей функции, а график функции апроксимирующей (в первом случае) или интерполирующей (тоже аппроксимация, но более точная, во втором случае) ТВОЮ функцию, поэтому между узловыми (опорными точками, по которым строится поверхность, в этих точках у тебя есть значение твоей функции) значение этой аппроксимирующей функции реально не совпадает со значениями твоей функции. Вот тебе на всякий случай примерчик построения Безье поверхности:

Код:
#include <glut.h>

//Это опорные точки по которым строится сплайн
//какие-то две координаты представляют параметры
//твоей функции в этой точке, а третья - значение
GLfloat ctrlpoints[4][4][3]={
    {{-1.5,-1.5,4.0},{-0.5,-1.5,2.0},
                  {0.5,-1.5,-1.0},{1.5,-1.5,2.0}},
    {{-1.5,-0.5,1.0},{-0.5,-0.5,3.0},
                  {0.5,-0.5,0.0},{1.5,-0.5,-1.0}},
    {{-1.5,0.5,4.0},{-0.5,0.5,0.0},
                  {0.5,0.5,3.0},{1.5,0.5,4.0}},
    {{-1.5,1.5,-2.0},{-0.5,1.5,-2.0},
                  {0.5,1.5,0.0},{1.5,1.5,-1.0}}
};

void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glRotatef(85.0,1.0,1.0,1.0);
    glEvalMesh2(GL_FILL,0,20,0,20);
    glFlush();
}

void init()
{
    glClearColor(1.0,1.0,1.0,0.0);
    glMap2f(GL_MAP2_VERTEX_3,0,1,3,4,0,1,12,4,
                             &ctrlpoints[0][0][0]);
    glEnable(GL_MAP2_VERTEX_3);
    glMapGrid2f(20,0.0,1.0,20,0.0,1.0);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_AUTO_NORMAL);
    
    //Источники света
    GLfloat ambient[]={0.2,0.2,0.2,1.0};
    GLfloat position[]={0.0,0.0,2.0,1.0};
    GLfloat mat_diffuse[]={0.6,0.6,0.6,1.0};
    GLfloat mat_specular[]={1.0,1.0,1.0,1.0};
    GLfloat mat_shininess[]={50.0};

    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glLightfv(GL_LIGHT0,GL_AMBIENT,ambient);
    glLightfv(GL_LIGHT0,GL_POSITION,position);
    glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
    glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
    glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);
}

void reshape(int w, int h)
{
    glViewport(0,0,(GLsizei) w, (GLsizei) h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if (w<=h)
  glOrtho(-4.0,4.0,-4.0*(GLfloat)h/(GLfloat)w,
                                             4.0*(GLfloat)h/(GLfloat)w,-4.0,4.0);
    else
  glOrtho(-4.0*(GLfloat)w/(GLfloat)h,
                                             4.0*(GLfloat)w/(GLfloat)h,
                                             -4.0,4.0,-4.0,4.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glRotatef(85.0,1.0,1.0,1.0);
}

int main(int argc, char **argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);
    glutInitWindowSize(620,620);
    glutInitWindowPosition(100,100);
    glutCreateWindow("Using Evaluators for Textures");
    init();
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMainLoop();
    return 0;    
}
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Графики Starcore Visual C++ 2 05.01.2012 19:04
Графики Starcore Любые вопросы от новичков 0 04.01.2012 21:51
Графики сеансов Forum3 DHTML, JavaScript, VBScript 0 11.11.2011 11:34
настройка графики mike03 Любые вопросы от новичков 2 25.04.2011 16:54
Составление графики в С++ SimTiko Вопросы начинающих программистов 7 08.02.2010 09:18
Построение графики на С++ Gerda&amp;Kai Вопросы начинающих программистов 1 02.11.2009 01:26
нет детализации графики Dram Разное 0 29.04.2008 14:00
Программирование графики Shmel Программирование графики 1 07.12.2005 12:13
Как на С++ строить графики IRENsuper Вопросы начинающих программистов 1 20.04.2005 09:35
Применение OpenGL для двухмерной графики градиентная заливка Ril' Программирование графики 3 11.10.2004 00:45
Алгоритмы 3D графики Anonymous Алгоритмы 6 29.09.2003 12:49
Как строить графики в С++ Anonymous C++ Builder 10 01.07.2003 17:42



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов