Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: Lord Trancos 2 en 04 de Julio de 2004, 06:38:08 PM

Título: Camara En 3ª Persona
Publicado por: Lord Trancos 2 en 04 de Julio de 2004, 06:38:08 PM
 ¿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)  
Título: Camara En 3ª Persona
Publicado por: NeLo en 04 de Julio de 2004, 07:31:54 PM
 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.
Título: Camara En 3ª Persona
Publicado por: egf en 04 de Julio de 2004, 07:39:35 PM
 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

Título: Camara En 3ª Persona
Publicado por: Lord Trancos 2 en 04 de Julio de 2004, 11:45:10 PM
 gracias por los comentarios, ya tengo algo mas o menos decente  (uoh)  
Título: Camara En 3ª Persona
Publicado por: ethernet en 05 de Julio de 2004, 07:11:23 AM
  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 )  
Título: Camara En 3ª Persona
Publicado por: Lord Trancos 2 en 05 de Julio de 2004, 12:25:36 PM
 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.
Título: Camara En 3ª Persona
Publicado por: tamat en 05 de Julio de 2004, 03:42:55 PM
 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.
Título: Camara En 3ª Persona
Publicado por: Lord Trancos 2 en 05 de Julio de 2004, 08:26:25 PM
 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.html

Si 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)  
Título: Camara En 3ª Persona
Publicado por: BeRSeRKeR en 05 de Julio de 2004, 08:43:49 PM
 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.
Título: Camara En 3ª Persona
Publicado por: BeRSeRKeR en 05 de Julio de 2004, 08:48:24 PM
 Por cierto, las colisiones parecen muy bien implementadas por el momento, con su sliding y todo... :)

Saludos.
Título: Camara En 3ª Persona
Publicado por: Lord Trancos 2 en 05 de Julio de 2004, 09:08:42 PM
 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:
Título: Camara En 3ª Persona
Publicado por: BeRSeRKeR en 05 de Julio de 2004, 09:17:30 PM
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.
Título: Camara En 3ª Persona
Publicado por: rrc2soft en 06 de Julio de 2004, 04:47:56 AM
 Lord Trancos, te ha quedao chulo  :)

36 fps (reflex. activadas) en un PIV a 2Ghz con una GeForce2 MX.
Título: Camara En 3ª Persona
Publicado por: seryu en 06 de Julio de 2004, 06:35:23 AM
 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"
Título: Camara En 3ª Persona
Publicado por: ethernet en 06 de Julio de 2004, 07:24:01 AM
 La unica pega que tengo es q la tia tiene pocas tetas :)
(se puede decir tetas?)
Título: Camara En 3ª Persona
Publicado por: Lord Trancos 2 en 06 de Julio de 2004, 09:36:50 AM
 
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)  
Título: Camara En 3ª Persona
Publicado por: seryu en 06 de Julio de 2004, 11:09:13 AM
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  
Título: Camara En 3ª Persona
Publicado por: nsL en 06 de Julio de 2004, 02:20:48 PM
 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)  
Título: Camara En 3ª Persona
Publicado por: Lord Trancos 2 en 06 de Julio de 2004, 08:40:50 PM
 

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;