Muy buenas, aqui, empoyandome el manual (ya era hora xD). La pregunta que tengo, que no resuelvo con guguel, es clara y sencilla... Cual es la diferencia entre dot_product y dot_product_normalized?... No entiendo bien lo que dice en la descripcion, me PARECE que el normalized, devuelve el resultado entre -1 y 1?? si es asi... como es esto? no lo emtieingdo :B !
Hola,
Pues así mismo como dice el manual, la diferencia esta entre que el normalized retorna valores entre -1 y 1. El producto punto de dos vectores es el coseno del angulo resultante entre ambos vectores y esta expresado como:
[x1,y1] · [x2,y2] = x1*x2 + y1*y2
Sin embargo, en la mayoría de ocasiones cuando se esta trabajando con vectores se requieren que los vectores estén normalizados, esto facilita hacer varios cálculos como cuando se esta trabajando con luces, normalizar un vector significa dividir cada uno de sus componentes por su longitud, y de este modo el vector queda expresado en valores de -1 a 1
vector = [x1, y1];
length = sqrt(x1 * x1 + y1 * y1); // Teorema de pitagoras
normalized = [x1 / length, y1 / length]; // Siempre serán entre -1 y 1
Si luego haces el producto punto entre 2 vectores que están normalizados (osea que solo haces multiplicaciones con valores de -1 y 1) entonces obtendrás valores entre -1 y 1.
Saludos 8)
muchisimas gracias, peo... aun no acabo de entender porque, supongamos un dot_product(2,4,5,7); entonces, supongo que seria, corrige si me equivoco, 2*5+4*7 = 10+28 = 38;
Como nomaliza ese resultado en caso de "dot_product_normalize(2,4,5,7);"??? :S
Por otra parte de simplemente entenderlo, podrias decirme un ejemplo en practica de algun uso de normalized en un juego?
Gracias de antepierna :B sry mi tontera, la estoy curando ahora xD
EDITO: una preguntica de nada xD, ese valor normalizado, tiene alguna relacion con un booleano? :P
Tu ejemplo esta bien, trabajemos con el :)
dot_product(2,4,5,7) significa que tienes 2 vectores [2, 4] y [5, 7] el producto punto es tal cual dijiste: 2*5+4*7 = 10+28 = 38, ahora bien, vamos a normalizarlos, primero tenemos que hallar la longitud de ambos vectores:
A = [2, 4]
B = [5, 7]
// La longitud es la raiz cuadrada de la suma de cada uno de sus componentes al cuadrado y siempre será mayor a el valor de cada uno de sus componentes
|A| = sqrt(2*2 + 4*4) = 4.4721...
|B| = sqrt(5*5 + 7*7) = 8.6023...
Y ahora normalizamos los vectores dividiendo cada uno de sus componentes por sus longitudes:
An = A/|A| = [2, 4] / 4.4721 = [2 / 4.4721, 4 / 4.4721] = [0.44, 0.89]
Bn = B/|B| = [5, 7] / 8.6023 = [5 / 8.6023, 7 / 8.6023] = [0.58, 0.81]
// Algo extra: si intentas obtener la longitud de un vector normalizado, el resultado será 1
|An| = sqrt(0.44*0.44 + 0.89*0.89) = 0.9928...
(Como eliminamos algunos decimales en los pasos previos el resultado no es 1)
Ahora, con los nuevos vectores obtenidos, hagamos el producto punto:
An = [0.44, 0.89]
Bn = [0.58, 0.81]
An · Bn = 0.44*0.58 + 0.89*0.81 = 0.2552 + 0.7209 = 0.9761
Obtuvimos un valor diferente (entre -1 y 1) al normalizar los vectores.
Ahora bien, aquí se pone interesante la cosa, para que sirve todo esto?? hay varios usos, como por ejemplo saber si un personaje esta siendo visto por otro, pero te daré uno de mis favoritos, como saber si una superficie debe ser iluminada por una luz:
(http://i195.photobucket.com/albums/z57/jucarave/luz_zpsax8khn6c.png)
en esta imagen tenemos 2 vectores: el vector normal (que expresa en que dirección esta la superficie mirando) y el vector de la dirección de la luz, para efectos de estos cálculos necesitamos invertir la dirección de la luz.
Ahora bien, debes entender como funciona el coseno ya que el producto punto es el coseno entre el angulo de ambos vectores y va de -1 a 1:
(http://i195.photobucket.com/albums/z57/jucarave/coseno_zps3vwnidst.png)
Ahora, si sacamos el producto punto entre el vector normal y la dirección inversa de la luz vamos a obtener algo similar a esto:
(http://i195.photobucket.com/albums/z57/jucarave/dotproduct_zpsgc7hdgfl.png)
Suponiendo que ambos vectores están normalizados, esta operación nos retornara algún valor entre -1 y 1 y si lo comparamos con la grafica de coseno entonces podemos deducir que, si el angulo entre ambos vectores es mayor a 0 y menor a 90, entonces el producto punto nos retornara algo entre 0 y 1, y si es mayor a 90 nos retornara algo entre 0 y -1.
es decir, si el angulo entre ambos vectores es menor a 90 (valores 0-1) la superficie esta iluminada (y multiplicamos ese valor de 0-1 por la intensidad de la luz) y es mayor a 90 (valores 0-(-1)) la superficie no esta iluminada (e ignoramos el caso).
El resultado de esto?
(http://i.stack.imgur.com/VcKPa.png)
Ya se que es un ejemplo super complejo (puede que no me haya expresado tampoco tan bien, la verdad tengo poco tiempo ahora :-[ ) pero, este es un ejemplo del mundo real, y a partir de esto salen muchos mas efectos (mas complejos) para lograr cosas mas interesantes.
La verdad, este tipo de operaciones solo las he usado para 3D, así que lo mas probable es que no las tengas que usar mucho (a menos que te guste esta área)
Bueno, ahora si...
Saludos 8)
Bueno mi interes ahora es solo aprender, ya pensare cosas para aplicar cuando recupere mi amado pc xDD
Bueno, ahora si que si lo he pillado de ways ^^ ggrracias
TEMA RESUELTO. PD: Si no me equivoco, creo haber encontrado un dia tu canal de yt y creo que era bastante "serio"... MP