Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: Lord Trancos en 01 de Enero de 1970, 01:00:00 AM

Título: Proyectar un punto sobre un plano
Publicado por: Lord Trancos en 01 de Enero de 1970, 01:00:00 AM
                                Pues eso, tengo un plano (un punto de origen y su normal) y un punto (el cual ya se si se encuentra en frente o detras del plano), y necesito saber como proyectar dicho punto sobre el plano.

Se que es facil, pero no me sale :lengua:
(lo mio no son las mates)

_________________
SaludoteZ de Lord Trancos!
www.dxlab.tk - programación de DirectX con Delphi.


[ Este Mensaje fue editado por: Lord Trancos el 2002-08-17 09:40 ]                                
Título: Proyectar un punto sobre un plano
Publicado por: BeRSeRKeR en 01 de Enero de 1970, 01:00:00 AM
                                Me acabo de levantar y no estoy para pensar nada por lo que aquí tienes la función que utiliza Quake II para proyectar un punto sobre un plano (en las fuentes de los Quakes hay más funciones aún más interesantes) :riendo:



q_shared.c

   

// Fuente: Quake II

void ProjectPointOnPlane( vec3_t dst, const vec3_t p, const vec3_t normal )
{
   
float d;
   vec3_t n;
   
float inv_denom;

   inv_denom = 1.0F / DotProduct( normal, normal );

   d = DotProduct( normal, p ) * inv_denom;

   n[0] = normal[0] * inv_denom;
   n[1] = normal[1] * inv_denom;
   n[2] = normal[2] * inv_denom;

   dst[0] = p[0] - d * n[0];
   dst[1] = p[1] - d * n[1];
   dst[2] = p[2] - d * n[2];
}


Saludos
                               
Título: Proyectar un punto sobre un plano
Publicado por: Lord Trancos en 01 de Enero de 1970, 01:00:00 AM
                                Assias :ojo:

                               
Título: Proyectar un punto sobre un plano
Publicado por: Lord Trancos en 01 de Enero de 1970, 01:00:00 AM
                               
Citar



q_shared.c

   

// Fuente: Quake II

void ProjectPointOnPlane( vec3_t dst, const vec3_t p, const vec3_t normal )
{
   
float d;
   vec3_t n;
   
float inv_denom;

   inv_denom = 1.0F / DotProduct( normal, normal );

   d = DotProduct( normal, p ) * inv_denom;

   n[0] = normal[0] * inv_denom;
   n[1] = normal[1] * inv_denom;
   n[2] = normal[2] * inv_denom;

   dst[0] = p[0] - d * n[0];
   dst[1] = p[1] - d * n[1];
   dst[2] = p[2] - d * n[2];
}



No acabo de comprenderlo.... le he estado dando vueltas y me he aprendido ciertas nociones basicas sobre el producto escalar y tal... y hay cosas que no entiendo.

Primero que todo los argumentos que se le pasan a la funcion: falta uno, no? Esta la normal del plano, otro que podria ser el punto de origen del plano, y otro valor donde almacenamos el resultado... pero entonces donde esta el punto que se quiere proyectar ?

Ademas: DotProduct( normal, normal ) ¿esto siempre daria 1, no?

SaludoteZ!
                               
Título: Proyectar un punto sobre un plano
Publicado por: samsaga2 en 01 de Enero de 1970, 01:00:00 AM
                                Sabiendo sólo un punto y un plano no tengo ni idea de como se puede calcular la proyección del punto en plano.
Si lo que tienes es un punto y una dirección hacia la que apunta ese punto puedes usar la fórmula de colisión de un rayo con un plano para calcular el punto exacto de proyección.
                               
Título: Proyectar un punto sobre un plano
Publicado por: Lord Trancos en 01 de Enero de 1970, 01:00:00 AM
                                La direccion es la inversa de la normal (en el caso de que el punto se encuentre en frente del plano) o la normal (en el caso de que se encuentre detras del plano).

Creo que tengo algo de codigo de deteccion de si un rayo colisiona con un plano, le echare un vistazo a ver si me sirve :ojo:

Gracias
                               
Título: Proyectar un punto sobre un plano
Publicado por: Lord Trancos en 01 de Enero de 1970, 01:00:00 AM
                                Weno al final he conseguido comprender el Dot product y he conseguido escribir la funcion yo solito (la verdad es que era terriblemente facil); esto me hace reflexionar sobre lo verde que estoy y lo  mucho que he de aprender sobre matematicas :triste:

Aqui esta el codigo, espero haberlo hecho bien :sonriendo:



function planeProjectPoint(const _orig, _normal, _point: P_Vec;

                          const _d: single): T_Vec;



var

 _dist : single;

 _n : T_Vec;



begin

 _dist := vectDot(_normal, _point);



 if (_dist = _d) then

 begin

   Result := _point^;

   exit;

 end;



 _n := vectMulS(_normal, _d - _dist);



 if (_dist < _d) then

 begin

   Result := vectAddV(_point, @_n);

   exit

 end;

 if (_dist > _d) then Result := vectSubV(_point, @_n);

end;



_d tiene que ser el dotProduct(_normal, _origin), osea el valor D de la ecuacion del plano.

Por cierto, respecto al codigo del quake II, sigo sin entender esto...

 DotProduct( normal, normal );

lo mire por donde lo mire, siempre me da 1.


_________________
SaludoteZ de Lord Trancos!
www.dxlab.tk - programación de DirectX con Delphi.




[ Este Mensaje fue editado por: Lord Trancos el 2002-08-19 05:41 ]                                
Título: Proyectar un punto sobre un plano
Publicado por: Drácula en 01 de Enero de 1970, 01:00:00 AM
                                Lo del Quake está mal. Lo que estás haciendo para calcular la proyección es lo correcto. Sólo tienes que hallar la diferencia de 'D' y multiplicarlo por la normal. La teoría:

Coger la D del plano original
Sustituir el pto de la ecuación del plano por el pto que quieres proyectar. Ahora tienes 2 planos y sabes la distancia(D'-D) que hay entre ellos. Esto lo multiplicas por la Normal, lo sumas al pto y ya tienes la proyección.
                               
Título: Proyectar un punto sobre un plano
Publicado por: Lord Trancos en 01 de Enero de 1970, 01:00:00 AM
                                Gracias, ahora me quedo mas trankilo :ojo: