repos/TA159

Notas, resueltos y trabajos practicos de la materia Sistemas Gráficos
Commits Files Refs Submodules README LICENSE
clases/clases-onefile.md (845 lines)

Sistemas Gráficos

Clase 15-05-24

Renderer

  • toneMapping()
  • domElement() representa el contenido html a diferencia de setSize() el cual representa el tamano del canvas.

Scene

Object3D

Matrix

  • position
  • rotation
  • scale

Mesh

Siempre conviene aplicarle rotación/escala a la mesh por sobre la geometría ya que de esta manera se ahora memoria en la GPU

  • PBR Meterials

Material

Geometrías

  • Three.js utiliza triángulos para representar objetos, otra manera de trabajar es la Geometría Constructiva de Solidos (CSG por sus siglas en ingles)
  • BufferGeometryUtils(): es conveniente unir multiples objetos que no van a cambiar entre si.

Editor de three.js

Visit this link

Libros

Libros Escenciales

Clase 17-03-24

Sistemas de coordenadas

  • Terna derecha o terna izquierda
  • Three.js utiliza un sistema coordenado de terna derecha
  • Las transformaciones afines son aquellas que preservan la forma, son lineales
  • Coordenadas homogéneas
  • Las rotaciones siempre son desde el origen de coordenadas
  • Las matrices se inicializan a la matriz identidad
  • matrixAutoUpdate = false
  • Gimbal Lock
  • Cuaterniones

Clase 21-03-24

Arbol de Escena

  • Un sistemas de coordenadas relativo puede ser interpretado como multiples transformaciones

Correcta posición de los objectos en su sistema de coordenadas

  • Trasladar la geometría instead of mesh to set the coordinate system origin
  • Parent.add(Child) posición relativa al Parent
  • matrixWorld representa las coordenadas respecto al sistema de coordenadas absoluto
  • matrix representa las coordenadas respecto al sistema de coordenadas relativo

Contenedores

  • Los contenedores son los Group, también podrían ser Object3D

Clase 25-3-24

BufferAttributes

  • BufferAttributes
  • El constructor debe ser un (TypedArray)[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray]
  • Spread opearator (...)
  • Index buffer para ahorrar memoria eliminando vertices redundantes
  • bufferGeometry.setIndex()
  • Los intex buffers tambien son Typed Arrays verificar la precision
  • Modos de dibujo de WebGL
  • Three.js solo soporta GL_TRIANGLES para dibujar triángulos
  • WebGL permite utilizar un numero de vertices con un determinado material y otro numero de vertices con otro.
  • Regla de la mano derecha para determinar la cara frontal de un triangulo.
    • Solo se dibujan la cara frontal de los triángulos
  • flatShading()
  • WebGL interpola las normales de los vertices
  • La GPU interpola los vertices ya sea de colores, normales, etc.
  • Three.js side permite seleccionar que cara del triangulo dibujar
    const defaultMaterial = new THREE.MeshPhongMaterial({
        color: 0xff9900,
        side: THREE.DoubleSide,
    });
  • Los vectores normales deben tener norma 1

Tarea

  • 23 grados tierra

Clase 05-04-24

\tableofcontents

Formatos Soportados por Three.js

  • glTF
  • FBX
  • OBJ
  • COLLADA (DAE)
  • STL

Siendo el más importante y eficiente glTF

  • Dos versiones 1.0 y 2.0, siendo la primera obsoleta

GLTF

Los archivos .gltf son modelos 3D en formato JSON.

Los archivos .glb son la version binaria de los archivos gltf

Loaders

import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';
loader.load( 'models/helmet/DamagedHelmet.gltf',
            onModelLoaded,
            onProgress,
            onLoadError);
function onModelLoaded(gltf) {
    console.log('Model loaded', gltf);
    gltf.scene;
    scene.add(gltf.scene);
}
function onProgress(event) {
    console.log((event.loaded / event.total) * 100 + '% loaded');
}
  • CallBacks vs. Promises

Formate USDZ

Formato alternativo adoptado por Apple y desarrollado en conjunto por Pixar

Object promise

Eventos del Teclado

Primero hay definir un callback para cuando se produzca un evento sobre un objeto html en particular mientras la ventana del navegador este en foco

Document.addEventListener('keydown', keyHandler)
function keyHandler(event) {
    if (event.key == 'c' && event.ctrlKey && event.shiftKey) {
        console.log("Ctrl+Shift+c");
    }
}

Controles

FlyControl
OrbitControl
TrackballControl

User Interface

uil

uil

dat GUI

dat.GUI

let gui = new dat.GUI();
gui.add(params, 'cantidadTotal', 0, 10).step(1);

Matriz de Normales

  • El comportamiento deseado al trasladar y escalar un objeto, es que las normales conserven su dirección
  • El comportamiento deseado al rotar un objeto es que las normales cambien su dirección
  • Casos particulares incluyen escalado con diferente magnitud en sus componentes

Shaders

Uniforms

Las uniforms son variables globales que comparten todas las unidades de procesamiento de la GPU

// Se definen los uniforms que se usarán en los shaders
uniforms: {
    modelMatrix: { value: new THREE.Matrix4() },
    viewMatrix: { value: new THREE.Matrix4() },
    projectionMatrix: { value: new THREE.Matrix4() },
},

Varyings

Las varyings son variables globales que el Vertex Shader comparte con el Fragment Shader

Vertex Shader

precision highp float;

attribute vec3 position;
attribute vec2 uv;

uniform mat4 modelMatrix;
uniform mat4 viewMatrix;
uniform mat4 projectionMatrix;
varying vec2 vUv;

void main() {
    vec3 pos = position;	

    gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(pos, 1.0);
    vUv = uv;
}

Fragment Shader

precision highp float;
varying vec2 vUv;

void main() {
    // Se pinta el fragmento con las coordenadas de textura
    gl_FragColor = vec4(vUv, 0.0, 1.0);
}
Normal a una Superficie deformada
  • Versión de WebGl 2.0 (OpenGL 3.0) proporciona el calculo de las derivadas
  • Se calcula el vector gradiente
vec3 x=dFdx(vViewPos);
vec3 y=dFdy(vViewPos);
// Normal de la superficie surge de la normalización del producto cruz de los
// vectores gradiente
vec3 normal=normalize(cross(x,y));

Clase 08-04-24

\tableofcontents

