Dienstag, 23. April 2019, 08:33 UTC+2

Sie sind nicht angemeldet.

  • Anmelden

Beiträge: 1 117

Wohnort: Grand Pulse

Gamestudio: A8

1

Montag, 4. Juni 2018, 22:39

Fahrzeugphysik mit PhysX - fährt nur auf zwei Rädern | Verbuggt bei niedriger framerate

Guten Tag.
In letzter Zeit wollte ich mich mal mehr mit den Funktionen der Physikengine auseinandersetzen, da ich diese für ein Rennspiel verwenden wollte. Nun habe ich etwas funktionsfähiges, simples geschrieben, jedoch läuft das nicht sonderlich fehlerfrei.

Das Hauptproblem liegt derzeit darin, dass das Auto sich bei der Kurvenfahrt auf gerader Strecke immer auf zwei Räder stellt. Das Erhöhen des Gewichts meines Fahrzeugs machte keinen Unterschied, eine Kraft von oben nach unten wirken zu lassen hat auch nichts gebracht. Wie bekomme ich die Reifen allesamt auf die Straße?


Wie unten zu sehen sind diese in der Physikengine als PH_WHEEL registriert.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <default.c>
#include <acknex.h>
#include <camera.c>
#include <ackphysx.h>


#define PRAGMA_PATH "content\\";

var allwheels=0;

ENTITY* joints[4];
action wheel() {
	
    pXcon_add (PH_WHEEL, my, player, 0);
	 pXcon_setparams2(me, 0, vector(2550,300,0), vector(1000,100,15));
	
	}


var stearing;
var speed;

action spieler() {
		
	player=me;
	pXent_settype (my, PH_RIGID, PH_BOX);
	pXent_setfriction(my, 0);

   joints[0]= ent_create("wheel.mdl", vector(my.x - 75/1.5, my.y - 43/1.5, my.z + 5), wheel);
   joints[1]= ent_create("wheel.mdl", vector(my.x - 75/1.5, my.y + 43/1.5, my.z + 5), wheel);
   joints[2]= ent_create("wheel.mdl", vector(my.x + 45/1.5, my.y - 43/1.5, my.z + 5), wheel);
   joints[3]= ent_create("wheel.mdl", vector(my.x + 45/1.5, my.y + 43/1.5, my.z + 5), wheel);
//	wait(1);
//	pXcon_setparams2(joints[1], 0, vector(100,500,0), vector(1000,100,15));
//	pXcon_setparams2(joints[2], 0, vector(100,500,0), vector(1000,100,15));
	
	while(1) {
		
		pXcon_setwheel (joints[0], 0, -key_cuu*50000*time_step, key_cud*50000*time_step);
		pXcon_setwheel (joints[1], 0, -key_cuu*50000*time_step, key_cud*50000*time_step);

		if(key_cul) { stearing-=75*time_step; }
		else if(key_cur) { stearing+=75*time_step; }
		else if(stearing>0) { stearing-=75*time_step; }
		else if(stearing<0) { stearing+=75*time_step; }
		
		if(stearing>550) stearing=550;
		else if(stearing<-550) stearing=-550;
		
		if(key_cuu) { speed+=5000*time_step; } else if(speed>0) speed-=4500*time_step;
		if(speed>125000) speed=125000;
		else if(speed<-125000) speed=-125000;
		
		pXcon_setwheel (joints[2], stearing*time_step,allwheels*-speed*time_step, allwheels*key_cud*75000*time_step);  pXcon_setwheel (joints[3], stearing*time_step, allwheels*-speed*time_step, allwheels*key_cud*75000*time_step);
		
		//if(me.roll>20) pXent_rotate(me, 0, vector(me.pan,me.tilt,20)); 
		//if(me.roll<-20) pXent_rotate(me, 0, vector(me.pan,me.tilt,-20)); 
		//if(me.tilt>20) pXent_rotate(me, 0, vector(me.pan,20,me.roll)); 
		//if(me.tilt<-20) pXent_rotate(me, 0, vector(me.pan,-20,me.roll)); 
		
		
		wait(1);
		}
	
	}

function main() {
	
	video_mode=10;
	
	physX_open();
	level_load("level.wmb");
	wait(10);
	ent_create("buggy.mdl", 0, spieler);	
	you = ent_create("terrain.hmp", 0, 0);
	pX_setgravity(vector(0,0,-35));
	pXent_settype(you,PH_STATIC,PH_TERRAIN|PH_MODIFIED);
	pXent_settype(level_ent,PH_STATIC,PH_BOX);
	
	
	}


EDIT: Nun stehe ich vor einem neuen Problem: Mir ist aufgefallen, dass die Physikengine bei einer niedrigen Bildrate völlig anders reagiert. Angegeben wurde irgendwo, dass die Engine nur bis zu 140fps hoch berechnet, also habe ich fps_lock fürs erste darauf gesetzt. Aber falls man nun eben fps_max nach unten setzt (auf 60 oder 30), wird alles absolut unspielbar und das Fahrzeug spinnt nur noch herum.
Vermutlich habe ich nur irgendwo im Code etwas vergessen oder einen Fehler gemacht, aber wo liegt der?

Hoffe ihr könnt mir weiterhelfen. :)
Mit freundlichen Grüßen.
Ältere Beiträge mit geringem Anspruch bitte ignorieren.
FF XIII > FF VII

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Gamingtypen« (6. Juni 2018, 18:40)


