Winkelberechnungen

Posted By: IngoS.

Winkelberechnungen - 03/10/11 14:40

Hallo,
vielleicht hat jemand eine Idee. Ein LKW wird mit Gegenständen beladen. Ich möchte in jedem Gegenstand beim Aufladen auf den LKW seine realive Position, sowie seinen relativen Winkel zum Fahrzeug sichern, um die Gegenstände beim Fahren updaten zu können. Bedingung ist also das für die Speicherung nur 2 Vectoren bentuzt werden sollen.

Die realtive Position beim Aufladen erhalte ich mit vec_to_ent. Zum Updaten der Gegenstände hole ich mir die absolute Position mit vec_for_ent zurück. Aber wie kann ich das mit den Winkeln lösen?

Die Differenz der Winkel beim Aufladen per ang_diff zu sichern und nach jedem Frame per ang_add zu updaten funktioniert nicht.

Es sollte also logisch so wie bei Bones funktionieren, die sind ja auch im Modell lokal gespeichert und mit ang_for_bone hole ich mir dann jederzeit die globalen Winkel. Was es für Positionen schon wie oben beschrieben gibt brauche ich also für Winkel, etwa so ang_to_ent und ang_for_ent.

Kann jemand helfen?
Posted By: Germanunkol

Re: Winkelberechnungen - 03/10/11 14:53

Quote:
Die Differenz der Winkel beim Aufladen per ang_diff zu sichern und nach jedem Frame per ang_add zu updaten funktioniert nicht.
genau so würde ich es aber versuchen. Wichtig ist dabei, dass du nicht jeden frame den winkel dazuaddierst sondern erst vec_set(my.pan, lkw.pan); und dann erst ang_rotate(my.pan, differenceAng);
Außerdem müsstest du ang_rotate benutzen und nicht ang_add, je nachdem wie du ang_diff benutzt.

Was genau klappt daran denn nicht?

//beim aufladen:
ang_diff(differenceAng, my.pan, lkw.pan);

und dann jeden frame:
vec_set(my.pan, lkw.pan);
ang_rotate(my.pan, differenceAng);
Posted By: ventilator

Re: Winkelberechnungen - 03/10/11 14:55

mit ang_add() liegst du schon richtig. einfach immer den gespeicherten winkel vom gegenstand zum momentanen winkel des fahrzeugs addieren (oder umgekehrt, es kommt da glaube ich auf die reihenfolge an und man muss meistens etwas experimentieren).

edit: gleichzeitig gepostet. laugh
Posted By: IngoS.

Re: Winkelberechnungen - 03/10/11 15:08

...naja ich weis auch nicht warum es nicht funktioniert. Wenn ich beim Aufladen die Winkeldifferenz so berechne:

ang_diff(Item.aANG,Item.pan,KFZ.pan);

und nach dem Fahren es wieder auf das Item übertrage mit:

vec_set(Item.pan,KFZ.pan);
ang_add(Item.pan,Item.aANG);

haut es nicht hin, die Ladung neigt sich je nach Neig- und Kippwinkel des KFZ. Hab schon alles mögliche versucht, auch mit ang_rotate usw.

Einzige Lösung die funktioniert ist wenn ich beim Aufladen den Winkel des KFZ und des Gegenstandes sichere und dann über die Differenz der KFZ Winkel das Item rotiere. Dann bräuchte ich aber einen Vector mehr zum speichern, aber das wollte ich gern verhindern, da noch eine Client/server Mechanismus dran hängt und ich Traffic sparen will.
Posted By: ventilator

Re: Winkelberechnungen - 03/10/11 15:27

versuchs mal statt ang_diff() mit vec_rotateback().

vec_set(Item.aANG, Item.pan);
vec_rotateback(Item.aANG, KFZ.pan);
Posted By: IngoS.

Re: Winkelberechnungen - 03/10/11 15:49