Superficies de Barrido (Sweep)

  • Segmentos = niveles - 1;
  • El buffer de indices no depende de la forma del objeto
  • Para calcular el vector normal de una superficie siempre es mejor computarla utilizando la expresión analítica de la superficie, ya que al realizar una interpolación de las normales de los vertices adyacentes se pueden cometer errores
  • Para la curva que forma el recorrido que genera la forma se necesita conocer la expresión analítica de la curva en forma paramétrica, por ejemplo para un tubo

$$f(u) =(Rcos(uPI/2),Rsen(uPI/2))$$

  • Posición
  • Tangente
  • Normal
  • Binormal

Matriz de Nivel

Para cada nivel se define la Matriz de Nivel que transforma la forma (sus vértices) del espacio de modelado al sistema de coordenadas del nivel

La transformación de puede descomponer en: una Rotación (en X,Y,Z) + una Traslación (al nivel)

Generación de Tapas

Las tapas las podemos resolver duplicando las matrices de Nivel del primer y último nivel del recorrido

  • De esta manera los indices son los mismo sol oque la posición de los vertices del ultimo nivel colapsara en un punto

  • Muchos objectos manufacturados se pueden modelar con el algoritmo de Sweep

  • Cualquier superficie de barrido se puede descomponer en un plano

Superficies de Revolución

Las superficies de barrido son superficies de barrido cuya curva de recorrido esun circulo de radio infinitesimal

Trabajo Práctico

Una de las partes fundamentales

Implementar el algoritmo de barrido

Forma

posiciones = [];
normales = [];

Recorrido

matricesDeNivel = [];

Clase 12-04-24

\tableofcontents

Geometrias

Superficies de Revolucion

LatheGeombetry

Genera superficies de revolución a partir de una forma, no interpola las normales

ExtrudeGeometry

  • Shape
  • Path

ConvexGeometry

Genera el polígono más chico que encierra a una nube de puntos

ParametricGeometry

Permite implementar superficies de barrido

const geometry = new THREE.ParametricGeometry( THREE.ParametricGeometries.klein, 25, 25 );
  • u y v varían siempre entre 0 y 1 independiente del tamaño de la superficie

ShapeGeometry

TubeGeometry

SDFGeometry

  • shadertoy -> Raymarching

InstancedBufferGeometry

Curvas de Bézier

Controlar la tangente de la curva

Permite realizar curvas a tramos mucho más fácil que con puntos, luego para representarla o utilizarla se discretiza

Puntos de control

Quadratic Bézier
Cubic Bézier

getPoint(t) devuelve el valor de la curva analíticamente

getPointAt(u) devuelve el valor de la curva al evaluar u en lookUpTable

  • La distancia minima para dibujar una curva son 4 puntos de control

Catmull-Rom Spline

Documental ILM: LIGHT & MAGIC (2022)

Son similares a las curvas de bezier pero permite calcular una curva suave que pasa por un conjunto determinado de puntos

Frenet Frames

Es un algoritmo que permite obtener un vector tangente

TubeGeometry

Clase 15-04-24

\tableofcontents

  • Binormal eje z positivo
  • Normal hacia la derecha derecha
  • Tangente recta

Para calcular la normal se toma un vector provisorio v = (0,1,0) provisorio luego realizar el producto vectorial con el vector tangente. Para calcular la Binormal, se multiplica vectorialmente la normal hallada con el vector tangente.

  • Matrix.slerp(): Interpola dos matrices

Texturas

Mapeo de texturas

Unidimensional

Arregla unidimensional

Bidimensional

Arreglo 2D

Rasterizador (o Sampler?)

Dado un valor devuelve el color basado en una textura

  • Minification
  • Magnification
Filtrado de Texturas

Se utiliza para mitigar el efecto del aliasing. El aliasing ocurre en la geometría también, y en ese caso se utiliza el anti-aliasing

Nearest Neighbor
Linear Filtering
Mipmapping

Se escalan las texturas hasta llegar a una textura de 1x1

Es preprocesado, por lo que no genera un gasto significativo en tiempo de ejecución, ademas de que no consume mas de 50% de la textura original

Tridimensional

Arreglo 3D

Bitmaps

Los bilmas es un formato de imagen y es así como se guarda en la memoria de la GPU

Wrapping Modes

  • gl.REPEAT La textura se repite infinitamente, aunque solo se guarda una copia
  • gl.CLAMP Se conserva el valor limite de la textura

Shader

Se pueden modificar las texturas ya que las texturas pasan por un Shader

  • En el vertex Shader se puede modificar las texturas

Texturas en Three.js

Textures

  • Los cubos son grupos de indices
  • Se pueden cargar multiples texturas a un grupo y Treejs asigna la texturas al grupo con el respectivo indice
  • Simulación de flujo de líquido mediante la modificación de texturas

Clase 19-04-24

\tableofcontents

Curvas

Las curvas pueden no verse y definir la geometría de la escena

Puntos de Control

Un conjunto de vertices con una determinada

Interpolación vs. Aproximación

En el primero, la curva pasa por los puntos de control, mientras que en la aproximación, la curva no pasa por ningún punto de control, salvo quizás los extremos

Métodos de aproximación

Curva B-Spline

Curva B-Spline

Curva de Lagrange

Invariancia Afín

Parametrización de Curvas

Método de Casteljau

Algoritmo de interpolación de puntos de control

Curvas de Bézier

La curva final es igual a la obtenida por el método de Casteljau, pero se utiliza un método distinto para obtenerla, el algoritmo utilizado en la curva de Bézier es recursivo

De control global, es decir, todos los puntos de control afectan a todos los demás

Se define una curva de Bézier de grado $n$ de la siguiente manera

$$C(u) = \sum^{n}{i=0} p{i} B^{n}_{i}(u)$$

Hay que tener en cuenta que el grado $n$ es la cantidad de puntos de control menos uno

Existe una forma matricial para halla de las curvas de Bézier

Para definir una curva cerrada se usan las mismas coordenadas para el punto inicial y final y ademas para que sea suave el segundo punto y el penúltimo deben tener la misma dirección

Polinomios de Berstein

$$B^{n}_{i}\left(u\right)$$

Propiedades
  • Comienzan y terminan en los puntos extremos, es decir, interpola dichos puntos
  • Comienza en el primer punto con la dirección del segundo
  • La curva de Bézier siempre queda definida dentro del casco convexo del polígono de control
  • La velocidad inicial de la curva, depende de la longitud del segundo punto
Concatenación de Curvas de Bézier

Se pueden obtener formas complejas concatenando Curvas de Bézier, para esto se usa el ultimo punto de la primer curva como el primero de la siguiente

Curvas de Catmull-Rom

