Player an starken Schrägen herabgleiten lassen

Posted By: Christian__A

Player an starken Schrägen herabgleiten lassen - 10/15/07 16:28

Hallo,
ich versuche seit einer Weile meinen Player an starken schrägen hinabgleiten zulassen. Dabei möchte ich, je höher der Winkel der Schräge ist, den Player stärker nach unten gleiten lassen, so dass ab einem best. Winkel der Player die Schräge gar nicht mehr hinaufkommt. Allerdings scheitern alle meine bisherigen Lösungsansätze, allerdings erscheint das ganz meist zu ruckartig.
Welche Lösungsansätze habt ihr da?
Gruß
Posted By: HeelX

Re: Player an starken Schrägen herabgleiten lassen - 10/15/07 16:38

Führst du in jedem Frame Gravitation nach unten aus? Was für eine Kollisionsmethode benutzt du?
Posted By: Christian__A

Re: Player an starken Schrägen herabgleiten lassen - 10/15/07 16:48

Gravity übe ich normalerweiße nur aus, solange der Player nicht zu weit vom Boden entfernt ist. Sobald ich auf Schrägen testweiße eine Hohe Gravity ansetze, gleitet bis zu einem bestimmten Wert der Player trozdem nicht nach unten (troz Glide) und bei höheren Werten komm ich auf gar keine Schrägen mehr rauf. Für den Player nutze ich OBB. Mein "Player-Model" ist btw. eine Röhre
Posted By: ARAS

Re: Player an starken Schrägen herabgleiten lassen - 10/15/07 18:33

Hallo Christian__A,

versuche doch das ganze einmal mit dem z-Parameter der Normalen. Ab einem bestimmten
z-Wert der Normalen tritt die Drift nach unten in Kraft in Stärke der x- und y-Parameter der
Normalen.
Ich habe einmal ein kleines Skript aufgesetzt. Ich hoffe es ist einigermaßen verständlich.

Code:
 VECTOR vec_Von;
VECTOR vec_Nach;
VECTOR my_Bodenneigung;
VECTOR player_abs_force; // Absolute Geschwindigkeit
VECTOR player_abs_speed; //Absolute Bewegung
VECTOR player_rel_speed; // Relative Bewegung
var gravity = 0.7; // Allgemeine Gravitation

function Scanne_Boden()
{
vec_set(my_Bodenneigung,nullvector);
vec_set(vec_Von,MY.x);
vec_set(vec_Nach,MY.x);
vec_Nach.z -= 500;
c_trace(vec_Von, vec_Nach, IGNORE_ME|IGNORE_PASSENTS|IGNORE_PASSABLE|IGNORE_SPRITES|USE_BOX);
my_Bodenneigung.X = NORMAL.X; // Bestimmung der Normale unter dem Player
my_Bodenneigung.Y = NORMAL.Y; // Bestimmung der Normale unter dem Player
my_Bodenneigung.Z = NORMAL.Z; // Bestimmung der Normale unter dem Player
if(my_Bodenneigung.Z < 0.9) // Ab welchem Neigungswinkel die Drift in Kraft tritt
{
player_abs_force.X = my_Bodenneigung.x * gravity * 10; // Wert "10" erhöht oder verringert die Drift nach unten
player_abs_force.Y = my_Bodenneigung.y * gravity * 10; // Wert "10" erhöht oder verringert die Drift nach unten
player_abs_speed.x = player_abs_force.X * time_step; // Absolute Bewegung des Players
player_abs_speed.y = player_abs_force.Y * time_step; // Absolute Bewegung des Players
}
c_move(me,player_rel_speed,player_abs_speed,IGNORE_ME|IGNORE_PASSENTS|IGNORE_PASSABLE|GLIDE);
}



Müßte so in dieser Art funktionieren.
Vielleicht hast Du ja soetwas gesucht.
Posted By: FBL

Re: Player an starken Schrägen herabgleiten lassen - 10/15/07 19:42

Code:

/* calculate sliding for slopes depending on normal */
if (normal.z < 0.3)
{
vec_to_angle(angTemp, normal);
vec_set(my.aforceX, vector(1, 0, 0));
vec_scale(my.aforceX, AforceSlope * cos(angTemp.tilt));
vec_rotate(my.aforceX, vector(angTemp.pan, 0, 0));
}
else
vec_set(my.aforceX, nullvector);



use my.aforceX next frame for c_move...

The following part will be somewhere above the first one
Code:

/* force calculations */
my.aforceZ = Agravity;

vec_accelerate(vecDist, my.speedX, my.forceX, Afriction);
vec_accelerate(vecAdist, my.aspeedX, my.aforceX, Afriction);
c_move(me, vecDist, vecAdist, IGNORE_ME|IGNORE_YOU|IGNORE_PASSABLE|USE_AABB|GLIDE);




Values I used in my test:
Code:

#define AforceSlope 15
#define Agravity -14
#define Afriction 0.55



Don't ask how I found the cos formel out. I was try<ing to figure it out by using maths, but failed, so I started testing and came up with this one in a few minutes.
Posted By: Christian__A

Re: Player an starken Schrägen herabgleiten lassen - 10/16/07 17:08

ARAS, mein aktueller Ansatz basiert genau auf dem was du beschrieben hast. Ich habe zusätzlich noch einen Faktor, welche die Kraft, die den Player nach unten zieht, skaliert. Der Faktor wächst je nach Schräglage stärker an (bis zu einem Max-Wert.). Davon habe ich mir erhoft, das Problem zu lösen, dass der Player von zu starken Schrägen sozusagen "abprallt"... Ich hab mal ein Video erstellt, auf dem das recht gut zu sehen ist: www.phz-games.de/20071016_player_move.avi ... und ein Stück Code (achtung C++ ). Absvec ist der Vektor für den absoluten Teil von c_move(). @Firo: Wenn ich mit meinem Code nicht weiterkomm, probier ich deinen gern mal aus, danke!

Code:
 

absvec.x = 0;
absvec.y = 0;

//Bei starken schrägen Player nach unten gleiten lassen
if ( _DOUBLE(ground_normal.z) < bevel_under_normal_z && grounddist < 10 )
{
current_bevel_speed += bevel_acc_fac * perister->timestep;

if ( current_bevel_speed > bevel_speed * (bevel_under_normal_z - _DOUBLE(ground_normal.z)))
{
current_bevel_speed = bevel_speed * (bevel_under_normal_z - _DOUBLE(ground_normal.z));
}

absvec.z += (ground_normal.z - _VAR(1)) * _VAR(perister->timestep*current_bevel_speed);
absvec.x += ground_normal.x * _VAR(perister->timestep*current_bevel_speed);
absvec.y += ground_normal.y * _VAR(perister->timestep*current_bevel_speed);
}
else
{
current_bevel_speed = 0;
}


absvec.z += _VAR(current_jumpforce*perister->timestep);


© 2024 lite-C Forums