...tja, genau das habe ich auch schon getan, aber auch das haut nicht hin. Ich habe einfach die Vermutung das die anfangs berechnete Winkeldifferenz egal wie ich sie berechne nicht mehr anzuwenden ist, wenn das Fahrzeug fährt und die Winkel quasi umspringen.

Also ich meine wenn das Fahrzeug durch c_rotate bewegt wurde können ja pan,tilt,roll völlig unterschiedlich werden, aber das fahrzeug immernoch in die gleiche Richtung sein.

Ich habe das heute schon ein paar Stunden alles mir logische ausprobiert, leider ohne Erfolg.
Posted By: IngoS.

Re: Winkelberechnungen - 03/10/11 15:51

Trotzdem vielen Dank Euch beiden, vielleicht kommt mir ja noch die leuchtende Idee morgen ;-)
Posted By: ventilator

Re: Winkelberechnungen - 03/10/11 16:00

das funktioniert aber ganz sicher so auf die art. laugh nur ist es schwierig zu helfen, ohne es selbst an einem beispiel auszuprobieren.
Posted By: Germanunkol

Re: Winkelberechnungen - 03/10/11 16:17

Ne, vec_rotateback rotiert ja 'ne richtung, keinen winkel.

Ich hatte mal genau dieses Problem, mit Pfeilen die in einem Körper stecken bleiben sollten. Irgendwie haben wir das damals hinbekommen...

Okay, ich hab's mal ausprobiert. Der Trick hier ist, dass ich einfach jeden Frame das Objekt so drehe wie das parent objekt sich gedreht hat.
Code:
VECTOR dirRestore, oldAng;
	vec_diff(dirRestore, you.x, my.x);
	vec_rotateback(dirRestore, my.pan);
	VECTOR angRestore;
	
	while(my)
	{
		my.pan += (key_cul-key_cur)*time_step*6;
		my.tilt += (key_cuu-key_cud)*time_step*6;
		
		vec_set(temp, dirRestore);
		vec_rotate(temp, my.pan);
		vec_set(you.x, temp);
		
		ang_diff(angRestore, my.pan, oldAng);
		ang_add(you.pan, angRestore);

		vec_set(oldAng, my.pan);
		wait(1);
	}


Bei mir funktionierts.

Edit: hatte noch vergessen: am anfang (wenn das objekt draufgeladen wird) musst du unbedingt
vec_set(oldAng, my.pan); machen. Sonst springt es im ersten frame danach, weil oldAng noch 0,0,0 ist und damit ang_diff(angRestore, my.pan, oldAng); quark zurückgibt.
Posted By: ventilator

Re: Winkelberechnungen - 03/10/11 16:25

ach ja, stimmt. vec_rotateback() ist falsch. es müsste ein ang_rotateback() geben. laugh
Posted By: Germanunkol

Re: Winkelberechnungen - 03/10/11 16:34

Uuuuuund hier ist die version die wir oben wollten. Macht genau das gleiche wie die in der letzten post, nur eine angle rechnung weniger pro frame, und es macht's nach der art, die wir ursprünglich wollten:
Code:
void turningEnt()
{
	my.scale_x = 2;
	my.scale_y = 2;
	my.scale_z= 2;
	
	vec_randomize(temp, 50);
	if(vec_length(temp) < 30) vec_normalize(temp, 30);
	
	you = ent_create("blob.mdl", temp, NULL);
	vec_set(you.pan, vector(random(360), random(360), random(360)));
	you.scale_x = .6;
	you.scale_y = you.scale_x;
	you.scale_z = you.scale_x;
	
	VECTOR dirRestore;
	vec_diff(dirRestore, you.x, my.x);
	vec_rotateback(dirRestore, my.pan);
	VECTOR angRestore;
	ang_diff(angRestore, you.pan, my.pan);
	angRestore.x -= my.pan;
	angRestore.y -= my.tilt;
	angRestore.z -= my.roll;

	while(key_i == OFF) wait(1);
	
	while(my)
	{
		my.pan += (key_cul-key_cur)*time_step*6;
		my.tilt += (key_cuu-key_cud)*time_step*6;
		
		vec_set(temp, dirRestore);
		vec_rotate(temp, my.pan);
		vec_set(you.x, temp);
		
		vec_set(you.pan, my.pan);
		ang_rotate(you.pan, angRestore);
		wait(1);
	}
}