Son curvas de interpolación similares a las de Bézier, solo que utilizan cuatro puntos de control como mínimo y luego la curva se dibuja con el segundo y tercer punto

Trabajo Práctico

  • Arboles -> Grupo dentro de Geometrías
  • Animar el nivel del agua
  • Height Maps o Elevation Map
  • World Machine Sirve para crear Elevation Maps

Clase 22-04-24

\tableofcontents

Transformaciones

Map de coordenadas UV

En superficies de barrido

Utilizar getPointAt() por sobre getPoint()

En tapas

Shape

Perlin noise

  • Se utilizan números pseudo-aleatorios para generar ruido

Repetición de texturas en el Sampler

Para cubrir una extension mayor que el de la textura evitando que la repetición de la misma sea evidente, una técnica es repetir la textura pero con diferentes escalas, siendo el valor de la escala un numero no múltiplo, luego mezclar todas las texturas escaladas

Clase 26-04-24

\tableofcontents

Notas sobre el Trabajo Práctico

  • Para la cámara en primera persona, se puede agregar un botón a la interfaz para iniciar la captura del teclado (debido a como funcionan los navegadores)
  • Textura skybox para el cielo
  • Para el modo noche se suele utilizar una iluminación azul oscuro

Sobre curvas de Bézier

  • Promedio ponderado de una serie de puntos de control
  • El algoritmo de Casteljau es un método iterativo que sirve para contruir la curva de Bézier
  • Con mas de 4 puntos de control la curva pierde "control local", por lo que se preferible utilizar curvas de Bézier de grado 4 concatenadas
  • La suma de todos las bases de Bernstein es 1, esto garantiza que la curva esta incluida en la envolvente convexa
  • Derivando la expresión de las bases de Bernstein se obtiene el vector tangente
  • The Beauty of Bézier Curves
  • OpenGL ES Shading Language (GLSL)

Sobre el parcial

El parcial es en mayoría teórico escrito, puede pedir algunos ejemplos breves de código

Temas que se evalúan

  • Pipeline gráfico
  • Transformaciones
  • Curvas de Bézier
  • Proyecciones

Iluminación

  • En glsl no existen los arreglos dinámicos ya que los programas deben ser estáticos, es decir, se debe declarar el "scope" de cada variable de antemano
  • Para declarar shaders en Three.JS se puede utilizar rawShaderMaterial
  • Reflexiones
  • Refracciones
  • Interreflexiones
  • Sub-Surface Scattering
  • Modelo phong de iluminación

Clase 29-04-24

\tableofcontents

Proyecciones Gráficas

  • Las cámaras se crean en el origen de coordenadas de la cámara, mirando en la dirección del eje z negativo
  • La cámara queda fija, la escena es la que transforma
  • La cámara tiene 6 grados de libertad:
    • traslación en los ejes x, y y z
    • rotación roll, pitch y yaw
  • Coordenadas de visualización a coordenadas de proyección
  • Cuando se aplica la proyección se pierde una dimensión

Proyección perspectiva

Quedan determinadas por el punto de proyección.

  • Se ubica el punto de proyección en el origen del sistema de coordenadas de la cámara
  • En las proyecciones en perspectiva hay que calcular una matriz de proyección para cada vértice, ya que la proyección depende de la distancia

Proyección paralela

Quedan determinadas por la dirección de la proyección

Proyecciones ortográficas
  • Debido a que la cámara apunta en dirección -z, para calcular las proyecciones ortográficas principales se rota la pieza y luego se proyecta sobre el eje z , de esta forma la coordenadas de la proyección sobre el plano de proyección son las coordenadas x e y
Multivista
Axonométricas Dimétricas
Axonométricas Isométricas
Axonométricas Trimétricas
Proyecciones oblicuas
  • z-buffer

Clase 03-05-24

\tableofcontents

Iluminación

  • En la luz puntual se utiliza un decaimiento lineal para compensar la falta de luz indirecta
  • Modelo de iluminación global vs. Iluminación

Modelo de Phong

  • Ley de Lambert
  • Los materiales tienen una componente especular, una difusa y una mezcla de ambos
  • Reflexión Difusa
  • Reflexión Especular
  • Para el calculo de la componente especular del modelo de Phong los vectores deben estar normalizados
  • $K_d$ es similar a $K_s$ pero para la componente difusa
  • Color de luz y de superficie
  • $\alpha$: Factor de "glossiness" (en three.js "shininess")
  • Coeficiente especular $K_s$

Mapa de Normales

  • Se codifica en RGB el valor de la normal
  • Luego el modelo de Phong se utiliza de la misma manera solo que con la nueva normal obtenida mediante el mapa de normales

Mapa de Desplazamiento

Mapa de Iluminación

Clase 06-05-24

\tableofcontents

Resolución Ejercicios de Proyección

En las proyecciones en perspectiva se necesita un foco, mientras que las proyecciones paralelas una dirección.

Para determinar las ecuaciones de la proyección en perspectiva se sabe que los triángulos que forman el plano con el punto foco y el punto a proyectar con el punto foco, son triángulos semejantes, sabiendo esto se puede hallar una relación entre los catetos de los triángulos.

  • Parámetros de Cámara
    • Near
    • Far
    • Frustum
  • Demo Proyección
  • En el z-buffer se guarda la posición en el eje z de los fragmentos para luego determinar que fragmento dibujar por sobre cual, en función de la distancia a la cámara

Color

  • El color es una sensación que percibe el ser humano
  • El termino "luz blanca" hace referencia a toda la gama de grises
  • Hay tonalidades que no se corresponden a una longitud de onda, por ejemplo la gama de magenta (el violeta no es magenta). Este tipo de tonalidades se denominan no espectrales justamente porque no corresponden a una longitud de onda. Por el contrario los tonos espectrales, son aquellos que tiene una longitud de onda del espectro electromagnético asociada.
  • Los monitores de las computadoras no representan todos los colores ya que con tres colores monocromáticos no se pueden representar todos los colores. Los colores que se pierden son los totalmente saturados.
  • Modelo CIE 1931
    • Diagrama de cromaticidad
    • GAMUT
  • Modelo RGB (Red-Green-Blue)
  • Modelo CMY (Cyan-Magenta-Yellow)

Clase 16-05-24

\tableofcontents

Efectos de post-procesado con EffectComposer

  • Se utiliza para aplicar filtros a una imagen ya generada
  • Ocurre al final del pipeline gráfico
  • Estos filtros por lo general utilizan información de profundidad del depthBuffer en el cual se almacena la coordenada z de los objetos cuando se proyectan en la imagen final
  • El rasterizador solo dibuja lo que pasa por el centro del pixel
  • Para el efecto de blur se utiliza un filtro de convolución

