Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





reflejar la cámara

Iniciado por David, 01 de Enero de 1970, 01:00:00 AM

« anterior - próximo »

David

                                ¿Cómo puedo reflejar la posición y orientación de la cámara
en un plano para crear el efecto de un espejo?. Con el siguiente código, el reflejo se ve bien mientras no me mueva hacia arriba/abajo o rote la cámara el el eje x (pitch /direct3d), si lo hago, el
reflejo se mueve y sale fuera de los lados del espejo.

void CPlane::reflect(CVector& v) const
{
   float dist = distToPlane(v);

   CVector snormal = normal;
   snormal.setLength(dist);
         
   v -= (snormal * 2);
}

void CCamera::reflect(const CPlane& plane)
{   
   // Guardamos la posición de la cámara
   CVector oldPosition = _position;
   
   // Reflejamos la posición
   // de la camára en el plano
   plane.reflect(_position);   
   
   // Transformamos los ejes a
   // coordenadas de mundo
   _right += oldPosition;
   _up += oldPosition;
   _look += oldPosition;

   // Reflejamos los ejes
   plane.reflect(_right);
   plane.reflect(_up);
   plane.reflect(_look);

   // Los llevamos de nuevo al origen
   _right -= _position;
   _up -= _position;
   _look -= _position;

   updateViewMatrix();
}

Gracias por todo.                                

samsaga2

                                No le acabo de ver el sentido a tu código, hay cosas que no me cuadran.
Para calcular el reflejo de la camara en un plano puedes provar (me lo estoy inventando mientras lo escribo):

Co = vector origen de la cámara
Cv = vector de dirección de la vista de la camara (normalizado)
Po = un punto cualesquiera del plano
Pn = normal del plano (normalizado)

Primero deberías calcular en que punto del plano intersecciona el rayo B(t)=Co+t*Cv con el plano ; llamémoslo Q:

t = -(Pn·Co+Pd)/(Pn·Cv)
Q = Co+t*Cv

Q será el nuevo origen de la camara ya que está mirando del plano hacia la dirección reflejada. Asi que sólo nos queda calcular el nuevo vector Cv. Utilizemos para ello la conocida formula de reflejo de un rayo usado en los renders:
R = 2(Pn·L)Pn-L
El · es un dot product y L es el vector que va desde el punto de colisión hacia el origen de la cámara (normalizado):

      (Q - Co)
L = -------------
    ||(Q - Co)||

Entonces tendrás que la cámara reflejada sera:

Camara_origen = Q
Camara_vista = R

Este reflejo es siempre cuando el angulo de incidencia sea igual al angulo de reflejo, asi que para un espejo ya te sirve.

Lo mejor es que lo juntes todo en una formula y la simplifiques para asi ahorrarte cálculos.

Espero no haberla cagado, pues todo esto es pura teoria, no he provado nada.
                               

David

                                Gracias por tu respuesta. Al final me he dado cuenta que no estaba normalizando los nuevos valores de los ejes de la cámara. Ahora funciona perfectamente.

                               






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.