1 registered members (TipmyPip),
18,449
guests, and 6
spiders. |
Key:
Admin,
Global Mod,
Mod
|
|
|
Relative Drehung zu einer Entity - Kameraproblem
#320965
04/26/10 09:16
04/26/10 09:16
|
Joined: Apr 2008
Posts: 144 Germany | Niedersachsen (Lower...
Roxas
OP
Member
|
OP
Member
Joined: Apr 2008
Posts: 144
Germany | Niedersachsen (Lower...
|
Hey Leute ich mach im Moment 'ne RPG-Pause und hab ein wenig mit Kameracodes rumgespielt und dann aus lauter langeweile Resident Evil 5 gespielt.
Da is mir aufgefallen, dass Chris der Kamera mit dem Blick folgt oder wenn er zielt, dass er dann mit der Pistole auf die Mitte des Bildschirms zielt. Wenn man die Maus nach rechts bewegt, dann dreht auch Chris sich nach rechts immer über seine Schulter gesehen.
Jetzt tun sich mir einige Fragen auf, denn ich hab versucht so eine Art von Kamera nach zu programmieren aber irgendwie bin ich zu keinem Ergebnis gekommen.
Ich brauche quasi einen Punkt der sich mit dem Spieler mitbewegt sowohl in der Drehung als auch vorwärts, rückwärts, seitwärts, hoch und runter sehend. dieser Punkt muss aber ein anderer sein, als der Ursprungspunkt des Models, er muss rechts hinter dem spieler modell sein und das die ganze Zeit, da man dem Spieler über die Schulter gucken möchte.
Hat einger Erfahrung mit dieser Art von Schulterkamera und könnte mir n paar tipps geben wie man sowas umsetzt?
Hoffe ihr könnt mir dabei helfen!
Gruß Roxas~
|
|
|
Re: Relative Drehung zu einer Entity - Kameraproblem
[Re: Roxas]
#320971
04/26/10 11:05
04/26/10 11:05
|
Joined: Nov 2008
Posts: 946
the_clown
User
|
User
Joined: Nov 2008
Posts: 946
|
Eigentlich relativ simpel: vec_set(camera.x,vector(-100,-20,5)); // spiele mit diesen Werten vec_rotate(camera.x,camera.pan); vec_add(camera.x,player.x); vec_set(player.pan,camera.pan); Das ist bloße Trigonometrie; Erklären kann ich's leider nicht. Das mit der Kopf- / Armbewegung beinhaltet aber Bones-Rotationen und ist schon etwas komplizierter. Dazu kommt dann natürlich noch die Kameradrehung selbst, aber ich glaube, das bedarf keiner Erklärung.
|
|
|
Re: Relative Drehung zu einer Entity - Kameraproblem
[Re: Roxas]
#320972
04/26/10 11:12
04/26/10 11:12
|
Joined: Sep 2003
Posts: 5,900 Bielefeld, Germany
Pappenheimer
Senior Expert
|
Senior Expert
Joined: Sep 2003
Posts: 5,900
Bielefeld, Germany
|
Du brauchst eine Variante von folgendem:
var pos_distance = 100;
vec_for_angle(temp, my.pan);//übersetzt den Blickwinkel in einen Punkt um 1 Quant vom Nullpunkt der Welt in Blickrichtung vec_scale(temp, pos_distance);//versetzt diesen Punkt um einen Abstand von pos_distance vom Nullpunkt entfernt vec_add(temp, my.x);//versetzt diesen "Versatz" um den Ort der my-Entity
Wenn Du aber jetzt nicht einen Punkt vor der Entity brauchst, sondern hinter ihr. z.B. damit die Kamera von dort über die Schulter schaut, dann fügst Du nach vec_for_angle(temp, my.pan); diesen Winkel hinzu: temp.pan += 180;// so schaut die Kamera in den Nacken der my-Entity temp.pan += 110;// so über die eine Schulter usw.
|
|
|
Re: Relative Drehung zu einer Entity - Kameraproblem
[Re: Pappenheimer]
#321029
04/26/10 18:05
04/26/10 18:05
|
Joined: Jul 2007
Posts: 424 EUROPE
maslone1
Senior Member
|
Senior Member
Joined: Jul 2007
Posts: 424
EUROPE
|
hier meine variante aus dem 2.5D opensource spacegame: http://www.opserver.de/wiki/index.php/2.5D_Spaceshooter_V0_1x_-_OpenSource_by_maslone1
function rotate_rel(VECTOR* meentity, VECTOR* youentity, ANGLE* youangle, VECTOR* distanz)
{
vec_set(meentity.x, distanz);
vec_rotate(meentity.x, youangle.pan);
vec_add(meentity.x, youentity.x);
// rotate_rel(testpos.x, ent_ShipDummie.x, ent_ShipDummie.pan, vector(50, 100, 100));
// Beispiel
}
function Cam1()
{
var cam_goal_dist = -40; //Variable for the camera-distance
camera.x = Ships[1].x; //the x and y position is always the player x and y position
camera.y = Ships[1].y;
camera.z = Ships[1].z;
while(1){
rotate_rel(camera.x, Ships[1].x, Ships[1].pan, vector(cam_goal_dist,0,0));
if(key_u != 0) { cam_goal_dist += 2*time_step; }
if(key_i != 0) { cam_goal_dist -= 2*time_step; }
camera.tilt= 0;
camera.roll= 0;
camera.pan = Ships[1].pan;
wait(1);
}
}
Die relative Poistion zu einer Ziel-Entity änderst du unter der funktion rotate_rel(camera.x, Ships[1].x, Ships[1].pan, vector(cam_goal_dist,0,0)); unter vector(cam_goal_dist "X", 0 "Y",0 "Z") (unter "" angeführten achsen sind zur änderung der relativen position da) Der große Vorteil hier..... kann mich aber irren, du kannst sehr einfach die kamera in echtzeit verschieben und in andere richtungen drehen. Die Verwendbarkeit ist also recht groß. Einer der Gründe warum ich es so geschrieben habe..... aber möglich dass es noch viel bessere und schnellere lösungen gibt.
Last edited by maslone1; 04/26/10 18:13.
A8c, Blender, FlStudio, Unity3d
|
|
|
Re: Relative Drehung zu einer Entity - Kameraproblem
[Re: Roxas]
#321113
04/27/10 08:26
04/27/10 08:26
|
Joined: Apr 2008
Posts: 144 Germany | Niedersachsen (Lower...
Roxas
OP
Member
|
OP
Member
Joined: Apr 2008
Posts: 144
Germany | Niedersachsen (Lower...
|
Ich habe für die Kamera eine etwas abgewandelte Form genommen, mich zwar stark an Pappenheimer und the clown orientiert aber irgendwie noch nen bisschen selber was reingemixt und das funktioniert soweit ganz gut. Ich Berechne mit Sin und Cos ne Position neben dem Spieler die immer rechts von ihm is. Das is mein Ankerpunkt für meine Kamera. Die setze ich nämlich dahinter und lasse sie dann in Richtung des Ankerpunktes gucken und diesem auch in der Drehung folgen. Damit konnte ich das nach oben und nach unten Sehen gut umsetzen. Hier mein Code als Beispiel:
// Engine Funktion - Kamera script
var camera_distance = 75;
var cam_height = 0;
var bone_height = 0;
function handle_camera()
{
// Vectoren
VECTOR temp;
VECTOR anker;
VECTOR tempvect;
// Durch bewegen der Maus wird die Kamera gesteuert, aber nur unter bestimmten Umständen
if(key_d == 0 && key_a == 0 && key_shift == 1){character.pan -= mouse_force.x * 10 * time_step;}
else if(key_shift == 0){character.pan -= mouse_force.x * 10 * time_step;}
// Kamera hoch und runter blicken lassen
cam_height -= mouse_force.y * 8 * time_step;
cam_height = clamp(cam_height,-50,50);
// Kamera Anker (Ankerpunkt der Kamera, orientiert sich am Spieler)
anker.x = character.x + 25 * sin(character.pan);
anker.y = character.y - 25 * cos(character.pan);
anker.z = character.z + 35;
// Kamera orientiert sich am Ankerpunkt
camera.x = anker.x - camera_distance * cos(character.pan);
camera.y = anker.y - camera_distance * sin(character.pan);
camera.z = anker.z + cam_height;
// Kamera blickt in die Richtung des Ankerpunktes (Also gleichzeitig in Spielerrichtung)
vec_set(temp,anker.x);
vec_sub(temp, camera.x);
vec_to_angle(camera.pan, temp);
// Billige Kamera Kollision
trace_mode = IGNORE_ME | IGNORE_PASSABLE;
result = trace(my.x,camera.x);
if(result > 0) { vec_set(camera.x,target.x); }
// Steuerung der Rückenbones für Zielmodus
if(mouse_right == 1 && character.move_mode == 1)
{
bone_height = cam_height;
ent_bonerotate_parent(character,"Bone1",vector(0,-bone_height,0));
}
if(mouse_right == 0)
{
if(bone_height > 0)
{
ent_bonerotate_parent(character,"Bone1",vector(0,-bone_height,0));
bone_height -= 20 * time_step;
}
if(bone_height < 0)
{
ent_bonerotate_parent(character,"Bone1",vector(0,-bone_height,0));
bone_height += 20 * time_step;
}
}
}
Vielleicht hilfs ja jemandem ^^ Die Kamera ist zwar nicht wirklich "smooth" so wie in RE5, aber sie bietet statisch dass, was RE5 auch kann Gruß Roxas~
|
|
|
|