Render to texture

Se guarda el resultado de un render en una textura y luego se puede aplicar sobre un objeto

Partículas

Las partículas se representan utilizando sprites los cuales son imágenes de 2D que siempre están de frente a la cámara

Shadow maps

Se guarda una imagen del render en escala de grises con más precision de los normal, por lo general float16 o float32. Luego la luz "ilumina" hasta una profundidad dada por el mapa de grises

  • Solo funciona con luces que tienen frustum

Raycaster

Calcula la intersección entre un rayo y un objeto. Se puede utilizar para interacciones con el mouse, utilizando como rayo aquel que se origina en la cámara y atraviesa el cursor.

// update the picking ray with the camera and pointer position
raycaster.setFromCamera( pointer, camera );

// calculate objects intersecting the picking ray
const intersects = raycaster.intersectObjects( scene.children );

Web Audio

Se puede utilizar para simular sonidos tridimensionales. Tiene un modelo muy preciso para simular como absorbe las frecuencias el cráneo humano

Clase 24-05-24

\tableofcontents

Links útiles sobre color

NOTA: El Cubo RGB, CMY se toma en el coloquio

  • El modelo CMY es un modelo sustractivo, ya que al restar valores a las coordenadas se aumenta luz, mientras que en el modelo RGB al aumenta los valores RGB se aumenta luz.
  • Corrección de gamma: se aplica una curva de transferencia o curva de gamma a la imagen para corregir el tono de los colores oscuros y claros Color management
  • Espacio RGB lineal o RGB con curva de gamma.
  • Cuando se carga una imagen en Three.JS se debe conocer el modo en que esta guardada la imagen (por ejemplo en sRGB).
   1 # Sistemas Gráficos
   2 
   3 ## Clase 15-05-24
   4 
   5 ### Renderer
   6 
   7 - `toneMapping()`
   8 - `domElement()` representa el contenido html a diferencia de `setSize()` el
   9   cual representa el tamano del canvas.
  10 
  11 ### Scene
  12 
  13 ### Object3D
  14 
  15 #### Matrix
  16 
  17 - position
  18 - rotation
  19 - scale
  20 
  21 #### Mesh
  22 
  23 Siempre conviene aplicarle rotación/escala a la mesh por sobre la geometría ya
  24 que de esta manera se ahora memoria en la GPU
  25 
  26 - PBR Meterials
  27 
  28 #### Material
  29 
  30 #### Geometrías
  31 
  32 - Three.js utiliza triángulos para representar objetos, otra manera de trabajar
  33   es la Geometría Constructiva de Solidos (CSG por sus siglas en ingles)
  34 - `BufferGeometryUtils()`: es conveniente unir multiples objetos que no van a
  35   cambiar entre si.
  36 
  37 ### Editor de three.js
  38 
  39 [Visit this link](threejs.org/editor)
  40 
  41 
  42 ### Libros
  43 
  44 [Libros Escenciales](http://www.repo.dreamhosters.com/libros-escenciales.zip)
  45 ## Clase 17-03-24
  46 
  47 ### Sistemas de coordenadas
  48 
  49 - Terna derecha o terna izquierda
  50 - `Three.js` utiliza un sistema coordenado de terna derecha
  51 - Las transformaciones afines son aquellas que preservan la forma, son lineales
  52 - Coordenadas homogéneas
  53 - Las rotaciones siempre son desde el origen de coordenadas
  54 - Las matrices se inicializan a la matriz identidad
  55 - `matrixAutoUpdate = false`
  56 - Gimbal Lock
  57 - Cuaterniones
  58 ## Clase 21-03-24
  59 
  60 ### Arbol de Escena
  61 
  62 - Un sistemas de coordenadas relativo puede ser interpretado como multiples
  63   transformaciones
  64 
  65 ### Correcta posición de los objectos en su sistema de coordenadas
  66 
  67 - Trasladar la geometría instead of mesh to set the coordinate system origin
  68 - `Parent.add(Child)` posición relativa al `Parent`
  69 - `matrixWorld` representa las coordenadas respecto al sistema de coordenadas
  70   absoluto
  71 - `matrix` representa las coordenadas respecto al sistema de coordenadas
  72   relativo
  73 
  74 ### Contenedores
  75 
  76 - Los contenedores son los `Group`, también podrían ser `Object3D`
  77 ## Clase 25-3-24
  78 
  79 ### BufferAttributes
  80 
  81 - [BufferAttributes](https://threejs.org/docs/index.html?q=bufferat#api/en/core/BufferAttribute)
  82 - El constructor debe ser un
  83   (TypedArray)[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray]
  84 - Spread opearator (...)
  85 - `Index buffer` para ahorrar memoria eliminando vertices redundantes
  86 - `bufferGeometry.setIndex()`
  87 - Los intex buffers tambien son Typed Arrays *verificar la precision*
  88 - Modos de dibujo de WebGL
  89 - Three.js solo soporta GL_TRIANGLES para dibujar triángulos
  90 - WebGL permite utilizar un numero de vertices con un determinado material y
  91   otro numero de vertices con otro.
  92 - Regla de la mano derecha para determinar la cara frontal de un triangulo.
  93     * Solo se dibujan la cara frontal de los triángulos
  94 - `flatShading()`
  95 - WebGL interpola las normales de los vertices
  96 - La GPU interpola los vertices ya sea de colores, normales, etc.
  97 - Three.js `side` permite seleccionar que cara del triangulo dibujar
  98 
  99 ```js
 100     const defaultMaterial = new THREE.MeshPhongMaterial({
 101         color: 0xff9900,
 102         side: THREE.DoubleSide,
 103     });
 104 ```
 105 
 106 - Los vectores normales deben tener norma `1`
 107 
 108 ### Tarea
 109 
 110 - 23 grados tierra
 111 ## Clase 05-04-24
 112 
 113 \tableofcontents
 114 
 115 ### Formatos Soportados por Three.js
 116 
 117 * glTF
 118 * FBX
 119 * OBJ
 120 * COLLADA (DAE)
 121 * STL
 122 
 123 Siendo el más importante y eficiente `glTF`
 124 
 125 * Dos versiones 1.0 y 2.0, siendo la primera obsoleta
 126 
 127 ### GLTF
 128 
 129 Los archivos `.gltf` son modelos 3D en formato JSON.
 130 
 131 Los archivos `.glb` son la version binaria de los archivos `gltf`
 132 
 133 ### Loaders
 134 
 135 ```js
 136 import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';
 137 ```
 138 
 139 ```js
 140 loader.load( 'models/helmet/DamagedHelmet.gltf',
 141             onModelLoaded,
 142             onProgress,
 143             onLoadError);
 144 ```
 145 
 146 ```js
 147 function onModelLoaded(gltf) {
 148     console.log('Model loaded', gltf);
 149     gltf.scene;
 150     scene.add(gltf.scene);
 151 }
 152 ```
 153 
 154 ```js
 155 function onProgress(event) {
 156     console.log((event.loaded / event.total) * 100 + '% loaded');
 157 }
 158 ```
 159 
 160 * CallBacks vs. Promises
 161 
 162 ### Formate USDZ
 163 
 164 Formato alternativo adoptado por Apple y desarrollado en conjunto por Pixar
 165 
 166 Object promise
 167 
 168 ### Eventos del Teclado
 169 
 170 Primero hay definir un callback para cuando se produzca un evento sobre un
 171 objeto html en particular mientras la ventana del navegador este en foco
 172 
 173 ```js
 174 Document.addEventListener('keydown', keyHandler)
 175 ```
 176 
 177 ```js
 178 function keyHandler(event) {
 179     if (event.key == 'c' && event.ctrlKey && event.shiftKey) {
 180         console.log("Ctrl+Shift+c");
 181     }
 182 }
 183 ```
 184 
 185 #### Controles
 186 
 187 ##### FlyControl
 188 
 189 ##### OrbitControl
 190 
 191 ##### TrackballControl
 192 
 193 #### User Interface
 194 
 195 ##### uil
 196 
 197 [uil](https://github.com/lo-th/uil)
 198 
 199 #### dat GUI
 200 
 201 [dat.GUI](https://github.com/dataarts/dat.gui)
 202 
 203 ```js
 204 let gui = new dat.GUI();
 205 gui.add(params, 'cantidadTotal', 0, 10).step(1);
 206 ```
 207 
 208 ### Matriz de Normales
 209 
 210 * El comportamiento deseado al trasladar y escalar un objeto, es que las
 211   normales conserven su dirección
 212 * El comportamiento deseado al rotar un objeto es que las normales cambien su
 213   dirección
 214 * Casos particulares incluyen escalado con diferente magnitud en sus componentes
 215 
 216 ### Shaders
 217 
 218 #### Uniforms
 219 
 220 Las `uniforms` son variables globales que comparten todas las unidades de
 221 procesamiento de la GPU
 222 
 223 ```js
 224 // Se definen los uniforms que se usarán en los shaders
 225 uniforms: {
 226     modelMatrix: { value: new THREE.Matrix4() },
 227     viewMatrix: { value: new THREE.Matrix4() },
 228     projectionMatrix: { value: new THREE.Matrix4() },
 229 },
 230 ```
 231 
 232 #### Varyings
 233 
 234 Las `varyings` son variables globales que el Vertex Shader comparte con el
 235 Fragment Shader
 236 
 237 #### Vertex Shader
 238 
 239 ```c
 240 precision highp float;
 241 
 242 attribute vec3 position;
 243 attribute vec2 uv;
 244 
 245 uniform mat4 modelMatrix;
 246 uniform mat4 viewMatrix;
 247 uniform mat4 projectionMatrix;
 248 varying vec2 vUv;
 249 
 250 void main() {
 251     vec3 pos = position;    
 252 
 253     gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(pos, 1.0);
 254     vUv = uv;
 255 }
 256 ```
 257 
 258 #### Fragment Shader
 259 
 260 ```c
 261 precision highp float;
 262 varying vec2 vUv;
 263 
 264 void main() {
 265     // Se pinta el fragmento con las coordenadas de textura
 266     gl_FragColor = vec4(vUv, 0.0, 1.0);
 267 }
 268 ```
 269 
 270 ##### Normal a una Superficie deformada
 271 
 272 * Versión de WebGl 2.0 (OpenGL 3.0) proporciona el calculo de las derivadas
 273 * Se calcula el vector gradiente
 274 
 275 ```c
 276 vec3 x=dFdx(vViewPos);
 277 vec3 y=dFdy(vViewPos);
 278 ```
 279 
 280 ```c
 281 // Normal de la superficie surge de la normalización del producto cruz de los
 282 // vectores gradiente
 283 vec3 normal=normalize(cross(x,y));
 284 ```
 285 ## Clase 08-04-24
 286 
 287 \tableofcontents
 288 
 289 ### Superficies de Barrido (Sweep)
 290 
 291 * Segmentos = niveles - 1;
 292 * El buffer de indices no depende de la forma del objeto
 293 * Para calcular el vector normal de una superficie siempre es mejor computarla
 294   utilizando la expresión analítica de la superficie, ya que al realizar una
 295   interpolación de las normales de los vertices adyacentes se pueden cometer
 296   errores
 297 * Para la curva que forma el recorrido que genera la forma se necesita conocer
 298   la expresión analítica de la curva en forma paramétrica, por ejemplo para un
 299   tubo
 300 
 301 $$f(u) =(R*cos(u*PI/2),R*sen(u*PI/2))$$
 302 
 303 * Posición
 304 * Tangente
 305 * Normal
 306 * Binormal
 307 
 308 #### Matriz de Nivel
 309 
 310 Para cada nivel se define la **Matriz de Nivel** que transforma la forma (sus
 311 vértices) del espacio de modelado al sistema de coordenadas del nivel
 312 
 313 La transformación de puede descomponer en: una Rotación (en X,Y,Z) + una
 314 Traslación (al nivel)
 315 
 316 #### Generación de Tapas
 317 
 318 > Las tapas las podemos resolver duplicando las matrices de Nivel del primer y
 319 > último nivel del recorrido
 320  
 321 * De esta manera los indices son los mismo sol oque la posición de los vertices
 322   del ultimo nivel colapsara en un punto
 323 
 324 * Muchos objectos manufacturados se pueden modelar con el algoritmo de Sweep
 325 * Cualquier superficie de barrido se puede descomponer en un plano
 326 
 327 ### Superficies de Revolución
 328 
 329 Las superficies de barrido son superficies de barrido cuya curva de recorrido
 330 esun circulo de radio infinitesimal
 331 
 332 ### Trabajo Práctico
 333 
 334 Una de las partes fundamentales
 335 
 336 > Implementar el algoritmo de barrido
 337 
 338 #### Forma
 339 
 340 ```js
 341 posiciones = [];
 342 normales = [];
 343 ```
 344 
 345 #### Recorrido
 346 
 347 ```js
 348 matricesDeNivel = [];
 349 ```
 350 ## Clase 12-04-24
 351 
 352 \tableofcontents
 353 
 354 ### Geometrias
 355 #### Superficies de Revolucion
 356 
 357 #### [LatheGeombetry](https://threejs.org/docs/#api/en/geometries/LatheGeometry)
 358 
 359 Genera superficies de revolución a partir de una forma, no interpola las
 360 normales
 361 
 362 #### ExtrudeGeometry
 363 
 364 * Shape
 365 * Path
 366 
 367 #### ConvexGeometry
 368 
 369 Genera el polígono más chico que encierra a una nube de puntos
 370 
 371 #### ParametricGeometry
 372 
 373 Permite implementar superficies de barrido
 374 
 375 ```js
 376 const geometry = new THREE.ParametricGeometry( THREE.ParametricGeometries.klein, 25, 25 );
 377 ```
 378 
 379 * `u` y `v` varían siempre entre 0 y 1 independiente del tamaño de la superficie
 380 
 381 #### ShapeGeometry
 382 
 383 #### TubeGeometry
 384 
 385 #### SDFGeometry
 386 
 387 * shadertoy -> Raymarching
 388 
 389 #### [InstancedBufferGeometry](https://threejs.org/docs/#api/en/core/InstancedBufferGeometry)
 390 
 391 #### Curvas de Bézier
 392 
 393 > Controlar la tangente de la curva
 394 
 395 Permite realizar curvas a tramos mucho más fácil que con puntos, luego para
 396 representarla o utilizarla se discretiza
 397 
 398 Puntos de control
 399 
 400 ##### Quadratic Bézier
 401 
 402 ##### Cubic Bézier
 403 
 404 `getPoint(t)` devuelve el valor de la curva analíticamente
 405 
 406 `getPointAt(u)` devuelve el valor de la curva al evaluar `u` en `lookUpTable`
 407 
 408 * La distancia minima para dibujar una curva son 4 puntos de control
 409 
 410 #### Catmull-Rom Spline
 411 
 412 > Documental ILM: LIGHT & MAGIC (2022)
 413 
 414 Son similares a las curvas de bezier pero permite calcular una curva suave que
 415 pasa por un conjunto determinado de puntos
 416 
 417 #### [Frenet Frames](https://janakiev.com/blog/framing-parametric-curves)
 418 
 419 Es un algoritmo que permite obtener un vector tangente
 420 
 421 `TubeGeometry`
 422 ## Clase 15-04-24 
 423 
 424 \tableofcontents
 425 
 426 * Binormal eje z positivo
 427 * Normal hacia la derecha derecha
 428 * Tangente recta
 429 
 430 > Para calcular la normal se toma un vector provisorio `v = (0,1,0)` provisorio
 431 > luego realizar el producto vectorial con el vector tangente. Para calcular la
 432 > Binormal, se multiplica vectorialmente la normal hallada con el vector
 433 > tangente.
 434 
 435 * `Matrix.slerp()`: Interpola dos matrices
 436 
 437 ### Texturas
 438 
 439 Mapeo de texturas
 440 
 441 #### Unidimensional
 442 
 443 > Arregla unidimensional
 444 
 445 #### Bidimensional
 446 
 447 > Arreglo 2D
 448 
 449 ##### Rasterizador (o Sampler?)
 450 
 451 Dado un valor devuelve el color basado en una textura
 452 
 453 * Minification
 454 * Magnification
 455 
 456 ###### Filtrado de Texturas
 457 
 458 Se utiliza para mitigar el efecto del aliasing. El aliasing ocurre en la
 459 geometría también, y en ese caso se utiliza el anti-aliasing
 460 
 461 ###### Nearest Neighbor
 462 
 463 ###### Linear Filtering
 464 
 465 ###### Mipmapping
 466 
 467 Se escalan las texturas hasta llegar a una textura de 1x1
 468 
 469 Es preprocesado, por lo que **no genera** un gasto significativo en tiempo de
 470 ejecución, ademas de que no consume mas de 50% de la textura original
 471 
 472 #### Tridimensional
 473 
 474 > Arreglo 3D
 475 
 476 #### Bitmaps
 477 
 478 Los bilmas es un formato de imagen y es así como se guarda en la memoria de la
 479 GPU
 480 
 481 #### Wrapping Modes
 482 
 483 * `gl.REPEAT` La textura se repite infinitamente, aunque solo se guarda una copia
 484 * `gl.CLAMP` Se conserva el valor limite de la textura
 485 
 486 #### Shader
 487 
 488 Se pueden modificar las texturas ya que las texturas pasan por un Shader
 489 
 490 * En el vertex Shader se puede modificar las texturas
 491 
 492 ### Texturas en Three.js
 493 
 494 [Textures](https://threejs.org/manual/#en/textures)
 495 
 496 * Los cubos son grupos de indices
 497 * Se pueden cargar multiples texturas a un grupo y Treejs asigna la texturas al
 498   grupo con el respectivo indice
 499 * Simulación de flujo de líquido mediante la modificación de texturas
 500 ## Clase 19-04-24 
 501 
 502 \tableofcontents
 503 
 504 ### Curvas
 505 
 506 Las curvas pueden no verse y definir la geometría de la escena
 507 
 508 #### Puntos de Control
 509 
 510 Un conjunto de vertices con una determinada
 511 
 512 #### Interpolación vs. Aproximación
 513 
 514 En el primero, la curva pasa por los puntos de control, mientras que en la
 515 aproximación, la curva no pasa por ningún punto de control, salvo quizás los
 516 extremos 
 517 
 518 #### Métodos de aproximación
 519 
 520 ##### Curva B-Spline
 521 
 522 [Curva B-Spline](https://en.wikipedia.org/wiki/B-spline)
 523 
 524 ##### Curva de Lagrange
 525 
 526 #### Invariancia Afín
 527 
 528 #### Parametrización de Curvas
 529 
 530 #### Método de Casteljau
 531 
 532 Algoritmo de interpolación de puntos de control
 533 
 534 #### Curvas de Bézier
 535 
 536 La curva final es igual a la obtenida por el método de Casteljau, pero se
 537 utiliza un método distinto para obtenerla, el algoritmo utilizado en la curva de
 538 Bézier es recursivo
 539 
 540 > De control global, es decir, todos los puntos de control afectan a todos los
 541 > demás
 542 
 543 Se define una curva de Bézier de grado $n$ de la siguiente manera
 544 
 545 $$C(u) = \sum^{n}_{i=0} p_{i} B^{n}_{i}(u)$$
 546 
 547 Hay que tener en cuenta que el grado $n$ es la cantidad de puntos de control
 548 menos uno
 549 
 550 Existe una forma matricial para halla de las curvas de Bézier
 551 
 552 > Para definir una curva cerrada se usan las mismas coordenadas para el punto
 553 > inicial y final y ademas para que sea suave el segundo punto y el penúltimo
 554 > deben tener la misma dirección
 555 
 556 > Polinomios de Berstein
 557 > 
 558 > $$B^{n}_{i}\left(u\right)$$
 559 
 560 ##### Propiedades
 561 
 562 * Comienzan y terminan en los puntos extremos, es decir, interpola dichos puntos
 563 * Comienza en el primer punto con la dirección del segundo 
 564 * La curva de Bézier siempre queda definida dentro del casco convexo del
 565   polígono de control
 566 * La velocidad inicial de la curva, depende de la longitud del segundo punto
 567 
 568 ##### Concatenación de Curvas de Bézier
 569 
 570 Se pueden obtener formas complejas concatenando Curvas de Bézier, para esto se
 571 usa el ultimo punto de la primer curva como el primero de la siguiente
 572 
 573 #### Curvas de Catmull-Rom
 574 
 575 Son curvas de interpolación similares a las de Bézier, solo que utilizan cuatro
 576 puntos de control como mínimo y luego la curva se dibuja con el segundo y tercer
 577 punto
 578 
 579 #### Trabajo Práctico
 580 
 581 * Arboles -> Grupo dentro de Geometrías
 582 * Animar el nivel del agua
 583 * Height Maps o Elevation Map
 584 * [World Machine](https://www.world-machine.com/) Sirve para crear Elevation Maps
 585 ## Clase 22-04-24 
 586 
 587 \tableofcontents
 588 
 589 ### Transformaciones
 590 
 591 ### Map de coordenadas UV
 592 
 593 #### En superficies de barrido
 594 
 595 Utilizar `getPointAt()` por sobre `getPoint()`
 596 
 597 #### En tapas
 598 
 599 [Shape](https://threejs.org/docs/index.html?q=shape#api/en/extras/core/Shape)
 600 
 601 ### [Perlin noise](https://es.wikipedia.org/wiki/Ruido_Perlin)
 602 
 603 * Se utilizan números pseudo-aleatorios para generar ruido
 604 
 605 ### Repetición de texturas en el Sampler
 606 
 607 Para cubrir una extension mayor que el de la textura evitando que la repetición
 608 de la misma sea evidente, una técnica es repetir la textura pero con diferentes
 609 escalas, siendo el valor de la escala un numero no múltiplo, luego mezclar todas
 610 las texturas escaladas
 611 ## Clase 26-04-24 
 612 
 613 \tableofcontents
 614 
 615 ### Notas sobre el Trabajo Práctico
 616 
 617 * Para la cámara en primera persona, se puede agregar un botón a la interfaz
 618   para iniciar la captura del teclado (debido a como funcionan los navegadores)
 619 * Textura `skybox` para el cielo
 620     - En caso de utilizar se puede hacer con
 621       [`renderer.background`](https://github.com/mrdoob/three.js/blob/master/src/renderers/WebGLRenderer.js#L31)
 622 * Para el modo noche se suele utilizar una iluminación azul oscuro  
 623 
 624 ### Sobre curvas de Bézier
 625 
 626 * Promedio ponderado de una serie de puntos de control
 627 * El algoritmo de Casteljau es un método iterativo que sirve para contruir la
 628   curva de Bézier
 629 * Con mas de 4 puntos de control la curva pierde "control local", por lo que se
 630   preferible utilizar curvas de Bézier de grado `4` concatenadas
 631 * La suma de todos las bases de Bernstein es `1`, esto garantiza que la curva
 632   esta incluida en la envolvente convexa 
 633 * Derivando la expresión de las bases de Bernstein se obtiene el vector tangente
 634 * [The Beauty of Bézier Curves](https://youtu.be/aVwxzDHniEw)
 635 * [OpenGL ES Shading Language (GLSL)](https://shaderific.com/glsl.html)
 636 
 637 ### Sobre el parcial
 638 
 639 El parcial es en mayoría teórico escrito, puede pedir algunos ejemplos breves de
 640 código 
 641 
 642 #### Temas que se evalúan
 643 
 644 * Pipeline gráfico
 645 * Transformaciones 
 646 * Curvas de Bézier
 647 * Proyecciones
 648 
 649 ### Iluminación
 650 
 651 * En `glsl` no existen los arreglos dinámicos ya que los programas deben ser
 652   estáticos, es decir, se debe declarar el "scope" de cada variable de antemano
 653 * Para declarar shaders en `Three.JS` se puede utilizar `rawShaderMaterial`
 654 * Reflexiones
 655 * Refracciones
 656 * Interreflexiones
 657 * Sub-Surface Scattering
 658 * Modelo `phong` de iluminación
 659 ## Clase 29-04-24 
 660 
 661 \tableofcontents
 662 
 663 ### Proyecciones Gráficas
 664 
 665 * Las cámaras se crean en el origen de coordenadas de la cámara, mirando en la
 666   dirección del eje `z` negativo
 667 * La cámara queda fija, la escena es la que transforma
 668 * La cámara tiene 6 grados de libertad:
 669     - traslación en los ejes `x`, `y` y `z`
 670     - rotación `roll`, `pitch` y `yaw`
 671 * Coordenadas de visualización a coordenadas de proyección
 672 * Cuando se aplica la proyección se pierde una dimensión
 673 
 674 #### Proyección perspectiva
 675 
 676 Quedan determinadas por el punto de proyección.
 677 
 678 * Se ubica el punto de proyección en el origen del sistema de coordenadas de la
 679   cámara
 680 * En las proyecciones en perspectiva hay que calcular una matriz de proyección
 681   para cada vértice, ya que la proyección depende de la distancia
 682 
 683 #### Proyección paralela
 684 
 685 Quedan determinadas por la dirección de la proyección 
 686 
 687 ##### Proyecciones ortográficas
 688 
 689 * Debido a que la cámara apunta en dirección `-z`, para calcular las
 690   proyecciones ortográficas principales se rota la pieza y luego se proyecta
 691   sobre el eje `z` , de esta forma la coordenadas de la proyección sobre el
 692   plano de proyección son las coordenadas `x` e `y`
 693 
 694 ###### Multivista
 695 
 696 ###### Axonométricas Dimétricas
 697 
 698 ###### Axonométricas Isométricas 
 699 
 700 ###### Axonométricas Trimétricas 
 701 
 702 ##### Proyecciones oblicuas
 703 
 704 * z-buffer
 705 ## Clase 03-05-24 
 706 
 707 \tableofcontents
 708 
 709 ### Iluminación
 710 
 711 * En la luz puntual se utiliza un decaimiento lineal para compensar la falta de
 712   luz indirecta
 713 * Modelo de iluminación global vs. Iluminación
 714 
 715 #### Modelo de Phong
 716 
 717 * Ley de Lambert
 718 * Los materiales tienen una componente especular, una difusa y una mezcla de
 719   ambos
 720 * Reflexión Difusa
 721 * Reflexión Especular
 722 * Para el calculo de la componente especular del modelo de Phong los vectores
 723   deben estar normalizados
 724 * $K_d$ es similar a $K_s$ pero para la componente difusa
 725 * Color de luz y de superficie
 726 * $\alpha$: Factor de "glossiness" (en `three.js` "shininess")
 727 * Coeficiente especular $K_s$
 728 
 729 #### Mapa de Normales
 730 
 731 * Se codifica en RGB el valor de la normal
 732 * Luego el modelo de Phong se utiliza de la misma manera solo que con la nueva
 733   normal obtenida mediante el mapa de normales
 734 
 735 #### Mapa de Desplazamiento
 736 
 737 #### Mapa de Iluminación
 738 ## Clase 06-05-24
 739 
 740 \tableofcontents
 741 
 742 ### Resolución Ejercicios de Proyección
 743 
 744 En las proyecciones en perspectiva se necesita un foco, mientras que las
 745 proyecciones paralelas una dirección.
 746 
 747 Para determinar las ecuaciones de la proyección en perspectiva se sabe que los
 748 triángulos que forman el plano con el punto foco y el punto a proyectar con el
 749 punto foco, son triángulos semejantes, sabiendo esto se puede hallar una
 750 relación entre los catetos de los triángulos.
 751 
 752 * Parámetros de Cámara
 753     - Near
 754     - Far
 755     - Frustum
 756 * [Demo Proyección](https://xnqor.csb.app/)
 757 * En el z-buffer se guarda la posición en el eje `z` de los fragmentos para
 758   luego determinar que fragmento dibujar por sobre cual, en función de la
 759   distancia a la cámara
 760 
 761 ### Color
 762 
 763 * El color es una sensación que percibe el ser humano
 764 * El termino "luz blanca" hace referencia a toda la gama de grises
 765 * Hay tonalidades que no se corresponden a una longitud de onda, por ejemplo la
 766   gama de magenta (el violeta no es magenta). Este tipo de tonalidades se
 767   denominan no espectrales justamente porque no corresponden a una longitud de
 768   onda. Por el contrario los tonos espectrales, son aquellos que tiene una
 769   longitud de onda del espectro electromagnético asociada.
 770 * Los monitores de las computadoras no representan todos los colores ya que con
 771   tres colores monocromáticos no se pueden representar todos los colores. Los
 772   colores que se pierden son los totalmente saturados.
 773 * Modelo CIE 1931
 774     - Diagrama de cromaticidad
 775     - GAMUT
 776 * Modelo RGB (Red-Green-Blue)
 777 * Modelo CMY (Cyan-Magenta-Yellow)
 778 ## Clase 16-05-24
 779 
 780 \tableofcontents
 781 
 782 ### Efectos de post-procesado con `EffectComposer`
 783 
 784 * Se utiliza para aplicar filtros a una imagen ya generada
 785 * Ocurre al final del pipeline gráfico
 786 * Estos filtros por lo general utilizan información de profundidad del
 787   `depthBuffer` en el cual se almacena la coordenada `z` de los objetos cuando
 788   se proyectan en la imagen final
 789 * El rasterizador solo dibuja lo que pasa por el centro del pixel
 790 * Para el [efecto de blur](https://threejs.org/examples/?q=post#webgl_postprocessing_unreal_bloom)
 791   se utiliza un filtro de convolución
 792 
 793 ### Render to texture
 794 
 795 Se guarda el resultado de un render en una textura y luego se puede aplicar
 796 sobre un objeto
 797 
 798 ### Partículas
 799 
 800 Las partículas se representan utilizando `sprites` los cuales son imágenes de 2D
 801 que siempre están de frente a la cámara
 802 
 803 ### Shadow maps
 804 
 805 Se guarda una imagen del render en escala de grises con más precision de los
 806 normal, por lo general `float16` o `float32`. Luego la luz "ilumina" hasta una
 807 profundidad dada por el mapa de grises
 808 
 809 * Solo funciona con luces que tienen frustum
 810 
 811 ### [Raycaster](https://threejs.org/docs/index.html?q=raycaster#api/en/core/Raycaster)
 812 
 813 Calcula la intersección entre un rayo y un objeto. Se puede utilizar para
 814 interacciones con el mouse, utilizando como rayo aquel que se origina en la
 815 cámara y atraviesa el cursor.
 816 
 817 ```js
 818 // update the picking ray with the camera and pointer position
 819 raycaster.setFromCamera( pointer, camera );
 820 
 821 // calculate objects intersecting the picking ray
 822 const intersects = raycaster.intersectObjects( scene.children );
 823 ```
 824 
 825 ### [Web Audio](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API)
 826 
 827 Se puede utilizar para simular sonidos tridimensionales. Tiene un modelo muy
 828 preciso para simular como absorbe las frecuencias el cráneo humano
 829 ## Clase 24-05-24
 830 
 831 \tableofcontents
 832 
 833 ### Links útiles sobre color
 834 
 835 > NOTA: El Cubo RGB, CMY se toma en el coloquio
 836 
 837 * El modelo CMY es un modelo sustractivo, ya que al restar valores a las
 838   coordenadas se aumenta luz, mientras que en el modelo RGB al aumenta los
 839   valores RGB se aumenta luz.
 840 * Corrección de gamma: se aplica una curva de transferencia o curva de gamma a
 841   la imagen para corregir el tono de los colores oscuros y claros
 842   [Color management](https://threejs.org/docs/?q=color#manual/en/introduction/Color-management0)
 843 * Espacio RGB lineal o RGB con curva de gamma.
 844 * Cuando se carga una imagen en Three.JS se debe conocer el modo en que esta
 845   guardada la imagen (por ejemplo en sRGB).