LookAt / PointAt Verständnis Problem

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
Stimpy
Beiträge: 49
Registriert: 02.03.2011, 15:16
Wohnort: Seelze / Hannover
Kontaktdaten:

LookAt / PointAt Verständnis Problem

Beitrag von Stimpy »

Hallo liebe ZFX'ler,

mittlerweile schon länger bastel ich ja mit Stage3D/Flash an einem Projekt - Und bin mal wieder( :oops: ) an einem Punkt wo ich nicht weiterkomme und euch lieben nettwn ZFX'ler um Hilfe bitte. Es geht dieses mal um die Funktion LookAt btw. in Stage3D heißt es PointAt aber ich gehe mal davon aus das es von der Funktion das selbe tun sollte wie LookAt in OpenGL z.B.. Leider verstehe ich nicht wirklich die Parameter die dahinter stecken.

Ziel der Übung ist es das ich mich um einen Punkt drehe und die Kamera dabei auf diesen Punkt schaut - Die Rotation von der Position habe ich dabei auch schon geschafft:

Code: Alles auswählen

	position.x = (endRotateRadius - radiusStart) * Math.sin(rotateRad) + rotatePoint.x;
		position.y = (endRotateRadius - radiusStart) * Math.cos(rotateRad) + rotatePoint.y;
Die Werte sind jetzt nicht relevant - Das stimmt soweit und die Kamera fliegt von der Position ein Kreis um den gewünschten Punkt.

Nun will ich das die Kamera dabei auch auf den Punkt schaut, also die Achsen so rotieren das man auf den Punkt schaut - Und da fängt der Salat an.

Ich benutze eine Kamera die leicht gekippt auf eine Karte schaut und baue diese so zusammen:

Code: Alles auswählen

// m = Matrix & view = Matrix invertiert
m.appendRotation(neigung, Vector3D.X_AXIS);
view.appendTranslation(position.x , position.y, position.z);
view.append(m);	
var at:Vector3D = new Vector3D(view.rawData[8], view.rawData[9], view.rawData[10]);
view.pointAt(position, at, new Vector3D(0, 0, -1));
Das klappt so alles auch wunderbar - Solange ich die Kamera nicht kippe , also Neigung=0 sprich die Rotation auf der X Achse nicht stattfindet. Findet diese statt dreht sich alles auf den Kopf und völlig falsch.

So wie ich die Funktion verstehe ist das letzte der Up-Vector, also wo Oben ist. In meinem Fall die Z Achse. Der zweite Wert ist die Richtung der Camera in die Sie schaut? Also doch im Prinzip die ViewDirection der Camera? Hatte ich dort ->http://zfx.info/viewtopic.php?f=5&t=2407<- schon einmal gefragt. Und der erste Wert ist die Position von wo aus ich schaue, also die Kamera-Position.

Wie gesagt, wenn ich die Kamera jetzt auf der X Achse rotiere stimmt das mit dem PointAt überhaupt nicht mehr. Kann mir irgendwer erklären wie genau ich die Werte dort einstellen muss damit das auch mit einer Rotation noch richtig aussieht?! Ich hab schon gegoogelt & co und komme da kein Stück weiter :? Geht das überhaupt mit LookAt was ich erreichen will?
Stimpy
Beiträge: 49
Registriert: 02.03.2011, 15:16
Wohnort: Seelze / Hannover
Kontaktdaten:

Re: LookAt / PointAt Verständnis Problem

Beitrag von Stimpy »

Also ich habe hier wirklich große Verständnis Probleme. Hier noch einmal ein anderes Beispiel, wenn ich eine einfache Target-Kamera von oben(Oben ist bei mir Z - Das geht nicht anders da wir hier Tonnen an Daten haben auf der XY Achse...) auf ein Objekt haben will. Also in etwa so:

Bild
(Sry fürs gekritzel :D )

Ich mache dann:

Code: Alles auswählen

view.identity();
	target.x = position.x;
			target.y = position.y;
			target.z = -3;
				
		//	view.appendRotation(neigung, Vector3D.X_AXIS);

			view.appendTranslation( -position.x, -position.y, -position.z);
			
			view.pointAt(	target, 
							new Vector3D(0	,	1	,	0), 
							new Vector3D(0	,	0	,	1)
			);
			
			view.invert();
Wenn ich die Kamera bewege kommt da wieder riesen großer Quatsch raus....wo ist mein Denkfehler :?:
Benutzeravatar
joeydee
Establishment
Beiträge: 1123
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: LookAt / PointAt Verständnis Problem

Beitrag von joeydee »

Aus dem Stegreif würde ich sagen, versuchs mal mit lokalen Achsen. Hab gerade mal älteren Flash-Code von mir angeschaut, da hatte ich sogar gemischt: pointAt(position,localDir,globalUp); weiß aber nicht mehr, ob ich da einen bestimmten Effekt wollte oder das immer so sein muss. In der Doku steht, beide müssen "Object-relative" sein, also lokal, aber auf die Doku ist in solchen 3D-Transformationen nicht immer 100% Verlass...
Stimpy
Beiträge: 49
Registriert: 02.03.2011, 15:16
Wohnort: Seelze / Hannover
Kontaktdaten:

Re: LookAt / PointAt Verständnis Problem

Beitrag von Stimpy »

Hi,

danke für die Antwort ;) Was meinst du mit lokalen Achsen? Da stehe ich jetzt irgendwie auf dem Schlauch - Y ist doch Y ?! Auch lokal?!
Benutzeravatar
joeydee
Establishment
Beiträge: 1123
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: LookAt / PointAt Verständnis Problem

Beitrag von joeydee »

Die lokalen Achsen drehen sich mit deiner Kamera - wenn ein Flugzeug senkrecht mit der Schnauze voran in der Erde steckt, kann "oben" im Cockpit plötzlich "vorn" in der Welt bedeuten usw.
Du kannst sie direkt auslesen mit Matrix3D.copyColumnTo(n,Vector3D), wobei n=0 für x, n=1 für y, n=2 für z und n=3 für die Position.
Stimpy
Beiträge: 49
Registriert: 02.03.2011, 15:16
Wohnort: Seelze / Hannover
Kontaktdaten:

Re: LookAt / PointAt Verständnis Problem

Beitrag von Stimpy »

Du meinst so z.B.?

Code: Alles auswählen

		view.identity();
		
target.x = position.x;
			target.y = position.y;
	view.appendTranslation( -position.x, -position.y, -position.z);
		
	view.copyColumnTo(2, at);
			view.copyColumnTo(1, up);
			
			view.pointAt(	target, 
							at, 
							up
			);
			
			view.invert();
Wenn ja = Da habe ich das selbe Resultat wie vorher
Benutzeravatar
joeydee
Establishment
Beiträge: 1123
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: LookAt / PointAt Verständnis Problem

Beitrag von joeydee »

Hm, hab mal damit rumexperimentiert, die Funktion scheint tatsächlich nicht so ganz lupenrein zu sein... Bestes Ergebnis das man damit erzielen kann ist wohl wie du es hattest: pointAt(target,Vector3D.Z_AXIS,Vector3D.Y_AXIS), wobei sich die Matrix leider nicht "aufrichtet". Das muss man wohl doch manuell nachholen...
Antworten