Panzer Turm Steuerung

Posted By: DexLoomer

Panzer Turm Steuerung - 06/09/15 20:32

Hi Leute,
ich will einen Turm auf einem Fahrzeug drehen, wie es bei einem Panzer möglich ist. Dabei will ich mit den Pfeiltasten den Wagen steuern und mit den Tasten Q + E den Turm.

http://www.file-upload.net/download-10678814/Tank_turret_test.zip.html

Die Schwierigkeit ist, dass ich mit Q + E eine Richtung einstellen möchte (von 0 bis 360 Grad) und der Turm sich dann langsam in diese Richtung dreht, bis er die Einstellung erreicht hat. Dabei soll er die kürzeste Seite (links oder rechts herum) nehmen.

Ich habe in der Turmsteuerung noch Fehler:

Code:
.
.
.
		if  (key_q )    // Turm ausrichten nach links
		{
			turret_orient -= 1;
			if (turret_orient < 0)
			{
				turret_orient = 360;
			} 
			
		}
		if  (key_e )      // Turm ausrichten nach rechts
		{
			turret_orient += 1;
			if (turret_orient > 360)
			{
				turret_orient = 0;
			} 	
		}


		if (turret_offset != turret_orient) 
		{	
			if (turret_offset < turret_orient) 
			{		
				turret_offset += 0.1;
			}
			
			if (turret_offset > turret_orient) 
			{		
				turret_offset -= 0.1;
			}
		}
.
.
.



Leider funktioniert dies bei mir nicht und der Turm "eiert" rum. Besonders wenn die Einstellung von 360 auf 0 Grad bzw. umgekehrt überschreitet.

Kennt jemand eine Lösung?
Posted By: Superku

Re: Panzer Turm Steuerung - 06/10/15 08:00

Erst bestimmst du die Sollorientierung:

turret_orient += (key_e-key_q)*5*time_step;
turret_orient %= 360;

Nun gleichst du den Wert langsam mit der nützlichen Funktion ang() sowie clamp() an:

turret_offset += clamp(ang(turret_orient-turret_offset),-0.5*time_step,0.5*time_step);

Ich habe dabei 5 bzw. 0.5 als Faktoren gewählt, da du time_step in deinem Code nicht benutztest/ vergessen hast und die Drehung dadurch bestimmt schneller als bei den Werten gedacht ablief (/ es durch *time_step langsamer, aber Frameraten-unabhängig wird).
Posted By: DexLoomer

Re: Panzer Turm Steuerung - 06/10/15 15:51

Hallo Superku,

vielen Dank für Deine Hilfe, es scheint damit zu klappen!
Ich muss noch etwas rumprobieren, damit der Turm auch den .pan und .tilt -Wert des Wagens mitnimmt.
Bislang bin ich mit Deinem Tip soweit:
Code:
function attach_turret() 
{
	proc_mode = 0; // prevent shaking
	//	my.passable = on;
	//	my.metal = on;
	while(entTank) // as long as the creator exists
	{
		vec_set(my.x, entTank.x);
		my.pan = entTank.pan + turret_offset;
		my.tilt = entTank.tilt; 
		my.roll = entTank.roll;
		//		my.frame = you.frame;
		//		my.next_frame = you.next_frame;
		
		
	
			if (turret_orient < 0)
			{
				turret_orient = 360;
			} 
			


			if (turret_orient > 360)
			{
				turret_orient = 0;
			} 	

		
		
turret_orient += (key_q-key_e)*5*time_step;
turret_orient %= 360;

turret_offset += clamp(ang(turret_orient-turret_offset),-0.5*time_step,0.5*time_step);
		
		
			
		
		Anzeige_Wert1 = turret_orient;
		Anzeige_Wert2 = turret_offset;
		Anzeige_Wert3 = winkel;
		
		wait(1);
	}
	ent_remove(my);
}



Nochmal vielen Dank für Deine Unterstützung. Als Grafiker tu ich mich eher schwer mit Programmierung. Besonders wenn es um mathematische Geschichten geht.

;-)
Posted By: Superku

Re: Panzer Turm Steuerung - 06/10/15 16:34

Gern geschehen!

Probier doch mal folgendes:

turret_orient += (key_q-key_e)*5*time_step;
turret_orient %= 360;
turret_offset += clamp(ang(turret_orient-turret_offset),-0.5*time_step,0.5*time_step);
vec_set(my.pan,entTank.pan);
ang_rotate(my.pan,vector(turret_offset,0,0)); // kann klappen, muss aber nicht

Die pan/tilt/roll Zeilen am Anfang entfernst du dann.
Posted By: DexLoomer

Re: Panzer Turm Steuerung - 06/10/15 18:20

Klappt f a s t ..!

Also ich habe eine Beispieldatei gesendet, bei dieser funktioniert es tatsächlich. Leider hat mein richtiges Projekt eine recht komplexe Physik und diese zerschießt es, sobald ich den Turm bewege.
Ich habe keine Ahnung warum, aber es liegt an der Zeile:
ang_rotate(my.pan,vector(turret_offset,0,0));

genau genommen darin das:
vector(turret_offset,0,0)

wenn ich statt des Vector nur die Variable einsetze:
ang_rotate(my.pan, turret_offset);

dreht der Turm sich um alle Achsen aber die Physik bleibt ganz!

Ich werde einfach noch rumprobieren müssen.. ggf. an der Physik schrauben.
Trotzdem vielen Dank für die tolle Unterstützung ;-)
© 2024 lite-C Forums