/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
Bech_bb 500
kyllekylle 500
jdjespers.. 500
gibson 300
scootergr.. 300
molokyle 287
10  strarup 270
OpenGL: problemer med lys
Fra : Preben Holm


Dato : 28-09-05 15:49

Hej gruppe,

jeg tænkte der var nogle som havde arbejdet meget med OpenGL og kunne
fortælle hvilke ændringer der skal til i flg. main-fil for at lyset
følger kameraet:


-------------------------
#include "opengl.h"
#include <GL/glut.h>
#include <stdlib.h>
#include "Graphics/Geometry.h"
#include "Graphics/Triangle.h"
#include "Graphics/Robot.h"
#include "Graphics/Link.h"
#include "Graphics/Frame.h"
#include "Math/Rotation3D.h"

using Graphics::Geometry;
using Graphics::Triangle;
using Graphics::Robot;
using Graphics::Link;

float angle=0.0;
float red=1.0, blue=1.0, green=1.0;
int activejoint = 0;
Robot rob;
int x_last, y_last;
bool zoom = false, pan = false;
Vector3D vec(3,0,0), vec2(0,0,1), vec3(0,0,0);

void mouseButtonFunc(int button, int state, int x, int y) {

x_last = x; y_last = y;

if(button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
zoom = true;
else if(glutGetModifiers() == GLUT_ACTIVE_SHIFT && state == GLUT_DOWN)
pan = true;

if(state == GLUT_UP){
pan = false; zoom = false;
}

}

void motionFunc(int x, int y) {

if(zoom)
vec *= 1 + 0.01*(y_last - y);
else if(pan){
Math::Rotation3D rot(0,0.001*(y_last - y),0.001*(x_last - x));
vec3 = rot*(vec3-vec) + vec;
}else{
Math::Rotation3D rot(0,0.01*(y_last - y),0.01*(x_last - x));
vec = rot*vec;
vec2 = rot*vec2;
}

x_last = x; y_last = y;
}

void renderScene(void) {

// notice that we're now clearing the depth buffer
// as well this is required, otherwise the depth buffer
// gets filled and nothing gets rendered.
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
{
gluLookAt(vec(0), vec(1), vec(2),vec3(0), vec3(1), vec3(2),
vec2(0), vec2(1), vec2(2));
rob.draw();
}
glPopMatrix();

glutSwapBuffers();
glFlush();
}


void processSpecialKeys(int key, int x, int y) {

switch(key) {
case GLUT_KEY_F1 :
red = 1.0;
green = 0.0;
blue = 0.0; break;
case GLUT_KEY_F2 :
red = 0.0;
green = 1.0;
blue = 0.0; break;
case GLUT_KEY_F3 :
red = 0.0;
green = 0.0;
blue = 1.0; break;
case GLUT_KEY_RIGHT :
angle = 0.05;
break;
case GLUT_KEY_LEFT:
angle = -0.05;
break;
}

Link *l = rob.getLink()->getNextLink();
for(int i = 0; i < activejoint; i++)
l = l->getNextLink();

//std::cout << angle << " ";
l->setParam(l->getParam() + angle);
//std::cout << l->getParam() << std::endl;
}


void processNormalKeys(unsigned char key, int x, int y) {

   if (key == 27)
      exit(0);

   switch(key){
   case '0':
    activejoint = 0;
    break;
   case '1':
    activejoint = 1;
    break;
   case '2':
    activejoint = 2;
    break;
   case '3':
    activejoint = 3;
    break;
   case '4':
    activejoint = 4;
    break;
   case '5':
    activejoint = 5;
    break;
   }
   angle = 0;
   std::cout << activejoint << std::endl;
}



void changeSize(int w, int h) {
if(h == 0)
h = 1;

float ratio = 1.0* w / h;

// Projection
glViewport(0, 0, w-1, h-1);
glMatrixMode(GL_PROJECTION);
{
glLoadIdentity();
gluPerspective(45,ratio,1,1000);
}

// ModelView
glMatrixMode(GL_MODELVIEW);
}

void parseParameters(int count, char **c) {
Link *link = rob.getLink();

std::cout << count << std::endl;
if(count != 8)
return;

for(int i = 2; i < 8; i++) {

link = link->getNextLink();
link->setParam(atof(c[i])*0.0174532925);
}
}

void init(unsigned int h, unsigned int w) {
if(h == 0)
h = 1;

float ratio = 1.0* w / h;

glViewport(0, 0, w-1, h-1);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45,ratio,1,1000);

glMatrixMode(GL_MODELVIEW);


GLfloat mat_specular[] = { 0.5, 0.5, 0.5, 1.0 };
GLfloat mat_shininess[] = { 25.0 };
GLfloat mat_diffuse[] = {0.9, 0.7, 0.1, 0.7};
GLfloat light_position[] = { 1, 1, 1, 0 };

//GLfloat light_position1[] = { -5, -5, 5, 1.0 };
glClearColor (0.0, 0.0, 0.0, 0.0);
//glShadeModel (GL_SMOOTH);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
//glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
//glLightfv(GL_LIGHT1, GL_POSITION, light_position1);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
//glEnable(GL_LIGHT1);
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);

}

