Agosto 09, 2011, 03:43:39 PM Ultima modificación: Agosto 09, 2011, 03:47:16 PM por Zeit
Hola, alguien me puede explicar como calcular o asignar correctamente los vectores normales para las primitivas con luces en 3D???

He estado leyendo sobre este tema pero no logro entender. Se que sirven para el reflejo de luz, esto es, mediante el angulo de la fuente de luz y los normales. Se que si su norma es ||vn||>1 esta sobreiluminado y ||vn||<1 subiluminado. Si una primitiva no tiene normales no es compatible con luces. Por ejemplo, cuales serian unas buenas normales para siguiente la primitiva?

v1=(1,0,0) -> vn1?
v2=(0,1,0) -> vn2?
v3=(0,0,1) -> vn3?

Saludos.
Saludos Cordiales!!!

 :-\ O.o, muy dificil, tal vez en el manual puedas encontrarlo xD

#2 Agosto 09, 2011, 09:48:20 PM Ultima modificación: Agosto 09, 2011, 10:10:25 PM por Jucarave
Hola pues nunca trabaje normales con Game Maker, pero ahora los trabajo con C++, se debe parecer un poco XD...

Los normales son la direccion en el que el vertice reflejara la luz, este debe tener una direccion perpendicular al triangulo, pero lo malo (en C++ pero creo que en GM tambine) es que cada vertice solo puede tener un normal, es decir que si tienes un cubo (6lados, 12triangulos) debes tener 24 vertices (4 por cara) en vez de lo minimo necesario que es 8, calcular los normales es un trabajo muy tedioso, por ejemplo si tienes un cuadrado mirando hacia el eje Y+

(-3,0,3),(3,0,3),(-3,0,-3),(3,0,-3) //posiciones xyz de cuatro vertices

Entonces yo quiero que este cuadrado refleje la luz hacia el eje Y+ entonces los normales de cada vertice seria:

(0,1,0)//xn, yn, zn

cuando yn es positivo es hacia el y+, y contrario -yn=-y, lo mismo para el xn y zn


Esto es complicado de entender y muy maluco de calcular XD. Espero que me medio hayas entendido, suerte

Checa mi canal de Youtube para tutoriales y charlas sobre desarrollo de videojuegos.



Jucarave: Gracias por tu explicacion, aun la sigo meditando y si tengo dudas te pregunto.

Gabriel Moreno: Lo que intento entender son los vectores normales, no las luces, supongo que ese GEX tambien requiere de vectores normales pero aun asi gracias pues toda extencion es bienvenida (suelen ser para mejorar).
Saludos Cordiales!!!

