[gelöst] animation von 3d objekt

Verschiedenes zu Qt
Antworten
sudo rm -rf
Beiträge: 28
Registriert: 23. Dezember 2009 13:16

[gelöst] animation von 3d objekt

Beitrag von sudo rm -rf »

Hallo,
ich lasse mir mit opengl eine sierpinski-pyramide zeichnen.
mit keypressed() frage ich ab ob eine taste gedrückt wird. wird eine steuertaste gedrückt, soll man das objekt von einer anderen stelle aus sehen können

w näher ran
s weiter weg
a nach links bewegen
d nach rechts bewegen

"links" nach links drehen
"rechts" nach rechts drehen
"hoch" nach oben drehen
"runter" nach unten drehen

das klappt auch schon alles ganz gut, doch leider bewegt sich das bild wenn ich auf wasd drücke leider nach +-x/+-z , ich will aber, dass es sich relativ zur "kamera" (ja, ich weiß, dass es so was nicht gibt) nach vorne hinten links rechts bewegt.

hier der code:

Code: Alles auswählen

void opengl::draw()
{
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
//hier mus wohl noch irgendein glTranslatef hin, oder?
//aber welches, mit welchen werten?
//bahnhof
	glRotatef(rotation_x, 1.0, 0.0, 0.0);
	glRotatef(rotation_y, 0.0, 1.0, 0.0);
	glRotatef(rotation_z, 0.0, 0.0, 1.0);
	glTranslatef(translation_x, 0.0, 0.0);
	glTranslatef(0.0, translation_y, 0.0);
	glTranslatef(0.0, 0.0, translation_z);
	//glTranslatef(0.0, 0.0, -10.0);
	
	qglColor(Qt::white);
	
	fkt_II(2.0);//draws siepinski
}

void opengl::keyPressEvent(QKeyEvent *event)
{
	int key = event->key();
	if (key == 16777234){rotation_y -= 1.0;}//links
	if (key == 16777236){rotation_y += 1.0;}//rechts
	if (key == 16777235){rotation_x -= 1.0;}//hoch
	if (key == 16777237){rotation_x += 1.0;}//runter
	if (key == 65){translation_x += 0.1;}//A
	if (key == 68){translation_x -= 0.1;}//D
	if (key == 87){translation_z += 0.1;}//W
	if (key == 83){translation_z -= 0.1;}//S
if (key == 16777216){emit esc();}//ESC
	std::cout << translation_x << "\t" << translation_y << "\t" << translation_z << std::endl;


	if (rotation_x >= 360.0){rotation_x -= 360.0;}
	if (rotation_x <= -360.0){rotation_x += 360.0;}
	if (rotation_y >= 360.0){rotation_y -= 360.0;}
	if (rotation_y <= -360.0){rotation_y += 360.0;}
	updateGL();
}
Ich hoffe, mir ist noch zu helfen!
Vielen Dank!!!
Zuletzt geändert von sudo rm -rf am 18. Juli 2010 13:50, insgesamt 1-mal geändert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Schon mal was von switch gehört?
Schon mal was von 'enum Qt::Key' gehört?
Bei if...+-360 würde es auch der Modulo-Operator tun.
Die glTranslateF könnte man auch zusammenfassen.
sudo rm -rf
Beiträge: 28
Registriert: 23. Dezember 2009 13:16

Beitrag von sudo rm -rf »

switch:
ja, wäre angebracht

gltranslate:
kann man, muss man nicht :)

if ... +-360:
Wie soll man da modulo anwenden?

enum Qt::Key:
ahhh, das ist praktisch!!!


kann mir denn jemand aber auch bei meinem eigentlichen problem helfen?
das waren ja eher stilsachen...
trotzdem danke upsala!
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

sudo rm -rf hat geschrieben: Wie soll man da modulo anwenden?
361 - 360 = 1 = 361 % 360

sudo rm -rf hat geschrieben: kann mir denn jemand aber auch bei meinem eigentlichen problem helfen?
das waren ja eher stilsachen...
trotzdem danke upsala!
Die "Stilsachen" sorgen dafür, dass man im Wald die Bäume noch sieht.. :wink:

Aber zum Problem: Ja, es gibt keine Kamera.. aber eigentlich gibts auch keine Pyramide :wink: Daher kannst du doch auch einfach so tun "als ob" und mit "gluLookAt()" die Matrizen.. äh.. Kamera schön auf dein Objekt ausrichten und danach an der "eye"-Position schrauben..

hth!
sudo rm -rf
Beiträge: 28
Registriert: 23. Dezember 2009 13:16

Beitrag von sudo rm -rf »

[gelöst]
sin und cos erwarten angaben im bogenmaß und ich hatte noch einen kleinen vorzeichenfehler.
jetzt bewege ich mich völlig korrekt um mein objekt...
danke!!!
[/gelöst]


hey, ich bin auf einen lösungsansatz gekommen, leider funktioniert er nicht ganz!!!
ich denke aber nicht dass ich daran schuld bin, sondern dass es an rundungsfehlern liegt...
wie genau sind denn sin() und cos() aus cmath?

Code: Alles auswählen

	switch (key)
	{
		case Qt::Key_Left :
			rotation_y -= 1.0;
			break;
		case Qt::Key_Right :
			rotation_y += 1.0;
			break;
		case Qt::Key_Up :
			rotation_x -= 1.0;
			break;
		case Qt::Key_Down :
			rotation_x += 1.0;
			break;

		case Qt::Key_A :
			translation_x += 0.1*cos(rotation_y);
			translation_z += 0.1*sin(rotation_y);
			break;
		case Qt::Key_D :
			translation_x -= 0.1*cos(rotation_y);
			translation_z -= 0.1*sin(rotation_y);
			break;
		case Qt::Key_W :
			translation_z += 0.1*cos(rotation_y);
			translation_x += 0.1*sin(rotation_y);
			break;
		case Qt::Key_S :
			translation_z -= 0.1*cos(rotation_y);
			translation_x -= 0.1*sin(rotation_y);
			break;

		case Qt::Key_Escape :
			emit esc();
			break;
	}
für rotation_y == 0.0 funktioniert dass noch super, wenn man jedoch den winkel ändert bewegt man sich total schief.
ist da ein denkfehler meinerseits vorhanden, oder ist es die rundung?
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

sudo rm -rf
Beiträge: 28
Registriert: 23. Dezember 2009 13:16

Beitrag von sudo rm -rf »

schon getan, deshalb --> gelöst
Antworten