crazy Dragon physics....

Posted By: LPF

crazy Dragon physics.... - 06/03/11 15:54

Ich habe im Med einen kleinen drachen creiert und habe vesucht ihn auf die folgende weise zu steuern:

wenn man leertaste drückt schlägt der Drache mit den flügeln und man steigt nach oben mit den pfeiltasten kann man den drachen drehen und den vortrieb duch neigung der flügel bestimmen...

ich hab's also mit der physics-engine probiert und folgendes erhalten

Code:
ph_setgravity (vector(0, 0, -383)); // set the gravity
	phent_settype (dragon, PH_RIGID, PH_BOX); // set the physics entity type
	phent_setmass (dragon, 1, PH_BOX); // and its mass
	phent_setfriction (dragon, 100); // set the friction
	phent_setdamping (dragon, 40, 40); // set the damping
	phent_setelasticity (dragon, 1, 1); // set the elasticity
	
	while (1)
	{
		
		
		rotatedragon_force.x = -100 * time_step * (key_cur - key_cul); // move the ball using the cursor keys
		rotatedragon_force.y = -100 * time_step * (key_cuu - key_cud); // 25 sets the x / y movement speeds
		rotatedragon_force.z = 0;
		
		dragon_force.x = 0;
		dragon_force.y = 0;
		dragon_force.z = 3000 * time_step * (key_space); // no need to move on the vertical axis
		phent_addcentralforce(dragon, dragon_force); 
		phent_addtorqueglobal (dragon, rotatedragon_force); // add a torquxe (an angular force) to the ball
		wait (1);
	}


(dragon ist das modell)

das problem an der ganzen sache ist das sich die physik unabhängig von der Modellausrichtun angreift, und sich der drache wirklich immer nur hoch und runter bewegt.
kann man das so ändern dass die physik wie c_move immer in ausrichtungsrichtung des modells angreift????

oder wäre es möglich c_move und die physik zu kombinieren?


thx im vorraus
LPF
Posted By: TheShooter

Re: crazy Dragon physics.... - 06/03/11 16:03

Muss man nicht eigentlich mit PH_movechar arbeiten?
Posted By: hopfel

Re: crazy Dragon physics.... - 06/03/11 17:08

Ich würde dir an dieser Stelle eh raten, nicht auf die Physik-engine zurückzugreifen, sondern dir selber "Schwerkraft" zu programmieren.
Im Physikunterricht solltest du gelernt haben/wirst du lernen was du dafür für Formeln benutzt und wie du sie anwendest. Das ganze für deinen Fall etwas zusammengefasst:

s = s0 + 1/2 * at² + v0 * t

s ist die zurückgelegte Strecke, a die Beschleunigung (-9.81 für Erdanziehung), v0 die Geschwindigkeit gen oben die der Drache durch den Flügelschlag bekommt, s0 seine anfangshöhe und t für die Zeit. (Hoffe ich hatte das noch richtig im Kopf)

Für eine einigermassen naturgetreuen Fallbeschleunigung würde das im Code etwa so aussehen:

Code:
var t = 0; //Zeit die verstreicht
var v = 10; //Anfangsgeschwindigkeit (Die durch einen Flügelschlag erreicht wurde)
var anfangshoehe = dragon.z; //Höhe vor Fall
while(1)
{

dragon.z = anfangshoehe + 1/2 * -9.81 * (t*t) + v*t;
t += time_frame;

wait(1);
}


Bei jedem Flügelschlag t auf 0 und die Anfangshöhe auf den Drachen setzen und du hast deine Schwerkraft.

Das Viech hat natürlich auch eine Luftreibung, aber das Ganze wird sonst noch ein wenig kompliziert, verringere am besten einfach die Fallbeschleunigung, also a in der oberen Formel.

Und so kannst du auch ohne weiteres mit c_move arbeiten.

Hoffe, das hat dir weitergeholfen. ^^
Posted By: LPF

Re: crazy Dragon physics.... - 06/03/11 18:03

O.K. Thanks...
aber das hatte ich schon probiert... damit das echt mirkt fehlen aber jede menge formeln die auch auf den Abtauchwinkel usw. zugreifen müssen... und das wäre ziemlich... na ja, Aufwendig d-.-b
(-> wenn sich der winkel vergrössert muss die beschleunigung nach vorne dazuaddiert, und aus dem abtauchwinkel ein neuer auftrieb errechnet werden...
ausserdem sind physikalische formeln überflüssig wenn man einfach pro ablaufzyklus etwas von einer ständig herrschenden beschleunigung abzieht,
mit der man dann auch auftrieb erzeugen kann
theoretisch machbar, praktisch aber fast unausführbar...)

