NOTA: Me explayo mucho acá para que se entienda. En el final haganlo más resumido. Y no elijan las respuestas por descarte buscando errores (Corte, A y B están mal por X e Y, por lo que la correcta es la C). Contesté así porque me cuesta explicar por qué están bien las cosas, y al profe no le gustó mucho, pero me perdonó XD)
1) La respuesta correcta es la 2: el avión se rota y luego se traslada como debe ser (Las transformaciones se realizan multiplicando matrices de Escalado, Rotado y luego Traslación, en ese orden), la hélice también se traslada y se rota correctamente, y en la última multiplicación de matrices, se transforma la hélice en función de la transformación del avión y queda como en la imagen. Noten que la 1 no puede ser porque en la última línea rota sólo en función de la traslación del avión, y la 3 no puede ser porque en la traslación suma ángulos, nada que ver.
2) Copio el código y marco los errores:
NOTA: El error C está en azul porque en realidad está bien y no sé por qué. Me olvidé de preguntarle al profe y sigo creyendo que es un error DX
VS_OUTPUT vs_corte_transversal(VS_INPUT Input)
{
VS_OUTPUT Ouput;
Output.worldPosition = mul(Input.Position, matWorld);
Output.Texcoord = Input.Texcoord;
return Output;
}
// Pixel Shader
float4 ps_corte_transversal(VS_OUTPUT input) : COLOR0
{
float4 plane = float4(A, B, C, D);
float distancia = dot(plane, float4(input.worldPosition, 1));
float epsilon = 0.3;
if (A. distancia == -epsilon) return B. float4(0, 0, 0, 0);
else if (C. distancia > epsilon) return float4(1, 0, 0, 1);
else return tex2D(diffuseMap, D. input.Position);
}
Error A: Esta condición causa que sólo se borre lo que hay en la recta donde el producto escalar da -0.3, no todo lo que hay detrás de ese plano. La condición debería ser distancia < -epsilon.
Error B: No se descarta el pixel en cuestión, sino que se pone uno invisible. Habría que usar discard.
Error C: Está en azul porque no es un error según la corrección. Para mi está mal porque pinta de rojo los píxeles que están del lado correcto del plano y fuera del límite, cuando debería colorear con el texel. Ahí debería haber un menor a distancia < epsilon, o algo. Pero bueno. Sepan que está mal y no sé donde está el error que falta.
Error D: Ahí debería ir Input.Texcoord, que es la coordenada de textura del pixel, no la posición en pantalla del pixel.
3) La respuesta correcta es la 3. Fijense que hace variar las coordenadas X y Z en función de la altura del punto, por lo que se mueve menos abajo que arriba. Noten que la 1 no puede ser porque mueve las Coordenadas X y Z sin importar su altura, por lo cual el tronco se mece igual tanto arriba como abajo, mientras que la 2 tampoco puede ser porque únicamente afecta a la coordenada Y, no a las demás, por lo que da la impresión que el árbol se agranda o se achica dependiendo del tiempo.
4)
A) La respuesta correcta es la 2. Recordando un poco de Álgebra, el producto escalar, o producto punto (dot product) se define:
\[a \cdot b = |a| |b| cos \alpha\]
Entonces, si tomo el producto escalar de dos vectores normalizados me quedaría:
\[\widehat{a} \cdot \widehat{b} = cos \alpha \]
Porque el módulo de un vector normalizado, es decir, un versor, es 1.
Entonces, si tomo el producto escalar entre el versor de dirección del cono de luz y el versor del vector formado por el punto del mundo que pruebo y la posicion de la luz (En el modelo 3D claro está), con esto sé el coseno del ángulo entre el cono y el punto que estoy probando. Luego, lo comparo con el ángulo de apertura de la luz (SpotLightAngleOfView) - Tengo mis dudas en esto, porque debería ser un coseno también - y si es menor, entonces está adentro del cono. Si no, pongo el color negro.
La 1 no puede ser porque no hace el producto escalar para determinar que esté adentro del cono y la 3 tampoco porque considera el punto de la pantalla 2D y no del modelo 3D (Recuerden que si queremos hacer cálculos así en los PS tenemos que sobrecargar los inputs con información del espacio 3D en los VS)
B) No hay efectos de sombra puesto que para ello es necesario un shader de post-procesado que genere un lightmap de todos los píxeles del frame en su conjunto para realizar el efecto de sombras (No me pregunten por qué está bien esto... Me salvó que diga shader de post-procesado en el título del punto 4...)