ang_diff und ang_rotate warn schon richtig, nur musste ventilator's vec_rotateback noch rein - allerdings in angle form. Ich hab das mit:
angRestore.x -= my.pan;
angRestore.y -= my.tilt;
angRestore.z -= my.roll;
gemacht.

Find die version schöner.
^^
Posted By: ventilator

Re: Winkelberechnungen - 03/10/11 17:01

Code:
#include <acknex.h>



void cube2()
{
	vec_set(my.pan, vector(random(360), random(360), random(360)));
	vec_set(my.scale_x, vector(0.5, 0.5, 2));

	VECTOR position_offset;
	ANGLE angle_offset;	
	vec_set(position_offset, my.x);
	vec_to_ent(position_offset, you);
	ang_diff(angle_offset, my.pan, you.pan);
	
	while(1)
	{
		vec_set(my.x, position_offset);
		vec_rotate(my.x, you.pan);
		vec_add(my.x, you.x);
		
		vec_set(my.pan, you.pan);
		ang_rotate(my.pan, angle_offset);
		
		wait(1);
	}
}

void cube1()
{
	vec_set(my.pan, vector(random(360), random(360), random(360)));
	ent_create(CUBE_MDL, vector(100, 0, 20), cube2);
	while(1)
	{
		vec_add(my.pan, vector(2 * time_step, 0.5 * time_step, time_step));
		wait(1);
	}
}

void main()
{
	randomize();
	level_load("");
	ent_create(CUBE_MDL, vector(100, 0, 0), cube1);
}


hm... bei mir scheint es so zu funktionieren. hab es aber nur ganz kurz getestet.
Posted By: IngoS.

Re: Winkelberechnungen - 03/10/11 17:09

...also OK, VIELEN DANKE zusammen!!
ich mache da morgen mal weiter, mal schaun...
Posted By: IngoS.

Re: Winkelberechnungen - 03/10/11 17:37

...nun aber doch, Ventilator dein Code macht genau den Fehler den ich meine. Schau mal was ich gemacht habe, ich habe den Start verzögert, damit du siehst das sobald die rotation beginnt cube2 nicht mehr auf dem winkel ist den er sollte.

Code:
#include <acknex.h>

var vStart=0;

void cube2()
{
	vec_set(my.pan, vector(random(360), random(360), random(360)));
	vec_set(my.scale_x, vector(0.5, 0.5, 2));

	VECTOR position_offset;
	ANGLE angle_offset;	
	vec_set(position_offset, my.x);
	vec_to_ent(position_offset, you);
	ang_diff(angle_offset, my.pan, you.pan);
	while(!vStart){wait(1);}
	while(1)
	{
		vec_set(my.x, position_offset);
		vec_rotate(my.x, you.pan);
		vec_add(my.x, you.x);
		
		vec_set(my.pan, you.pan);
		ang_rotate(my.pan, angle_offset);
		
		wait(1);
	}
}

void cube1()
{

	vec_set(my.pan, vector(random(360), random(360), random(360)));
	ent_create(CUBE_MDL, vector(100, 0, 20), cube2);
	wait(-3);
	vStart=1;
	while(1)
	{
		vec_add(my.pan, vector(2 * time_step, 0.5 * time_step, time_step));
		wait(1);
	}
}

void main()
{
	randomize();
	level_load("");
	ent_create(CUBE_MDL, vector(100, 0, 0), cube1);
}


Posted By: ventilator

