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 ]
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
Assias :ojo:
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!
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.
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
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 ]
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.
Gracias, ahora me quedo mas trankilo :ojo: