Ballistische Flugbahn

Posted By: DexLoomer

Ballistische Flugbahn - 06/28/15 13:07

Hallo Leute,
ich möchte für ein Panzerspiel eine einigermaßen spieltaugliche ballistische Flugbahn des Geschosses haben. Mein Problem ist, das ich die mathematischen Formeln die ich bislang gefunden habe, nicht in Programmcode umgesetzt bekomme.
Deshalb fliegt mein Geschoss bislang nur gerade und wird nach einer gewissen Strecke auch nach unten bewegt. Das ähnelt aber zu wenig einer echten Flugbahn.
Außerdem benutze ich als Geschoss eine Entity, welche wegen der hohen Geschwindigkeit durch kleinere Objekte "durchfliegt". Daher habe ich wischen den c_move Schritten noch eine c_trace mit event gesetzt. Hat jemand eine Idee, wie man eine simple ballistische Flugbahn einbauen könnte?

Code:
function move_rocket()
{
set (my, PASSABLE); // don't collide with the player
VECTOR rocket_speed;
	
VECTOR rocket_pos;		
VECTOR rocket_posold;
vec_set(rocket_posold.x, my.x); // Startposition der Rakete merken

	my.pan = entBarrel.pan;
	my.tilt = entBarrel.tilt;
	wait (1);
	my.emask |= (ENABLE_ENTITY|ENABLE_IMPACT|ENABLE_BLOCK);	
	my.event = remove_rocket;
	my.skill40 = 1234; // I'm a rocket
	my.skill20 = 0;
	
	my.skill5 = 0; // used for vertical movement	
	
	while (my.skill20 < 10)
	{
		if (my.skill20 > 2) // the rocket has moved away from the player? Then let's reset its passable flag
		reset (my, PASSABLE);
		effect (rocket_trail, 1, my.x, normal); // generate particle trails for the rocket
		//		my.roll += 20 * time_step;
		rocket_speed.x = 300 * time_step;
		rocket_speed.y = 0;
		rocket_speed.z = 0;
		
		my.skill5 += time_step;
		if (my.skill5 > 5) 
		{
			rocket_speed.z -= fall_speed * time_step;
		}		
		
		my.skill20 += 1 * time_step;
		c_move (my, rocket_speed, nullvector, IGNORE_PASSABLE);
		

vec_set(rocket_pos.x, my.x); // Momentane Position der Rakete merken		

c_trace(rocket_posold.x,rocket_pos.x,IGNORE_ME|IGNORE_PASSABLE|ACTIVATE_SHOOT|IGNORE_CONTENT);
//draw_line3d(rocket_posold.x,NULL,100); // draw line for debug 
//draw_line3d(rocket_pos.x,vector(0,0,255),100);

vec_set(rocket_posold.x,rocket_pos.x); // Alte Position merken
		
wait (1);
	}
remove_rocket();
}

Posted By: Kartoffel

Re: Ballistische Flugbahn - 06/28/15 14:06

stichwort parabel wink

du hast die austrittsgeschwindigkeit (v0) des projektils und die fallbeschleunigung (g).

im code würde das inetwa so aussehen:

Code:
v = v0;

while(...)
{
   v += g * time_step;
   projektil_position += v;
   
   wait(1);
}


ist natürlich nur pseudocode und es ist deinem code ziemlich ähnlich, aber so sieht eine ballistische flugbahn ohne luftreibung oder andere auswirkungen auf das geschoss abgesehen von gravitation aus.
Posted By: DexLoomer

Re: Ballistische Flugbahn - 06/28/15 15:03

Hi Kartoffel,
danke für deinen Tip! So in der Art hatte ich es auch schon gegoogelt. Trotzdem ist es mir nicht gelungen eine Formel vernünftig in den Code einzubauen.

Hier mein Versuch mit deiner Formel. Ich hebe den speed des Geschosses ganz klein gemacht, damit sie erst einmal langsam fliegt und ich den Weg verfolgen kann. Leider "blitzt" das Geschoss nur kurz auf und ist dann weg.

Code:
function move_rocket()
{
	set (my, PASSABLE); // don't collide with the player
	VECTOR rocket_speed;	
	VECTOR rocket_pos;		
	VECTOR rocket_posold;
	vec_set(rocket_posold.x, my.x); // Startposition der Rakete merken

	my.pan = entBarrel.pan;
	my.tilt = entBarrel.tilt;
	wait (1);
	my.emask |= (ENABLE_ENTITY|ENABLE_IMPACT|ENABLE_BLOCK);	
	my.event = remove_rocket;
	
	my.skill40 = 1234; // I'm a rocket
	my.skill20 = 0;	
	
		
		rocket_speed.x = 3;

		while(my.skill20 < 1000)
		{	
		
		if (my.skill20 > 2) // the rocket has moved away from the player? Then let's reset its passable flag
		reset (my, PASSABLE);
		effect (rocket_trail, 1, my.x, normal); // generate particle trails for the rocket
		
		
		
			rocket_speed.x += 0.9;
			rocket_pos.x += rocket_speed.x * time_step;
			
			c_move (my, rocket_pos, nullvector, IGNORE_PASSABLE);	
	
		
	
			vec_set(rocket_pos.x, my.x); // Momentane Position der Rakete merken		

			c_trace(rocket_posold.x,rocket_pos.x,IGNORE_ME|IGNORE_PASSABLE|ACTIVATE_SHOOT|IGNORE_CONTENT);
//			draw_line3d(rocket_posold.x,NULL,100); // draw line for debug  
//			draw_line3d(rocket_pos.x,vector(0,0,255),100); // draw line  

			vec_set(rocket_posold.x,rocket_pos.x); // Alte Position merken
			
			wait (1);
		}
		remove_rocket();
	}

Posted By: Kartoffel

Re: Ballistische Flugbahn - 06/28/15 15:27

Ich denk mal du verwendest c_move falsch. Zum einen gibt man nicht die zielposition an, sondern den bewegungsvektor. Außerdem musst du in diesem fall einen absoluten bewegungsvektor angeben, keinen relativen. (oder den gravitationsvektor immer entsperechend drehen, was umständlicher ist)
© 2024 lite-C Forums