Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Удаление невидимых линий с помощью Алгоритма Робертса

83K
21 июля 2012 года
de Serge
1 / / 06.07.2012
Доброго времени суток, Друзья!!! Сейчас пишу программу на языке C (я начинающий кодер) для курсовой работы по Компьютерной графике (OpenGl), необходимо было создать проволочный куб, вращать его мышью или клавиатурой, но! нужно удалять невидимые линии и грани этого куба, причем, используя математические вычисления по алгоритму Робертса, который, собственно, изобрели еще в 1963 году. Так вот, с первыми двумя пунктами я справился, но теперь в тупике: Не могу извлечь координаты вершин своего куба, не пойму, как бы теперь построить Нормали к нему, поскольку алгоритм использует эти данные в вычислениях, а я использовал стандартную функцию из библиотеки glaux, для построения куба auxWireCube, вот так вот... объясните мне, пожалуйста, кто знает, как же лучше мне добиться реализации этого алгоритма??? Может мне необходимо вводить куб в ручную, используя полигоны? создавать массивы вершин и нормалей, граней? Хотелось бы, конечно, извлечь координаты вершин из стандартной команды auxWireCube, как-нибудь построить нормали... Если это возможно... и еще, как я понимаю, при вращении моего куба его координаты не меняются, а меняется местоположение моего взгляда???... Вот такая проблема у меня) код программы:


#include <windows.h>

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>

int alpha=0, beta=0;

void CALLBACK mouse(AUX_EVENTREC *event)
{
static int x0,y0=-12345;

if(y0!=-12345)
{
alpha += event->data[AUX_MOUSEX] - x0;
beta += event->data[AUX_MOUSEY] - y0;
}

x0 = event->data[AUX_MOUSEX];
y0 = event->data[AUX_MOUSEY];
}

void CALLBACK Key_LEFT(void)
{
alpha -= 5;
}

void CALLBACK Key_RIGHT(void)
{
alpha += 5;
}


void CALLBACK Key_UP(void)
{
beta += 5;
}

void CALLBACK Key_DOWN(void)
{
beta -= 5;
}



void CALLBACK resize(int width,int height)
{
glViewport(0,0,width,height);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho(-5,5, -5,5, 2,12);
gluLookAt(0,0,5, 0,0,0, 0,1,0);
glMatrixMode( GL_MODELVIEW );
}


void cubic()
{
glPushMatrix();

glColor3d(1,1,1);

auxWireCube(3);

glPopMatrix();
}

void CALLBACK display(void)
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );


glPushMatrix();
glRotated(alpha, 0,1,0);
glRotated(beta, -1,0,0);
cubic();
glPopMatrix();

auxSwapBuffers();

}
int main()
{
float pos[4] = {3,3,3,1};
float dir[3] = {-1,-1,-1};
GLfloat mat_specular[] = {1,1,1,1};
auxInitPosition( 50, 10, 400, 400);
auxInitDisplayMode( AUX_RGB | AUX_DEPTH | AUX_DOUBLE );
auxInitWindow( "Cub Seregi" );
auxIdleFunc(display);
auxReshapeFunc(resize);
auxKeyFunc(AUX_LEFT, Key_LEFT);
auxKeyFunc(AUX_RIGHT, Key_RIGHT);
auxKeyFunc(AUX_UP, Key_UP);
auxKeyFunc(AUX_DOWN, Key_DOWN);
auxMouseFunc(AUX_LEFTBUTTON, AUX_MOUSELOC, mouse);
auxMainLoop(display);

}
Помогите, пожалуйста... :)
277
24 июля 2012 года
arrjj
1.7K / / 26.01.2011
Да, нет стандартных функций, которые тебе нарисуют куб без какой то части :)
Вполне можешь сам управлять отрисовкой.
Цитата:
при вращении моего куба его координаты не меняются, а меняется местоположение моего взгляда


Нет. Координаты преобразовываются. После вызова glRotated все объекты отрисовываются с поворотом (преобразованием координат по мартице). Это сделано для того чтобы не пересчитывать вручную координаты всех объектов. Вот пример вращений от NeHe

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог