Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Proyectar un punto sobre un plano

Iniciado por Lord Trancos, 01 de Enero de 1970, 01:00:00 AM

« anterior - próximo »

Lord Trancos

                                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 ]                                
i>SaludoteZ de Lord Trancos!
http://www.dxlab.tk - http://dxlab.host.sk - programación de DirectX con Delphi.

BeRSeRKeR

                                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
                               
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Lord Trancos

                                Assias :ojo:

                               
i>SaludoteZ de Lord Trancos!
http://www.dxlab.tk - http://dxlab.host.sk - programación de DirectX con Delphi.

Lord Trancos

                               
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!
                               
i>SaludoteZ de Lord Trancos!
http://www.dxlab.tk - http://dxlab.host.sk - programación de DirectX con Delphi.

samsaga2

                                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.
                               

Lord Trancos

                                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
                               
i>SaludoteZ de Lord Trancos!
http://www.dxlab.tk - http://dxlab.host.sk - programación de DirectX con Delphi.

Lord Trancos

                                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 ]                                
i>SaludoteZ de Lord Trancos!
http://www.dxlab.tk - http://dxlab.host.sk - programación de DirectX con Delphi.

Drácula

                                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.
                               
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

Lord Trancos

                                Gracias, ahora me quedo mas trankilo :ojo:
                               
i>SaludoteZ de Lord Trancos!
http://www.dxlab.tk - http://dxlab.host.sk - programación de DirectX con Delphi.






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.