|
Re: Player an starken Schrägen herabgleiten lassen
[Re: Christian__A]
#161153
10/15/07 18:33
10/15/07 18:33
|
Joined: Oct 2004
Posts: 262 Augsburg,Bayern
ARAS
Member
|
Member
Joined: Oct 2004
Posts: 262
Augsburg,Bayern
|
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.
|
|
|
Re: Player an starken Schrägen herabgleiten lassen
[Re: ARAS]
#161154
10/15/07 19:42
10/15/07 19:42
|
Joined: Sep 2003
Posts: 9,859
FBL
Senior Expert
|
Senior Expert
Joined: Sep 2003
Posts: 9,859
|
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.
|
|
|
Re: Player an starken Schrägen herabgleiten lassen
[Re: FBL]
#161155
10/16/07 17:08
10/16/07 17:08
|
Joined: Oct 2002
Posts: 799 Germany->Bavaria->Nuremberg
Christian__A
OP
User
|
OP
User
Joined: Oct 2002
Posts: 799
Germany->Bavaria->Nuremberg
|
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);
|
|
|
|