Re: Winkelberechnungen - 03/10/11 17:54

hm... funktioniert es mit germanunkols version? wieso willst du denn warten? laugh ich müsste mir genauer ansehen was da vor sich geht.
Posted By: ventilator

Re: Winkelberechnungen - 03/10/11 18:31

Code:
void cube2()
{
	vec_set(my.pan, vector(random(360), random(360), random(360)));
	vec_set(my.scale_x, vector(0.5, 0.5, 2));

	VECTOR position_offset;
	ANGLE angle_offset;	
	vec_set(position_offset, my.x);
	vec_to_ent(position_offset, you);
	ang_diff(angle_offset, my.pan, you.pan);
	
	vec_set(my.pan, you.pan);
	ang_rotate(my.pan, angle_offset);
	
	while(!vStart){wait(1);}
	
	while(1)
	{
		vec_set(my.x, position_offset);
		vec_rotate(my.x, you.pan);
		vec_add(my.x, you.x);
		
		vec_set(my.pan, you.pan);
		ang_rotate(my.pan, angle_offset);
		
		wait(1);
	}
}



so funktioniert es, aber ich verstehe nicht wieso. laugh müsste ich genau debuggen.
Posted By: IngoS.

Re: Winkelberechnungen - 03/10/11 18:35

...cool, so hauts hin, Klasse DANKE!!!
Posted By: IngoS.

Re: Winkelberechnungen - 03/10/11 18:58

...ach nee, so hauts ja doch nicht hin. habe erstmal geschaut was du gemacht hast. du hast die verzögerung ja ausgetrickst.

also das was du in der schleife machst nur halt vor der pause schon und so sieht man den fehler blos nicht. also doch nix so, schade...
Posted By: Germanunkol

Re: Winkelberechnungen - 03/10/11 19:00

Uhm. Ingo, was funktioniert denn an meinem code nicht?
Ich hab keine verzögerung drin... und es is getestet, es funktioniert. BEIDE versionen sogar..?
Posted By: ventilator

Re: Winkelberechnungen - 03/10/11 19:01

ich verstehe dein problem nicht.

meine änderung hat die verzögerung nicht ausgetrickst. die verzögerung funktioniert genau wie vorher.

erklär mal genau was du erreichen willst. wieso brauchst du denn die verzögerung?
Posted By: IngoS.

Re: Winkelberechnungen - 03/10/11 19:06

also ich brauche die verzögerung nicht, ich habe die nur eingefügt das ihr erkennt das der Winkel den ihr in der schleife updated nicht mehr derselbe relative winkel ist wie zum anfang, wo das zweite objekt erzeugt wurde.

auch bei Germanunkol sieht man das problem wenn ich dort eine verzögerung einbaue. Ich möchte ja den Ausgangszustand, also den relativen Winkel zum mutter-Objekt immer gleich haben, aber sobald die schleife läuft springt er falsch, was man nur durch die verzögerung sehen kann.
Posted By: ventilator

Re: Winkelberechnungen - 03/10/11 19:13

verstehe ich nicht. laugh

ich denke schon, dass der winkel passt. es sieht doch korrekt aus?
Posted By: IngoS.

Re: Winkelberechnungen - 03/10/11 19:13

ich will folgendes erreichen: sobald ein Objekt 2 mit Objekt 1 verbunden ist soll es sich wie drangeklebt verhalten. so wie das in eurem code auch optisch aussieht.

der fehler der entsteht ist aber das mit dem ersten update das objekt falsch gedreht wird. dann klebt es zwar wie gewünscht fest, aber nicht in dem winkel den es haben soll.
Posted By: ventilator

Re: Winkelberechnungen - 03/10/11 19:17

ach so, jetzt verstehe ich! die rotation wird gleich in der schleife überschrieben, also merkt man nicht, dass die drehung vorher anders war. crazy blöder denkfehler... laugh

