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


Автор: Salatovec 7.11.2008, 01:59
Помогите люди добрые, значитс есть такой код:
Код

#include < GL\glut.h > 
#include < GL\gl.h >
#include < GL\glaux.h >
#include < windows.h >

static HGLRC hRC;
static HDC hDC;

bool  keys[256];
      
double angX=0.0,angY=0.0,angZ=0.0;

void Display( void )
{ 
Case1:
        
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glLoadIdentity();

        glRotatef(angX,1.0f,0.0f,0.0f);
        glRotatef(angY,0.0f,1.0f,0.0f);
        
       glBegin( GL_QUADS );
        glColor3f(0.0f,1.0f,0.0f);              
        glVertex3f( 0.2f, 0.2f,-0.2f);         
        glVertex3f(-0.2f, 0.2f,-0.2f);          
        glVertex3f(-0.2f, 0.2f, 0.2f);          
        glVertex3f( 0.2f, 0.2f, 0.2f);         

        glColor3f(1.0f,0.5f,0.0f);             
        glVertex3f( 0.2f,-0.2f, 0.2f);        
        glVertex3f(-0.2f,-0.2f, 0.2f);          
        glVertex3f(-0.2f,-0.2f,-0.2f);         
        glVertex3f( 0.2f,-0.2f,-0.2f);         

        glColor3f(1.0f,0.0f,0.0f);            
        glVertex3f( 0.2f, 0.2f, 0.2f);          
        glVertex3f(-0.2f, 0.2f, 0.2f);          
        glVertex3f(-0.2f,-0.2f, 0.2f);          
        glVertex3f( 0.2f,-0.2f, 0.2f);          

        glColor3f(1.0f,1.0f,0.0f);              
        glVertex3f( 0.2f,-0.2f,-0.2f);     
        glVertex3f(-0.2f,-0.2f,-0.2f);          
        glVertex3f(-0.2f, 0.2f,-0.2f);          
        glVertex3f( 0.2f, 0.2f,-0.2f);          

        glColor3f(0.0f,0.0f,1.0f);            
        glVertex3f(-0.2f, 0.2f, 0.2f);       
        glVertex3f(-0.2f, 0.2f,-0.2f);          
        glVertex3f(-0.2f,-0.2f,-0.2f);          
        glVertex3f(-0.2f,-0.2f, 0.2f);          

        glColor3f(1.0f,0.0f,1.0f);           
        glVertex3f( 0.2f, 0.2f,-0.2f);        
        glVertex3f( 0.2f, 0.2f, 0.2f);          
        glVertex3f( 0.2f,-0.2f, 0.2f);          
        glVertex3f( 0.2f,-0.2f,-0.2f);
       glEnd();

        glutSwapBuffers();
        Sleep(20);
        angX+=1.0;
        angY+=0.2;
        goto Case1;
} 

void main( int argc , char **argv )
{ 
    glutInit( &argc , argv ); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 
    glutInitWindowSize( 800 , 600 ); 
    glutInitWindowPosition( 100 , 100 ); 
    glutCreateWindow( "Êóá" ); 
    glClearColor( 1 , 1 , 1 , 1 ); 
    glutDisplayFunc( Display ); 
    glutMainLoop();
}

Здесь разноцветный кубик крутится вокруг осей Х и Y. и Все бы хорошо, но некоторые грани не видны, как я понимаю из-за того, что координаты их совпадают с другими гранями и эти грань налезает на грань, вообще кубик похож не на кубик, а на кубик с несколькими прозрачными гранями, которых якобы и в помине нет. Помогите люди пожалуйса, второй час голову ломаю.

Автор: Baton2007 7.11.2008, 09:23
А зачем использовать две функции   glRotatef();
Если я не ошибаюсь одна функция справится с поворотом по всем 3 осям!
И еще избавься от goto и поставь функции таймера!

Автор: Salatovec 7.11.2008, 09:40
2 функции использую, чтобы скорости поворота были разные. Так а по моей проблеме ответ будет?)