Ayaka

Fortgeschrittener

Beiträge: 417

Wohnort: Virtuelle Welt

Beruf: Fachinformatiker in Anwendungsentwicklung (C#)

Gamestudio: A7

2

Dienstag, 5. Juni 2018, 12:53

Ich kenne mich mit der Physikengine nicht aus aber kann dir nur die AUMs ans Herz legen. Da gab es irgendwo mal ein Beispiel.
Nutze die SUFU (z.b. mit Aum 101 ) meinem Projekt.

Bin gerade in der Mittagspause, nicht viel zeit aber ich suche später mal mit.
Perfektionismus ist keine Krankheit :D

Beiträge: 1 631

Gamestudio: A8

3

Dienstag, 5. Juni 2018, 22:39

ah der buggy von freiknecht. in seiner demo fällt er sogar um.
ich denke die physik engine ist realistisch. wenn real mit nen buggy schnell in die kurve gehst, hebt er auch ab.
man könnte bei kurvenfahrt vieleicht eine seitliche kraft ausüben um das kippen zu verhindern.
physik objekt mit schwerkraft belegen, weiß nicht ob das geht.
statt eckige kollisionshülle vieleicht was anderes.
buggy länger und tiefer machen um evtl. den schwerpunkt nach unten zu verlagern.
reifen weiter auseinander und breiter machen.
beim realen auto werden in der kurve, die reifen die in der mitte der kurve liegen langsamer.
echtes auto kippt bei schneller kurve auch, außer die modernen mit ihrer ganzen technik.
habe gerade auch alles mögliche getestet, aber auch noch keine ergebnisse. aber irgendwas davon müsste es eigentlich sein
Irren ist menschlich. Aber wer richtigen Mist bauen will, braucht einen Computer !!!

A8 Com besitzer

Beiträge: 1 117

Wohnort: Grand Pulse

Gamestudio: A8

4

Mittwoch, 6. Juni 2018, 18:37

Zitat von »AffenEimer«

Ich kenne mich mit der Physikengine nicht aus aber kann dir nur die AUMs ans Herz legen.

Bin die bereits durchgegangen, mit den meisten darin enthaltenen Scripts war ich unzufrieden und der Download für den Fahrzeugscript in AUM 101 ist nicht mehr zum Download verfügbar. Dennoch danke. :)

man könnte bei kurvenfahrt vieleicht eine seitliche kraft ausüben um das kippen zu verhindern.

Das hat geholfen, danke!

Nun stehe ich vor einem neuen Problem: Mir ist aufgefallen, dass die Physikengine bei einer niedrigen Bildrate völlig anders reagiert. Angegeben wurde irgendwo, dass die Engine nur bis zu 140fps hoch berechnet, also habe ich fps_lock fürs erste darauf gesetzt. Aber falls man nun eben fps_max nach unten setzt (auf 60 oder 30), wird alles absolut unspielbar und das Fahrzeug spinnt nur noch herum.
Vermutlich habe ich nur irgendwo im Code etwas vergessen oder einen Fehler gemacht, aber wo liegt der?
Ältere Beiträge mit geringem Anspruch bitte ignorieren.
FF XIII > FF VII

Beiträge: 1 631

Gamestudio: A8

5

Mittwoch, 6. Juni 2018, 20:21

Nun stehe ich vor einem neuen Problem: Mir ist aufgefallen, dass die Physikengine bei einer niedrigen Bildrate völlig anders reagiert. Angegeben wurde irgendwo, dass die Engine nur bis zu 140fps hoch berechnet, also habe ich fps_lock fürs erste darauf gesetzt. Aber falls man nun eben fps_max nach unten setzt (auf 60 oder 30), wird alles absolut unspielbar und das Fahrzeug spinnt nur noch herum.
Vermutlich habe ich nur irgendwo im Code etwas vergessen oder einen Fehler gemacht, aber wo liegt der?
das heißt?
erstmal fenstermodus kann fps 512 sein. vollbild wird mit monitor frequenz synchronisiert.
mit 140fps kenn ich nicht.bei fps_lock wird time_step nur von fps_max bestimmt, keine gute idee. fps_min begrenzt time_step darauf.
denke dadurch kann der buggy springen.
pX_setccd(1); mit
pXent_setccdskeleton
genauso friction etc.

mal meine handgranate physiks

pXent_settype(me,PH_RIGID,PH_SPHERE);
pXent_setmass(me,2);
pXent_setelasticity(me,0);
pXent_setdamping(me,100,100);//
pXent_setfriction(me,90);
vec_for_angle(vecBallForce.x, camera.pan);
vec_scale(vecBallForce.x, int_temp_wurf_staerke);
pXent_addforcelocal(me,vecBallForce,me.x);
// pXent_addforcecentral(me,vecBallForce);
pXent_setccdskeleton(me,vector(0.2,0.2,0.2),0);
wait(-2.5);

explosion_create(vector(me.x,me.y,me.z));
c_scan (me.x,me.pan,vector(360,0,400),SCAN_ENTS|SCAN_LIMIT|IGNORE_ME);
wait(10);
pXent_settype(me,0,0);
ent_remove(me);
me=NULL;

vieleicht ist was brauchbares bei.
oder kannst ne demo zum testen hochladen?
Irren ist menschlich. Aber wer richtigen Mist bauen will, braucht einen Computer !!!

A8 Com besitzer

Thema bewerten