#5 Agosto 09, 2011, 11:53:31 PM Ultima modificación: Agosto 10, 2011, 12:01:18 AM por brunoxzx
Pues yo lo hago usando una operaci?n que se llama cross product (que da como resultado un vector ortogonal a los otros dos (ortogonal es lo mismo que perpendicular pero en 3D)) y con eso ya b?sicamente tienes tu vector echo pero aun nos falta normalizarlo (a un vector se le llama normalizado cuanto tiene 1 de largo como cuando usas esto (lengdir_x(1,direction), para normalizar nuestro vecto lo ?nico que tenemos que hacer es dividir cada uno de sus componentes entre su largo y para obtener su largo usaremos el teorema de pitagoras.

Bueno tengo que hacer una salida de 10 minutos pero voy posteando, cuando llegue explico lo de mas, dejo el script.

[gml]
nx1 = (y3-y1)*(z2-z1)-(y2-y1)*(z3-z1);
ny1 = (z3-z1)*(x2-x1)-(z2-z1)*(x3-x1);
nz1 = (x3-x1)*(y2-y1)-(x2-x1)*(y3-y1);
fac1=sqrt((nx1*nx1)+(ny1*ny1)+(nz1*nz1));
nx1 /=fac1;
ny1 /=fac1;
nz1 /=fac1;[/gml]

#6 Agosto 10, 2011, 12:48:56 AM Ultima modificación: Agosto 10, 2011, 01:01:08 AM por Zeit
brunoxzx: Gracias por tu explicacion, entiendo bien la parte matematica, se como hallar 1 vector ortogonal a otros 2 y como normalizarlo, pero, cada vertice tiene su normal, como es que se haya el normal para cada vertice?... veo que en tu script calculas el ortogonal mediante el producto cruz de 2 vectores a aprtir de 3 vertices y los normalizas con su longitud, pero, solo resulta 1 normal y la primitiva requiere de 3 normales... Saludos.


EDIT: Ya entendi, cada combinacion de pares de vectores de tomados de los 3 vertices es un vector normal... Gracias.

Por cierto, segun he leido, no es necesario que los vectores sean unitario (normalizado) por que como escribi antes: si su norma es ||vn||>1 esta sobreiluminado y ||vn||<1 subiluminado.
Saludos Cordiales!!!

Pues que bueno que ya lo entendiste sin que te explicara mas  :-*.

MM yo creo que los vectores si tienen que estar normalizados (pero no estoy seguro), ya que la expresi?n para calcular la luz iluminaci?n es N*L (N=vector normalizado de tu triangulo) y L es la direcci?n de la luz normalizada.

Cita de: brunoxzx en Agosto 10, 2011, 01:16:41 AM
Pues que bueno que ya lo entendiste sin que te explicara mas  :-*.

MM yo creo que los vectores si tienen que estar normalizados (pero no estoy seguro), ya que la expresi?n para calcular la luz iluminaci?n es N*L (N=vector normalizado de tu triangulo) y L es la direcci?n de la luz normalizada.

De hecho, si estan normalizados deberian ser el mismo vector para los 3 vertices, no???
Saludos Cordiales!!!

#9 Agosto 10, 2011, 02:04:47 AM Ultima modificación: Agosto 10, 2011, 02:07:44 AM por brunoxzx
Uff bueno te dir? que hace 5 minutos pensaba que si era el mismo vector para los  3 v?rtices, pero luego me puse a escribir el c?digo que usaba para obtener las normales de mi terreno aqu? mismo en el post para ense??rtelo como ejemplo y cuando iba por la mitad me di cuenta de que si, es un vector distinto para cada v?rtice.

#10 Agosto 10, 2011, 03:51:10 AM Ultima modificación: Agosto 10, 2011, 03:53:10 AM por Zeit
Cita de: brunoxzx en Agosto 10, 2011, 02:04:47 AM
Uff bueno te dir? que hace 5 minutos pensaba que si era el mismo vector para los  3 v?rtices, pero luego me puse a escribir el c?digo que usaba para obtener las normales de mi terreno aqu? mismo en el post para ense??rtelo como ejemplo y cuando iba por la mitad me di cuenta de que si, es un vector distinto para cada v?rtice.

Pero, acabo de implementar lo que me indicas y me sale el mismo vector normal para los 3 vertices...
Saludos Cordiales!!!

#11 Agosto 10, 2011, 05:19:16 AM Ultima modificación: Agosto 10, 2011, 06:20:47 AM por brunoxzx
Pues bueno la verdad no soy nada bueno para explicar, te dejo como recuerdo que era el c?digo para generar mis terrenos, te pasar?a el c?digo como es, pero cuando intento abrir mi juego gm me da un error que dice que el archivo no existe (que raro, si pierdo ese juego pierdo varias d?as de trabajo) pero bueno aqu? el c?digo as? sabr?s si estas haciendo algo mal.


La verdad no recuerdo mucho sobre como inicie las variables pero lo mas importante esta aqui.
[gml]
for(i=0;i<global.tama?o_x-1;i+=1){
for(j=0;j<global.tama?o_y-1;j+=1){

x1=i
y1=j
z1=z[i,j]

x2=i+1
y2=j
z2=z[i+1,j]

x3=i
y3=j+1
z3=z[i,j+1]

nx1 = (y3-y1)*(z2-z1)-(y2-y1)*(z3-z1);
ny1 = (z3-z1)*(x2-x1)-(z2-z1)*(x3-x1);
nz1 = (x3-x1)*(y2-y1)-(x2-x1)*(y3-y1);
fac1=sqrt((nx1*nx1)+(ny1*ny1)+(nz1*nz1));
nx1 /=fac1;
ny1 /=fac1;
nz1 /=fac1;

normal_x[i,j]=nx1
normal_y[i,j]=ny1
normal_z[i,j]=nz1
}}[/gml]

Bueno ya echo todo eso sigue dibujar mi terreno.

[gml]for(i=0;i<global.tama?o_x;i+=1){
for(j=0;j<global.tama?o_y;j+=1){

//64 es el tama?o de cada cuadrado
d3d_primitive_begin(pr_trianglefan)

d3d_vertex_normal(i*64,j*64,z[i,j],normal_x[i,j],normal_y[i,j],normal_z[i,j])

d3d_vertex_normal(i*64+64,j*64,z[i,j],normal_x[i+1,j],normal_y[i+1,j],normal_z[i+1,j])

d3d_vertex_normal(i*64+64,j*64+64,z[i+1,j+1],normal_x[i+1,j+1],normal_y[i+1,j+1],normal_z[i+1,j+1])

d3d_vertex_normal(i*64,j*64+64,z[i,j+1],normal_x[i,j+1],normal_y[i,j+1],normal_z[i,j+1])
}}[/gml]

Creo que era un poco distinta la manera como se dibujaba el terreno, pero b?sicamente eso es todo, espero que con eso entiendas como va acomodados los valores de las normales en tus modelos.

Hola, utilizando este script (script_pcn):

[gml]{
var r;
vnx=argument1*argument5-argument2*argument4;
vny=argument2*argument3-argument0*argument5;
vnz=argument0*argument4-argument1*argument3;
r=point_distance_3d(0,0,0,vnx,vny,vnz);//esta funcion es de GM8.1...
vnx/=r;
vny/=r;
vnz/=r;
}[/gml]

Y lo utilizo asi:

[gml]{
script_pcn(vector[0,0]-vector[1,0],vector[0,1]-vector[1,1],vector[0,2]-vector[1,2],vector[0,0]-vector[2,0],vector[0,1]-vector[2,1],vector[0,2]-vector[2,2]);
normal[0,0]=vnx;
normal[0,1]=vny;
normal[0,2]=vnz;
script_pcn(vector[1,0]-vector[0,0],vector[1,1]-vector[0,1],vector[1,2]-vector[0,2],vector[1,0]-vector[2,0],vector[1,1]-vector[2,1],vector[1,2]-vector[2,2]);
normal[1,0]=-vnx;//sale al revez...
normal[1,1]=-vny;//sale al revez...
normal[1,2]=-vnz;//sale al revez...
script_pcn(vector[2,0]-vector[0,0],vector[2,1]-vector[0,1],vector[2,2]-vector[0,2],vector[2,0]-vector[1,0],vector[2,1]-vector[1,1],vector[2,2]-vector[1,2]);
normal[2,0]=vnx;
normal[2,1]=vny;
normal[2,2]=vnz;
}[/gml]

Donde los arreglos vector y normal son los vectores a dibujar pero los normales me salen iguales (excepto el vector normal 2 pero es comun en GM pues corresponde al eje Y), y creo que esto es equivalente a lo que tu haces. Saludos.
Saludos Cordiales!!!

Si, creo que ese es el equivalente (al fin a?adieron point_distance_3d), espero que lo que te di te haya servido de algo.

Cita de: brunoxzx en Agosto 10, 2011, 06:19:57 AM
Si, creo que ese es el equivalente (al fin a?adieron point_distance_3d), espero que lo que te di te haya servido de algo.

Hola, gracias si me ha sido muy util tu ayuda. Ya analize matematicamente lo del producto cruz y si debe ser el mismo vector normal para los 3 vertices salvo por la longitud, pero si se normalizan son el mismo. Saludos.
Saludos Cordiales!!!