Автор: Salatovec 7.11.2008, 13:31
Неужели никто не поможет, очень хочу понять решение?(

Автор: Salatovec 7.11.2008, 15:18
 smile 

Автор: Salatovec 7.11.2008, 23:47
Да какие же вы после этого профессионалы (

Автор: Salatovec 9.11.2008, 01:25
 smile 

Автор: Rickert 9.11.2008, 14:20
Смотрим что такое gluLookAt() - 0
Что значит "Case 1: ", в начале функции "Display"? - 1
Учимся инициализировать не через glut - чтобы понять как работать с OpenGL, а не пытаться построить камаз, научившись резьбе по дереву.

Автор: Salatovec 9.11.2008, 19:30
Ура откликнулись добрые люди, спасибо) Дак учиться то я и хочу, просто уроки, которые я нашел в инете чето как то туманно учат, я во многое не втыкаю(
А case - я сделал как метку, чтобы все время угол поворота прибавлялся и функция заного начиналась. Чтобы кубик крутился короче =\

Автор: Rickert 10.11.2008, 04:42
Будут вам уроки smile 
0) Забываем про метки - это плохой стиль программирования. Выбросьте книгу, которая вам о них поведала. Возьмите книгу Дейтлов или Страуструпа.
1) Идём в ya.ru -> "Уроки Nehe" - учимся инициализировать OpenGL и делать какой-то минимум действий.
2) Если понадобиться - создайте тему что-то типа "Вопросы человека, учащего OpenGL" - и там задавайте появляющиеся вопросы. Думаю, если их накопится много, то модератор даже закрепит эту тему. Я обещая во всём помогать вам и освещать непонятные вопросы, попутно осыпая ссылками smile 

Автор: Salatovec 10.11.2008, 17:10
Rickert, Я как раз и учился по урокам нехе, вот там 1 урок, инициализация в виндовс он уже непонятен) Куча, куча - ну просто куча кода, а мне то нужно лишь чтобы окошко создавалось и в нем кубик пока нарисовать, чтобы вертелся и правильно отображался. Про создание кубика и вообще работу с рисованием полигонов, линий и т.д. я понял, а от непосредственно инициализацию опенгл нет( Я нашел вот такие уроки http://www.firststeps.ru/mfc/opengl/r.php?1 , как считаете, подойдут? Или все таки лучше в нехе втыкать?

Автор: Salatovec 10.11.2008, 19:15
Если не трудно, сделай мне такую, а я попробую в ней разобраться и спрошу, что непонятно. Если не трудно, пожалуйста.

Автор: Rickert 11.11.2008, 04:36
Нет, друг мой, извините, делать за вас никто ничего не будет. Я вам повторяю - "Уроки NeHе" - первый из них посвящён созданию окна и инициализации OpenGL.
Надо инициализировать именно так как там указано, а не через коротенькие, готовые функции glut'а, неудивительно что вы не понимаете как всё это работает: просто пытаетесь сделать работу быстрее.

Автор: Salatovec 11.11.2008, 10:49
Просто инициализация и вправду уж больно жесткая =\ Ладно, возникнут вопросы - напишу)

Автор: Rickert 11.11.2008, 13:55
Salatovec, это вам кажется. Поверьте: дальше - больше smile 

Автор: Salatovec 11.11.2008, 17:04
Rickert, Вот вопросы возникли) Рисовать полигонами коробочки, сферки, цилиндры - это все конечно хорошо, а вот если более сложная модель? Я хорошо работаю в 3ds maxe, но не знаю как из макса экспортировать в с++. И вот 2 вопроса - собственно как экспортировать и чтоже все таки лучше - рисовать с++ или максом?

Автор: Rickert 12.11.2008, 09:55
Salatovec, Конечно же все ресурсы создаются в отдельных проргаммах, а потом импортируются в свой проект. Как это делать? Есть разные способы.
Допустим вам надо загрузить модель из Макса в ваш проект: сохраняем её (или экспортируем) в Obj формат (wavefront OBJ), затем в своём проекте пишем функцию по загрузке этого файла и рисуем, все дела.

Автор: Salatovec 12.11.2008, 12:22
Rickert, Спасибо тебе огромнейшее, мне бы только функцию узнать "по загрузке этого файла"  smile 

Автор: Rickert 13.11.2008, 04:59
Salatovec, сначала сделай OBJ файл, потом открой его в блокноте и сам всё поймёшь, как его надо читать.

Автор: Salatovec 13.11.2008, 14:41
Честно открыл и честно не понял =( smile 

Автор: Rickert 14.11.2008, 05:23
Тогда иди на wotsit.org и в поиске вводи "OBJ", среди результатов ищи OBJ wavefront - это и будет описание файла.
Повторяю: никто за тебя ничего не напишет. Понять - помогу, но ты сам должен учиться это делать.

Автор: Salatovec 14.11.2008, 15:24
Да я и не прошу за меня всё делать -_- но понять код длинной с байкало амурскую магистраль чето как то не але =\ не могли в пару строк чтоль придумать (

Автор: Rickert 15.11.2008, 08:24
Salatovec, Иркутянин чтоли?

Автор: Salatovec 15.11.2008, 12:28
Нет, Москвич) если ты об этом

Автор: TDM 15.11.2008, 21:57
Salatovec, 
Если некоторые грани не видны то наверно неправильные координаты вершин.

Автор: Salatovec 16.11.2008, 01:59
Цитата(TDM @ 15.11.2008,  21:57)
Salatovec, 
Если некоторые грани не видны то наверно неправильные координаты вершин.

Нет координаты были верны, дело было в инициализации окна опенджл) но спасибо за ответ)

