Ĺadny brzuch
Mam następujący problem: rysuję w openGL auxSolidSphere() oraz coś przypominające lampkę :). Umieszczam tam gdzie lampka źródło światła i chciałbym żeby źródło przesuwało się razem z nią. Jednak nie uzyskałem tego efektu :/. Przesuwa się sama lampka a źródło światła stoi w miejscu :/. Czy ktoś wie jak poprawić ten program, żeby działał prawidłowo? Z góry thx.
//--------------------------------------------------------------------------- #include <vcl.h> #include <gl\glaux.h> #include <conio.h> #include <math.h> #pragma comment (lib,"glaux.lib") //--------------------------------------------------------------------------- //#pragma argsused #define GL_PI 3.1415f GLfloat xRot, yRot, aRot, zRot; GLfloat ambientLight[] = {0.5, 0.5, 0.5, 1.0}; GLfloat spotDirN[] = {0.0, 0.0, -1.0}; GLfloat lightPos[] = {0.0, 0.0, 75.0}; GLfloat specular[] = {1.0, 1.0, 1.0, 1.0}; GLfloat specref[] = {1.0, 1.0, 1.0, 1.0}; void CALLBACK Render(void); void CALLBACK animacja(void) { aRot += 1; Render(); } void SetupRC() { glEnable(GL_DEPTH_TEST); glFrontFace(GL_CCW); glEnable(GL_CULL_FACE); glEnable(GL_LIGHTING); glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight); glLightfv(GL_LIGHT0, GL_DIFFUSE, ambientLight); glLightfv(GL_LIGHT0, GL_POSITION, lightPos); glLightfv(GL_LIGHT0, GL_SPECULAR, specular); glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 60.0); glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 100.0); glEnable(GL_LIGHT0); glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); glMaterialfv(GL_FRONT, GL_SPECULAR, specref); glMateriali(GL_FRONT, GL_SHININESS, 128); glClearColor(0.0, 0.0, 0.0, 1.0); } void CALLBACK Render(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(0, 0, 1); auxSolidSphere(30.0); glPushMatrix(); glRotatef(yRot, 0.0, 1.0, 0.0); glRotatef(xRot, 1.0, 0.0, 0.0); glLightfv(GL_LIGHT0, GL_POSITION, lightPos); glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spotDirN); glColor3f(1, 0, 0); glTranslatef(lightPos[0], lightPos[1], lightPos[2]); auxSolidCone(4.0, 6.0); glPushAttrib(GL_LIGHTING_BIT); glDisable(GL_LIGHTING); glColor3f(1, 1, 0); auxSolidSphere(3.0); glPopAttrib(); glPopMatrix(); glFlush(); auxSwapBuffers(); } void CALLBACK Skalowanie(GLsizei w,GLsizei h) { glMatrixMode(GL_PROJECTION); GLfloat s = 100.0f; if(h==0) h=1; glViewport(0,0,w,h); glLoadIdentity(); if(w<=h) glOrtho(-s , s , -s* h/w , s * h/w , -s , s); else glOrtho(-s* w/h , s * w/h , -s , s , -s , s); } void CALLBACK lewo(void) { xRot-=10.0; } void CALLBACK prawo(void) { xRot+=10.0; } void CALLBACK gora(void) { yRot+=10.0; } void CALLBACK dol(void) { yRot-=10.0; } void CALLBACK spacja(void) { zRot-=10.0; } void CALLBACK enter(void) { zRot+=10.0; } void main(void) { auxInitDisplayMode (AUX_DOUBLE | AUX_RGBA); auxInitPosition(100 , 100 , 600 , 600); auxInitWindow("Testowanie swiatla"); auxKeyFunc(AUX_LEFT,lewo); auxKeyFunc(AUX_RIGHT,prawo); auxKeyFunc(AUX_UP,gora); auxKeyFunc(AUX_DOWN,dol); auxKeyFunc(AUX_RETURN,enter); auxKeyFunc(AUX_SPACE,spacja); auxReshapeFunc(Skalowanie); auxIdleFunc(animacja); SetupRC(); auxMainLoop(Render); }
Użytkownik zielony_admin edytował ten post 15 grudzień 2006, 21:36
po pierwsze - wektor do opisania polozenia swiatla jest czterowymiarowy (nie 3)
GLfloat lightPos[]={0.0, 0.0, 75.0,1.0}; // (domyslam sie ze zrodlo swiatla punktowe)
po drugie - po co ci w include biblioteka vcl?
#include <vcl.h> // usun chyba ze korzystasz z jakichs funkcji vcl... (nie przygladalem sie dokladnie)
po trzecie to wogole nie wiadomo jaki efekt chcesz osiagnac...
"...chciałbym żeby źródło przesuwało się razem..." - jak przesuwalo?
ja bym zmienial pozycje swiatla tymi klawiszami... byloby to lepsze.
Biblioteki "vcl.h" nie używam, pozostała w kodzie po moim ostatnim programie, po prostu zapomnialem jej usunąć :lol: .
po trzecie to wogole nie wiadomo jaki efekt chcesz osiagnac...
"...chciałbym żeby źródło przesuwało się razem..." - jak przesuwalo?
ja bym zmienial pozycje swiatla tymi klawiszami... byloby to lepsze.
No przecież lampką steruję klawiszami, to chyba jest jasne, że światłem tak samo chcę sterować :P . Światło ma się przesuwać tak jak lampka, ale na razie to przesuwam tylko lampkę :P
W jaki sposób ma się lampka przesunąć (i chyba cała scena), skoro lightpos pozostaje niezmienny? :>
Właśnie o to pytam, jak zmieniać tego lightpos, żeby źródło było tam gdzie lampka... :)
chodzilo mi o bardziej matematyczne okreslenie przesuwania lampki... :)
mozna np. tak (podam tylko istotne fragmenty):
GLfloat lightPos[] = {0.0, 0.0, 75.0};
...
void CALLBACK Render(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(0, 0, 1);
auxSolidSphere(30.0);
glPushMatrix();
//glRotatef(yRot, 0.0, 1.0, 0.0); nie potrzebne
//glRotatef(xRot, 1.0, 0.0, 0.0);
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spotDirN);
glColor3f(1, 0, 0);
glTranslatef(-lightPos[0], -lightPos[1], -lightPos[2]);
auxSolidCone(4.0, 6.0);
glPushAttrib(GL_LIGHTING_BIT);
glDisable(GL_LIGHTING);
glColor3f(1, 1, 0);
auxSolidSphere(3.0);
glPopAttrib();
glPopMatrix();
glFlush();
auxSwapBuffers();
}
...
void CALLBACK lewo(void)
{
lightPos[0]-=10.0;
}
void CALLBACK prawo(void)
{
lightPos[0]+=10.0;
}
void CALLBACK gora(void)
{
lightPos[1]+=10.0;
}
void CALLBACK dol(void)
{
lightPos[1]-=10.0;
}
void CALLBACK spacja(void)
{
lightPos[2]-=10.0;
}
void CALLBACK enter(void)
{
lightPos[2]+=10.0;
}
to jest tylko jeden ze sposobow "poruszania lampka" :rolleyes:
nie mam kompilatora pod reka zeby sprawdzic - moge sie mylic...
pozdrawiam :)
echh.. u gory powinno byc:
GLfloat lightPos[] = {0.0, 0.0, 75.0,1.0};
:)
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
//--------------------------------------------------------------------------- #include <vcl.h> #include <gl\glaux.h> #include <conio.h> #include <math.h> #pragma comment (lib,"glaux.lib") //--------------------------------------------------------------------------- //#pragma argsused #define GL_PI 3.1415f GLfloat xRot, yRot, aRot, zRot; GLfloat ambientLight[] = {0.5, 0.5, 0.5, 1.0}; GLfloat spotDirN[] = {0.0, 0.0, -1.0}; GLfloat lightPos[] = {0.0, 0.0, 75.0}; GLfloat specular[] = {1.0, 1.0, 1.0, 1.0}; GLfloat specref[] = {1.0, 1.0, 1.0, 1.0}; void CALLBACK Render(void); void CALLBACK animacja(void) { aRot += 1; Render(); } void SetupRC() { glEnable(GL_DEPTH_TEST); glFrontFace(GL_CCW); glEnable(GL_CULL_FACE); glEnable(GL_LIGHTING); glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight); glLightfv(GL_LIGHT0, GL_DIFFUSE, ambientLight); glLightfv(GL_LIGHT0, GL_POSITION, lightPos); glLightfv(GL_LIGHT0, GL_SPECULAR, specular); glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 60.0); glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 100.0); glEnable(GL_LIGHT0); glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); glMaterialfv(GL_FRONT, GL_SPECULAR, specref); glMateriali(GL_FRONT, GL_SHININESS, 128); glClearColor(0.0, 0.0, 0.0, 1.0); } void CALLBACK Render(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(0, 0, 1); auxSolidSphere(30.0); glPushMatrix(); glRotatef(yRot, 0.0, 1.0, 0.0); glRotatef(xRot, 1.0, 0.0, 0.0); glLightfv(GL_LIGHT0, GL_POSITION, lightPos); glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spotDirN); glColor3f(1, 0, 0); glTranslatef(lightPos[0], lightPos[1], lightPos[2]); auxSolidCone(4.0, 6.0); glPushAttrib(GL_LIGHTING_BIT); glDisable(GL_LIGHTING); glColor3f(1, 1, 0); auxSolidSphere(3.0); glPopAttrib(); glPopMatrix(); glFlush(); auxSwapBuffers(); } void CALLBACK Skalowanie(GLsizei w,GLsizei h) { glMatrixMode(GL_PROJECTION); GLfloat s = 100.0f; if(h==0) h=1; glViewport(0,0,w,h); glLoadIdentity(); if(w<=h) glOrtho(-s , s , -s* h/w , s * h/w , -s , s); else glOrtho(-s* w/h , s * w/h , -s , s , -s , s); } void CALLBACK lewo(void) { xRot-=10.0; } void CALLBACK prawo(void) { xRot+=10.0; } void CALLBACK gora(void) { yRot+=10.0; } void CALLBACK dol(void) { yRot-=10.0; } void CALLBACK spacja(void) { zRot-=10.0; } void CALLBACK enter(void) { zRot+=10.0; } void main(void) { auxInitDisplayMode (AUX_DOUBLE | AUX_RGBA); auxInitPosition(100 , 100 , 600 , 600); auxInitWindow("Testowanie swiatla"); auxKeyFunc(AUX_LEFT,lewo); auxKeyFunc(AUX_RIGHT,prawo); auxKeyFunc(AUX_UP,gora); auxKeyFunc(AUX_DOWN,dol); auxKeyFunc(AUX_RETURN,enter); auxKeyFunc(AUX_SPACE,spacja); auxReshapeFunc(Skalowanie); auxIdleFunc(animacja); SetupRC(); auxMainLoop(Render); }
Użytkownik zielony_admin edytował ten post 15 grudzień 2006, 21:36
po pierwsze - wektor do opisania polozenia swiatla jest czterowymiarowy (nie 3)
GLfloat lightPos[]={0.0, 0.0, 75.0,1.0}; // (domyslam sie ze zrodlo swiatla punktowe)
po drugie - po co ci w include biblioteka vcl?
#include <vcl.h> // usun chyba ze korzystasz z jakichs funkcji vcl... (nie przygladalem sie dokladnie)
po trzecie to wogole nie wiadomo jaki efekt chcesz osiagnac...
"...chciałbym żeby źródło przesuwało się razem..." - jak przesuwalo?
ja bym zmienial pozycje swiatla tymi klawiszami... byloby to lepsze.
Biblioteki "vcl.h" nie używam, pozostała w kodzie po moim ostatnim programie, po prostu zapomnialem jej usunąć :lol: .
po trzecie to wogole nie wiadomo jaki efekt chcesz osiagnac...
"...chciałbym żeby źródło przesuwało się razem..." - jak przesuwalo?
ja bym zmienial pozycje swiatla tymi klawiszami... byloby to lepsze.
No przecież lampką steruję klawiszami, to chyba jest jasne, że światłem tak samo chcę sterować :P . Światło ma się przesuwać tak jak lampka, ale na razie to przesuwam tylko lampkę :P
W jaki sposób ma się lampka przesunąć (i chyba cała scena), skoro lightpos pozostaje niezmienny? :>
Właśnie o to pytam, jak zmieniać tego lightpos, żeby źródło było tam gdzie lampka... :)
chodzilo mi o bardziej matematyczne okreslenie przesuwania lampki... :)
mozna np. tak (podam tylko istotne fragmenty):
GLfloat lightPos[] = {0.0, 0.0, 75.0};
...
void CALLBACK Render(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(0, 0, 1);
auxSolidSphere(30.0);
glPushMatrix();
//glRotatef(yRot, 0.0, 1.0, 0.0); nie potrzebne
//glRotatef(xRot, 1.0, 0.0, 0.0);
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spotDirN);
glColor3f(1, 0, 0);
glTranslatef(-lightPos[0], -lightPos[1], -lightPos[2]);
auxSolidCone(4.0, 6.0);
glPushAttrib(GL_LIGHTING_BIT);
glDisable(GL_LIGHTING);
glColor3f(1, 1, 0);
auxSolidSphere(3.0);
glPopAttrib();
glPopMatrix();
glFlush();
auxSwapBuffers();
}
...
void CALLBACK lewo(void)
{
lightPos[0]-=10.0;
}
void CALLBACK prawo(void)
{
lightPos[0]+=10.0;
}
void CALLBACK gora(void)
{
lightPos[1]+=10.0;
}
void CALLBACK dol(void)
{
lightPos[1]-=10.0;
}
void CALLBACK spacja(void)
{
lightPos[2]-=10.0;
}
void CALLBACK enter(void)
{
lightPos[2]+=10.0;
}
to jest tylko jeden ze sposobow "poruszania lampka" :rolleyes:
nie mam kompilatora pod reka zeby sprawdzic - moge sie mylic...
pozdrawiam :)
echh.. u gory powinno byc:
GLfloat lightPos[] = {0.0, 0.0, 75.0,1.0};
:)