und Ja... ich habs schon in der schule gelernt... man berechnet amit aus einem parabelförmigen graphen im t-v diagramm den zurrückgelegten weg... Grins

-> TheShooter: ich bin eigentlich Neuling mit lite-c... und habe mir gedacht, dass es mit der physics-Engine nett aussähe (würde, von dem was ich gelesen habe ,auch viele weitere probleme lösen...)

PS: ist übrigens fast alles copy&paste aus dem Lite-c-Workshop...
Posted By: Pappenheimer

Re: crazy Dragon physics.... - 06/03/11 18:15

Vielleicht sind x und y einfach nur viel zu schwach im verhältnis zur z-Kraft und deshalb fällt ihre Kraft nicht auf?
Posted By: LPF

Re: crazy Dragon physics.... - 06/03/11 20:15

ich hab gar kein x & y... aber wenn du eine formel aufstellst,die je nach winkel x,bzw. y berechnen wäre das eine große hilfe...

als ansatz vielleicht: so und so viele prozent von 45° (abtauchwinkel) entsprechen so und so viel prozent vo y bzw. x
-> Problem: er fliegt immer richtung x,also müsste man über trigonometrie y berechnen und so weiter... (grins)

Ps: ich hab's so probiert, und die engine hat verrückt gespielt... na ja
Posted By: Pappenheimer

Re: crazy Dragon physics.... - 06/03/11 20:21

Für x:

VECTOR temp;
var force_x_n_y = 300;

vec_for_angle(temp, my.pan);
vec_scale(temp, force_x_n_y);
Posted By: LPF

Re: crazy Dragon physics.... - 06/03/11 20:34

was genau macht man da jetzt...?

ich denke man setzt einen richtungsvektor(temp) auf my.pan
und verändert diesen dann mit x...
oder so
Posted By: MasterQ32

Re: crazy Dragon physics.... - 06/03/11 21:36

@Pappenheimer:
schlechtes beispiel, der code ist unsicher!
Deine Kraft verändert sich auch im Betrag, für die Funktion braucht man vec_normalize!
Code:
VECTOR temp;
var force_x = 300;
vec_for_angle(temp, my.pan);
vec_normalize(temp, force_x);



rotiert die kraft force_x in x-y-z richtung so, dass der drache immer nach vorne fliegt.
Posted By: LPF

Re: crazy Dragon physics.... - 06/04/11 07:33

werd's mal ausprobieren... thx

-> mehr oder weniger unabhängige frage: wie bekomme ich das massezentrum einer Physics Entity?

ach ja: Lokale Rotation hab ich gesern abend noch hinbekommen d-.-b
deshalb auch: wenn ich bei phent_addforcelocal den angriffspositionsvektor(oder so) ins massezentrum setze müsste er mir das gewünschte ergebnis liefern...
Posted By: Pappenheimer

Re: crazy Dragon physics.... - 06/04/11 11:19

Originally Posted By: Richi007
@Pappenheimer:
schlechtes beispiel, der code ist unsicher!
Deine Kraft verändert sich auch im Betrag, für die Funktion braucht man vec_normalize!
Code:
VECTOR temp;
var force_x = 300;
vec_for_angle(temp, my.pan);
vec_normalize(temp, force_x);



rotiert die kraft force_x in x-y-z richtung so, dass der drache immer nach vorne fliegt.

Das ist etwas, was ich nicht verstehe.
Was ist daran unsicher?
Ich gehe davon aus, dass vec_for_angle immer eine Vektorlänge von 1 herausgibt, oder erwarte ich da etwas Falsches?
Ich sehe, dass es die Funktion Normalize gibt, und nehme an, dass das seinen Grund hat - aber welchen? laugh

EDIT:
Hatte grad nochmal einen Blick ins handbuch geworfen.
Also vec_for_angle liefert tatsächlich eine Länge von eins. "Creates a unit vector (a vector of length 1) pointing into the direction given by the angle. "
Das hieße, in diesem Falle dürfte an vec_scale nichts Problematisches sein, weil die Folge der Anweisungen immer vor dem vec_scale eine identische Länge vorausschickt.
Es wird erst zum Problem, wenn sich die Wetre auf"summieren" könnten. Richtig?
Posted By: MasterQ32

Re: crazy Dragon physics.... - 06/04/11 12:14

genau.
außerdem sollte meiner meinung nach vec_normalize verwendet werden, wenn ich genau eine spezielle länge haben will
und vec_scale, wenn ich einen vektor skalieren will, also eventuell mal verdoppeln oder halbieren, aber niemals für eine exakte distanz-angabe
© 2024 lite-C Forums