Автор: Salatovec 16.11.2008, 12:00
Так, Rickert, вот такой вопрос, вот отрывок кода:

Код

glLoadIdentity();
glColor3f(0.0f,0.0f,1.0f);
glTranslatef(0.0f,0.0f,z);
glRotatef(xrot,0.0f,1.0f,0.0f);
glRotatef(yrot,1.0f,0.0f,0.0f);
glBegin(GL_LINES);
    for(angle=0;angle<=PI2;angle+=0.001)
    {
        glVertex3f(5.85*sin(angle),3.5f,5.85*cos(angle));
        glVertex3f(1.60*sin(angle),0.0f,1.60*cos(angle));
    }
glEnd();

Здесь я рисую усеченный конус, без низа и верха с центром 0, 0 по осям x и y и удаленного на z от наблюдателя, а здесь:
Код

glLoadIdentity();
glTranslatef(0.0,3.5f,z);
glRotatef(xrot,0.0f,1.0f,0.0f);
    glRotatef(yrot,1.0f,0.0f,0.0f);
Torus(0.25f,5.45f);

я рисую тор, который находится внутри конуса на самом верху. Тор и конус связанны друг с другом, это должна быть единая модель, но если я начинаю их вращать, то они вращаются каждый вокруг своей оси. Как мне сделать, чтобы закрепить тор на верхних координатах конуса и он вращался правильно?


Автор: TDM 26.11.2008, 00:07
Salatovec, 
Сперва поворачиваешь а потом перемещаешь ёмаё)

Автор: Gongex 15.2.2009, 00:21
Салатовек,я решал такие проблемы,и знаю как отладить чтоб тор вращался нормально.
использовать надо glPushMatrix(); чтобы сохранить вращения и glPopMatrix(); чтобы сбросить все вращения.

Код

glBegin(GL_LINES);
    for(angle=0;angle<=PI2;angle+=0.001)
    {
glPushMatrix();
glTranslatef(0,0,-5);
        glVertex3f(5.85*sin(angle),3.5f,5.85*cos(angle));
        glVertex3f(1.60*sin(angle),0.0f,1.60*cos(angle));
glPopMatrix();    
}
glEnd();

И!

glLoadIdentity();
glPushMatrix();
glTranslatef(0.0,0,-5);
glRotatef(xrot,0.0f,1.0f,0.0f);
    glRotatef(yrot,1.0f,0.0f,0.0f);
Torus(0.25f,5.45f);
glPopMatrix();


Добавлено @ 00:23
я сам искал исходник загрузки из 3Дсмакс,и все тупили как жлобы,в итоге я сам нашел код,и он работает.Там формат надо сохранять не в .max а в .3DS.Давай почту кину этот исходник.

Добавлено @ 00:32
Я скомпилил твой код и все зависло.Casel-лишнее.Там уже встроена функция бесконечного рисования 
Это вот она по моему glLoadIdentity();

Добавлено @ 00:33
посмотри чего я достиг,в рисовании опенгл::http://unlater.narod.ru/OpenGl.html
с сентября занимаюсь

Автор: Rickert 15.2.2009, 07:48
Цитата(Salatovec @  16.11.2008,  12:00 Найти цитируемый пост)
я рисую тор, который находится внутри конуса на самом верху. Тор и конус связанны друг с другом, это должна быть единая модель, но если я начинаю их вращать, то они вращаются каждый вокруг своей оси. Как мне сделать, чтобы закрепить тор на верхних координатах конуса и он вращался правильно?

glLoadIdentity(); - Во второй части кода лишнее. Попробуйте без неё.
Цитата(Gongex @  15.2.2009,  00:21 Найти цитируемый пост)
использовать надо glPushMatrix(); чтобы сохранить вращения и glPopMatrix(); чтобы сбросить все вращения.

glPopMatrix() не сбрасывает вращения, а восстанавливает ту матрицу преобразования, которая была сохранена  через glPushMatrix();
Цитата(Gongex @  15.2.2009,  00:21 Найти цитируемый пост)
Это вот она по моему glLoadIdentity();

Это функция сброса матрицы преобразований в первоначальную.

Автор: Gongex 15.2.2009, 14:07
Rickert, 
Мне не нужны преподаватели.Я сам все знаю.
Я обобщил научные термины к "простому"....Стирает и сохраняет вращения.

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