Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > помогите сделать программу


Автор: lobster213 12.6.2008, 21:05
помогите сделать программу, в соответствии с вариантом а то я в этом вообще не шарю, описание во вложении
user posted image

Автор: Andrey44 13.6.2008, 07:22
lobster213, ну скажем за тебя программу писать никто не будет.
Пиши, а по-ходу возникшие вопросы задавай тут, тогда помогут.

Автор: LavYaAll 13.6.2008, 07:49
Код

void CALLBACK display (void) {
glClear( GL_COLOR_BUFFER_BIT);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective(130,1,0,100);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
gluLookAt (0, 0, z, 0, 0, 0, 0, 1, 0);
glPushMatrix();
CTime ct = CTime::GetCurrentTime();
i1 = ct.GetSecond();
glTranslated(10*sin(0.5*i1),10*cos(0.5*i1),0);
glTranslated(x,y,0);
glColor3d(1,0,0);
auxWireCube(10);
glPopMatrix();
glColor3d(1,0,0);
glBegin(GL_LINE_LOOP);
glColor3d(1,0,0);
glVertex3d(0, 0, 0);
glVertex3d(200, 0, 0);
glEnd();
glBegin(GL_LINE_LOOP);
glColor3d(0,1,0);
glVertex3d(0, 0, 0);
glVertex3d(0, 200, 0);
glEnd();
glBegin(GL_LINE_LOOP);
glColor3d(0,0,1);
glVertex3d(0, 0, 0);
glVertex3d(0, 0, 200);
glEnd();
glFlush();
}

1) Я вот не совсем пойму, зачем надо каждый раз при перерисовке заново устанавливать перспективную проекцию. Обычно такое ставят на glutReshapeFunc, кстати говоря туда добавляют и  настройку порта вывода при помощи glViewport.

2) Тут явно используется не GLUT/FreeGLUT, а какая-то другая либа. Если уж просил чтоб сделали, то надо было бы и ее приаттачить.

4) И еще, как понять вот это:
Код

glBegin(GL_LINE_LOOP);
glColor3d(1,0,0);
glVertex3d(0, 0, 0);
glVertex3d(200, 0, 0);
glEnd();

glBegin(GL_LINE_LOOP);
glColor3d(0,1,0);
glVertex3d(0, 0, 0);
glVertex3d(0, 200, 0);
glEnd();

glBegin(GL_LINE_LOOP);
glColor3d(0,0,1);
glVertex3d(0, 0, 0);
glVertex3d(0, 0, 200);
glEnd();

Назначение GL_LINE_LOOP состоит в том, чтоб соединять все указанные тобой точки образуя замкнутый контур. А тут почему-то в каждом блоке glBegin...glEnd указаны всего 2 точки.  smile
Для таких целей есть GL_LINES.

5) А зачем 3 раза подряд устанавливать одно и то же значение цвета? Это чтоб компилятор убедить?  smile 
Код

glColor3d(1,0,0);
auxWireCube(10);
glPopMatrix();
glColor3d(1,0,0);
glBegin(GL_LINE_LOOP);
glColor3d(1,0,0);


3) Солидарен с предыдущим участником. Делай, а мы поможем тебе по ходу. И еще учти, что тебе не просто придется выполнять работу по шагам, а еще и пересмотреть эти шаги. Потому что преподу который тебе это дал, надо самому почитать какую-нибудь умную книжку по OGL.

Автор: lobster213 15.6.2008, 19:50
короче сделал сам, вся сложность была в матем. расчетах

Код

#include "stdafx.h"
#include "Lr14.h"

#include "stdafx.h"
#include "math.h"

#include "GL/gl.h"
#include "GL/glu.h"
#include "GL/glaux.h"
void myinit(void);
void CALLBACK display(void);
void CALLBACK ProcUp(void);
void CALLBACK ProcDown(void);
void CALLBACK RrocLeft(void);
void CALLBACK ProcRight(void);
void CALLBACK Proca(void);
void CALLBACK Procz(void);
void myinit (void) {
x = 0.0;
y = 0.0;
z = 100.0;
dx = 4.0;
dy = 4.0;
dz = 4.0;
i1 = 0;
}
void CALLBACK display (void) {
glClear( GL_COLOR_BUFFER_BIT);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective(130,1,0,100);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
gluLookAt (0, 0, z, 0, 0, 0, 0, 1, 0);
glPushMatrix();
CTime ct = CTime::GetCurrentTime();
i1 = ct.GetSecond();

if ((i1>=0)&&(i1<15))
glTranslated(6*i1,120-120*i1/15,0);

if ((i1>=15)&&(i1<30))
glTranslated(180-6*i1,120-120*i1/15,0);

if ((i1>=30)&&(i1<45))
glTranslated(180-6*i1,-360+120*i1/15,0);

if ((i1>=45)&&(i1<60))
glTranslated(-360+6*i1,-360+120*i1/15,0);

glTranslated(x,y,0);
glColor3d(0,0,1);
auxSolidIcosahedron(15);
glPopMatrix();
glColor3d(1,0,0);
glBegin(GL_LINE_LOOP);
glColor3d(1,0,0);
glVertex3d(0, 0, 0);
glVertex3d(200, 0, 0);
glEnd();
glBegin(GL_LINE_LOOP);
glColor3d(0,1,0);
glVertex3d(0, 0, 0);
glVertex3d(0, 200, 0);
glEnd();
glBegin(GL_LINE_LOOP);
glColor3d(0,0,1);
glVertex3d(0, 0, 0);
glVertex3d(0, 0, 200);
glEnd();
glFlush();
}
int main(int argc, char** argv) {
auxInitDisplayMode (AUX_SINGLE | AUX_RGB);
auxInitPosition (0, 0, 500, 500);
auxInitWindow ("lab14");
myinit();
auxKeyFunc(AUX_UP, ProcUp);
auxKeyFunc(AUX_DOWN, ProcDown);
auxKeyFunc(AUX_LEFT, RrocLeft);
auxKeyFunc(AUX_RIGHT, ProcRight);
auxKeyFunc(AUX_a, Procz);
auxKeyFunc(AUX_z, Proca);
auxIdleFunc(display);
auxMainLoop(display);
return(0);
}
void CALLBACK ProcUp (void) {
y=y-dy;
}
void CALLBACK ProcDown (void) {
y=y+dy;
}
void CALLBACK RrocLeft(void) {
x=x+dx;
}
void CALLBACK ProcRight(void) {
x=x-dx;
}
void CALLBACK Proca(void) {
z=z+dz;
}
void CALLBACK Procz(void) {
z=z-dz;
}


Добавлено через 3 минуты и 57 секунд
LavYaAll, мне вообще всё-равно на сам код, главное результат и сдать работу, так что мог-бы так не разбираться.

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