ich habe wahrscheinlich wegen dem random() nicht gemerkt, dass da etwas nicht passen kann. random() war zum testen keine gute idee.
Posted By: IngoS.

Re: Winkelberechnungen - 03/10/11 19:21

...weis nicht sorecht wie ich es erklären soll, es gibt beim verbinden der objekte so wie ihr das macht genau denselben fehler mit dem ich mich heute schon stundenlang rumgemacht habe.

das "kindobjekt" springt quasi erst in einen falschen winkel. durch die eingebaute verzögerung wird dieser sprung sichtbar.

stell dir vor cube2 ist eine Platte die an der ladefläche des LKW fixiert werden soll. sobald der LKW losfährt und das erst Update kommt springt die platte erstmal in einen falschen winkel und ist dann fest.
Posted By: IngoS.

Re: Winkelberechnungen - 03/10/11 19:22

...genau das meine ich...
Posted By: ventilator

Re: Winkelberechnungen - 03/10/11 19:36

hier eine neue funktionierende version:

Code:
#include <acknex.h>



void cube2()
{
	vec_set(my.pan, vector(random(360), random(360), random(360)));
	vec_set(my.scale_x, vector(0.5, 0.5, 2));
	
	VECTOR position_offset;
	ANGLE angle_offset;
	
	vec_set(position_offset, my.x);
	vec_to_ent(position_offset, you);
	
	float matrix1[16];
	float matrix2[16];
	ang_to_matrix(my.pan, matrix1);
	ang_to_matrix(you.pan, matrix2);
	mat_inverse(matrix2, matrix2);
	mat_multiply(matrix1, matrix2);
	ang_for_matrix(angle_offset, matrix1);
	
	wait(-2);
	
	while(1)
	{
		vec_set(my.x, position_offset);
		vec_rotate(my.x, you.pan);
		vec_add(my.x, you.x);
		
		vec_set(my.pan, you.pan);
		ang_rotate(my.pan, angle_offset);
		
		wait(1);
	}
}

void cube1()
{
	vec_set(my.pan, vector(random(360), random(360), random(360)));
	ent_create(CUBE_MDL, vector(100, 0, 20), cube2);
	
	wait(-2);
	
	while(1)
	{
		vec_add(my.pan, vector(2 * time_step, 0.5 * time_step, time_step));
		wait(1);
	}
}

void main()
{
	randomize();
	level_load("");
	ent_create(CUBE_MDL, vector(100, 0, 0), cube1);
}


Posted By: IngoS.

Re: Winkelberechnungen - 03/10/11 19:44

...SUPER, genau so. Tja da habe ich wohl noch einige Defizite ;-)

DANKE!!
Posted By: Pappenheimer

Re: Winkelberechnungen - 03/10/11 19:56

Meinem Eindruck nach stimmte der Winkel bereits in der vorherigen Version, das Teil wurde nur versetzt - also in der Positionsberechnung stimmte etwas nicht.
Posted By: Germanunkol

Re: Winkelberechnungen - 03/10/11 19:58

Ah.
Okay, ich weiß was du meinst. Das Problem war aber, dass meine Parent-entity am Anfang nicht gedreht war und wenn sie nicht gedreht ist klappt's wunderbar...
Mist.

Naja, jetzt geht's ja...
Posted By: ventilator

Re: Winkelberechnungen - 03/10/11 20:00

die berechnung des angle_offset war bei allen vorherigen beispielen falsch.

was ich mit den matrizen mache, ist im prinzip eine ang_rotateback() funktion. laugh

ob es auch mit den schon vorhandenen ang_ funktionen irgendwie berechnet werden könnte, weiß ich nicht. ich habs nicht geschafft.
Posted By: Germanunkol

Re: Winkelberechnungen - 03/10/11 20:02

Ne, hab auch nochmal probiert. Geht irgendwie nicht. Komisch.
© 2024 lite-C Forums