¿Como "os lo montais" para "crear" una camara en 3ª persona? (o como lo hariais si no lo habeis hecho nunca)
Yo actualmente uso un sistema muy simple, pero queda muy rudo. Simplemente me quedo a la espalda del personaje siempre a la misma distancia (excepto cuando la camara colisiona con una pared y no puede retroceder mas).
En principio no queda del todo mal, aunque se nota muy rigida; le falta fluidez. El problema es que cuando la camara tropieza con una pared y despues deja de tropezar o viceversa; resulta muy brusco.... :(
Me gustaria saber como lo haceis vosotros. (ole)
Pues exactamente así, pero añadiéndole "masa".
Con lo cual tendría aceleración, inercia, no sería tan brusca.
Si el personaje se pone a correr, que la cámara no se ponga a moverse a 5 m/s (por ejemplo) al instante; si no que acelere hasta alcanzar la velocidad del personaje (tampoco muy despacio que si no se alejaria). En realidad no se tienen que notar que la camara acelera y no va siempre a la misma distancia del personaje, a no ser que te fijes. Inconscientemente se notará una cámara más suave. Y al pararse el pesonaje igual, desacelerará y se parará a una distancia levemente menor de la que debe estar, así que se alejará lentamente.
Saludos.
pues mira yo ahora estoy con la camara del toro y le e puesto lo siguiente
lanzo un rayo desde el personaje hasta x distancia cada frame, despues le digo que a la camara que se mantenga a la distacia del rayo menos un poco mientras no encuentre nada y si encuentra algo use el resultado quitando el poco y se lo ponga a la camara
jode que mal explicao :huh:
:) personaje pos
|
|
|
|
v CAMARA pos
|
| RAYO
--------------- muro
/////////////////////////////////
:) personaje
|
|
|
v CAMARA pos
|
|
--------------- muro
| RAYO
/////////////////////////////////
:) personaje
|
|
v CAMARA pos
|
|
--------------- muro
|
| RAYO
/////////////////////////////////
cuando el personaje se mueve hacia la pared la camara se mueve a la velicidad del player hacia palante y hacia patras
gracias por los comentarios, ya tengo algo mas o menos decente (uoh)
basta con usar dV/dt = k*V; para tener un movimiento curioso :) (k = cte, V la velocidad. Las condiciones de contorno las impondria el movil, en este caso el cuerpo )
Gracias ethernet, pero creo que mejor no lo toco (ademas no acabo de comprender como implementar eso; soy muy malo con las matematicas :P), ya que funciona bastante bien;
Weno, al final lo he dejado de la siguiente forma:
- Lanzo un rayo desde el personaje hacia una posicion un poco mas elevada a su espalda. (Detecto si hay alguna colision para que la camara no caiga dentro de una pared).
(eso es lo que hacia hasta ahora)
- Y despues, muevo la posicion actual de la camara (velocidad constante por ahora; pero no queda mal) hacia el punto que he calculado con el rayo anterior. (de nuevo detecto si hay alguna colision durante el trayecto de la camara).
Queda bastante chulo, no se traga ninguna pared, y cuando se atasca en una esquina o similar reacciona bastante bien.
Si eso intentare darle un poco de aceleracion/desaceleracion para que sea mas suave.
yo usaba un metodo más simple, interpolaba por un coeficiente la posición de la camara en el frame anterior con la posición 'ideal' en este frame (que sería justo detras del prota), si el coeficiente era cercano a uno entonces era muy 'dura', se movía bruscamente, si era cercano a cero era muy 'blanda' y si ahcias giros bruscos podias perder la nave de sitio, pero weno, el resultado era bueno.
Acabo de ponerle "aceleracion/deceleracion", y como me ha gustado como ha quedado, lo subo para que me deis vuestra opinion.
Solo quiero la opinion del movimiento/collision de la camara. Abstenerse de comentarios sobre otros temas; en especial sobre el "artwork" :P
http://www.geocities.com/dxlab/tmp/walk_demo.htmlSi os va bien de velocidad, podeis modificar el archivo _test.map, la línea;
# Floor Layer
MAP.AddLayer = floor.lay, 0
por
# Floor Layer
MAP.AddLayer = floor.lay, 1
para que quede mas chachi. (uoh)
Mola, mola. :)
Con las reflexiones activadas funciona a unos 40-50 fps en un P4 1,4, 512MB RAM y Radeon 9600 128MB.
Y nada, supongo que después, además del yaw (rotación en Y), también le añadirás el pitch (rotación en X), ¿no?. Para cuando el personaje mire hacia arriba o hacia abajo.
Saludos.
Por cierto, las colisiones parecen muy bien implementadas por el momento, con su sliding y todo... :)
Saludos.
Todavia no se si sera necesario para el personaje mirar arriba y abajo, asi que por ahora paso de implementar eso, o el movimiento de la vista mediante el raton. :P
Ahora lo que quiero implementar es la transicion entre animaciones. ;)
El bajo framerate se explica por varios motivos; ya que hago bastante el animal por ahora (por ejemplo; me miro todos los poligonos para las colisiones)... ya lo ire optimizando. (ole)
La implementacion de las collisiones no hubiesen sido posibles sin la ayuda del paper de Kasper Fauerby (www.peroxide.dk). :lol:
Cita de: "Lord Trancos 2"La implementacion de las collisiones no hubiesen sido posibles sin la ayuda del paper de Kasper Fauerby (www.peroxide.dk). :lol:
Sí, muy buen paper el de Telemachos. Tiene otro muy bueno sobre stencil soft-shadow volumes. Y la verdad es que se está currando un engine impresionante. Bueno, qué digo engine, ¡juego!. Me dijo hace un tiempo que tenía en mente montar una empresa de videojuegos.
Saludos.
Lord Trancos, te ha quedao chulo :)
36 fps (reflex. activadas) en un PIV a 2Ghz con una GeForce2 MX.
el movimiento de la camara esta bastante bien, para mi gusto no deja ver mucho horizonte, pero claro dependiendo del tipo de juego.. centrandome en el movimiento, es suave y reacciona bastante bien, deberias poner el codigo de la camara para discutirlo entre todos, ya qe estas. Deberias comprobar qe funcione bien con objetos intermedios qe colisiones, como puertas, sillas, mesas, otra gente.. lo qe no me gusta mucho es que empiece a mirar al suelo cuando giras, depende del juego como digo, pero en general eso molesta mucho.
el nivel con el reflejo activado me ha recordado un webo al hospital de un survival horror qe ando haciendo en mis ratos libres (uoh) x cierto mu maja la leelo que te has pillado :lol: aunque espero que no sea el personaje de tu juego, porque te aviso que la prota pelirroja ya esta pillada :D
me va a unos 94/95 frames (varia mucho entre 90 y 100) en un amd xp3000 con una radeon 9600 pro.
pd. me gusta eso de "engine"
La unica pega que tengo es q la tia tiene pocas tetas :)
(se puede decir tetas?)
Cita de: "seryu"el nivel con el reflejo activado me ha recordado un webo al hospital de un survival horror qe ando haciendo en mis ratos libres (uoh) x cierto mu maja la leelo que te has pillado :lol: aunque espero que no sea el personaje de tu juego, porque te aviso que la prota pelirroja ya esta pillada :D
Es un hospital, y la prota sera pelirroja :P
Aunque no es ese modelo, ni ese diseño. Ese modelo solo es de prueba.
pd. Cuando llegue a casa pondre el codigo de la camara. Pero basicamente es lo que he comentado unos posts mas arriba.
pd2. tranki ethernet, el modelo definitivo tendra mas tetas (uoh)
Cita de: "ethernet"La unica pega que tengo es q la tia tiene pocas tetas :)
(se puede decir tetas?)
yo creo qe 2 es un numero perfecto. No te niego qe la tia de 3 tetas de total recall molaba, pero como qe me qedo con lo natural :D
50-60 fps en un 1300 gf4 440MX
lo q mas mola de todo es ir al fondo a la izquierda y caer al vacio (ole)
const
_c_distance1 = 25; // distancia a la que empieza a decelerar
_c_speed_const1 = 35; // se usa para velocidad constante (mayor es mas lento)
_c_speed_const2 = 75; // valor maximo para velocidad decelerada (se suma al anterior)
var
_camPos : TVector;
_camDir : TVector;
_camTgt : TVector;
_camVel : TVector;
_camTmp : TVector;
_lenVel, _divVel : single;
_colData : TCollisionPacket;
_vel, _grv : TVector;
//----------------------------
// lanzamos un rayo desde el player hasta una distancia
// un poco elevada de su espalda.
_camTgt := FPlayerPos;
_camTgt[1] := _camTgt[1] + 20;
_camPos := _camTgt;
_camDir := Vector(sin(FPlayerRotY), 0, cos(FPlayerRotY));
_camPos := VECTOR_AddV(_camPos, VECTOR_MulS(_camDir, 50));
_camPos[1] := _camTgt[1] + 22;
// si la deteccion de colisiones esta activada, comprobamos
// que el rayo no colisiona con nada
if (C_COLDET_ENABLED) then
begin
_vel := VECTOR_SubV(_camPos, _camTgt);
_grv := VECTOR(0, 0, 0);
_colData.eRadius := VECTOR(1, 1, 1);
_camPos := collideWithWorld(@_camTgt, @_vel, 0, @_colData, coldetcheck, FGEOMs.First^.Data[0], 0);
end;
// lo de arriba es lo que tenia hecho en un primer momento
// lo que viene ahora es lo nuevo
// calculamos el vector diferencia de la posicion
// actual (FFinalCameraPos) a la posicion deseada
_camVel := VECTOR_SubV(_camPos, FFinalCameraPos);
_lenVel := VECTOR_Length(_camVel);
if (_lenVel > 0.1) then
begin
// --- esto es para decelerar cuando la posicion
// --- deseada y la real son cortas
_divVel := _c_speed_const1;
if _lenVel < _c_distance1 then
begin
if _lenVel > 0
then _divVel := _c_speed_const1 + _c_speed_const2 - (_c_speed_const2 * _lenVel / _c_distance1);
end;
// ------------------------------------------
// normalizamos el vector diferencia y lo
// multiplicamos por un escalar segun
// la velocidad y el tiempo transcurrido (_lastFrameTime)
// [Como veis todavia me base en el tiempo del frame
// en lugar de usar time-steps,.... todo llegara...]
_camTmp := VECTOR_Normalize(_camVel);
_camTmp := VECTOR_MulS(_camTmp, _lastFrameTime / _divVel);
if VECTOR_Length(_camTmp) < _lenVel then _camVel := _camTmp;
// comprobamos que la camara no colisiona con
// nada en su trayecto desde la posicion actual
// hasta la posicion deseada.
if (C_COLDET_ENABLED) then
begin
_grv := VECTOR(0, 0, 0);
_colData.eRadius := VECTOR(1, 1, 1);
_camPos := collideWithWorld(@FFinalCameraPos, @_camVel, 0, @_colData, coldetcheck, FGEOMs.First^.Data[0], 0);
end;
end;
// y ya esta
FFinalCameraPos := _camPos;
FFinalCameraTgt := _camTgt;
end;