int main(int argc, char **argv) {

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);

glutInitWindowPosition(100,100);
glutInitWindowSize(320,320);
glutCreateWindow("A-Team - Robot Simulator Deluxe");

init(320,320);

if (argc > 1)
rob.parseDevFile(argv[1]);

parseParameters(argc, argv);

/*this just prints some stuff
Link *l = rob.getLink();
Math::Transform3D trans = *l;

while((l = l->getNextLink()) != NULL)
trans = trans*(*l);

std::cout << trans << std::endl;*/


glutDisplayFunc(renderScene);
glutIdleFunc(renderScene);
glutReshapeFunc(changeSize);
glutMotionFunc(motionFunc);
glutMouseFunc(mouseButtonFunc);
glutKeyboardFunc(processNormalKeys);
glutSpecialFunc(processSpecialKeys);

glutMainLoop();

return 0;
}
-------------------------


På forhånd mange tak!!!


Med venlig hilsen
Preben Holm

 
 
Mikkel Haugstrup (04-10-2005)
Kommentar
Fra : Mikkel Haugstrup


Dato : 04-10-05 21:37


"Preben Holm" <64bitNOSPAMNO@mailme.dk> skrev i en meddelelse
news:433a9114$0$49010$14726298@news.sunsite.dk...
> Hej gruppe,
>
> jeg tænkte der var nogle som havde arbejdet meget med OpenGL og kunne
> fortælle hvilke ændringer der skal til i flg. main-fil for at lyset følger
> kameraet:
>
>
> void motionFunc(int x, int y) {
>
> if(zoom)
> vec *= 1 + 0.01*(y_last - y);
> else if(pan){
> Math::Rotation3D rot(0,0.001*(y_last - y),0.001*(x_last - x));
> vec3 = rot*(vec3-vec) + vec;
> }else{
> Math::Rotation3D rot(0,0.01*(y_last - y),0.01*(x_last - x));
> vec = rot*vec;
> vec2 = rot*vec2;
> }
>
> x_last = x; y_last = y;
> }

Her styrer du bevægelsen ikke? Du kan evt flytte positionen på lyset her
også, kan ikke skrive koden for dig da jeg ikke helt forstår din motionFunc.
Men du burde selv kunne rette resten.


> void init(unsigned int h, unsigned int w) {
Feks ved i init funktionen at gøre...

> GLfloat light_position[] = { 1, 1, 1, 0 };

denne variabel global og opdatere sammen med bevægelsen.
Efter at have opdateret positionen skal du kalde:
glLightfv(GL_LIGHT0, GL_POSITION, light_position);

>
> //GLfloat light_position1[] = { -5, -5, 5, 1.0 };
> glClearColor (0.0, 0.0, 0.0, 0.0);
> //glShadeModel (GL_SMOOTH);
> glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
> glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
> glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);

Er det med vilje materialet ikke også skal reagere på ambient light?

> //glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
> glLightfv(GL_LIGHT0, GL_POSITION, light_position);
> //glLightfv(GL_LIGHT1, GL_POSITION, light_position1);
> glEnable(GL_LIGHTING);
> glEnable(GL_LIGHT0);
> //glEnable(GL_LIGHT1);

Din GL_LIGHT1 virker ikke fordi du ikke har sat parametre op for specular,
diffuse mm. GL_LIGHT0 er default 1,1,1,1 GL_LIGHT1 og alle andre er 0,0,0,1.

RTFM ; ) man glLightfv, brug evt google til at finde dem.

Du kunne evt have klippet lidt fra i din kode.

/mikkel



Søg
Reklame
Statistik
Spørgsmål : 177429
Tips : 31962
Nyheder : 719565
Indlæg : 6407948
Brugere : 218878

Månedens bedste
Årets bedste
Sidste års bedste