TA159

Notas, resueltos y trabajos practicos de la materia Sistemas Gráficos
Index Commits Files Refs Submodules README LICENSE
tp/README.md (5562B)
   1 # Trabajo Practico Sistemas Gráficos
   2 
   3 El trabajo practico consiste en implementar una escena en 3D en
   4 [WebGL](https://www.khronos.org/webgl/) utilizando la librería de JavaScript
   5 [Three.js](https://threejs.org/)
   6 
   7 ![screenshot](https://github.com/mjkloeckner/86.43-tp/assets/64109770/95ee0b32-0092-4627-bfe9-f45becda354a)
   8 
   9 ## Inicio Rápido
  10 
  11 Clone el repositorio con el siguiente comando:
  12 
  13 ```console
  14 $ git clone https://github.com/mjkloeckner/TA159.git
  15 ```
  16 
  17 Navegue al directorio del repositorio clonado y posteriormente a la carpeta del
  18 trabajo práctico
  19 
  20 ```console
  21 $ cd TA159/tp
  22 ```
  23 
  24 Instale las dependencias utilizando [npm](https://www.npmjs.com/)
  25 
  26 ```console
  27 $ npm install
  28 ```
  29 
  30 Finalmente inicialice un servidor Web en el directorio del trabajo práctico y
  31 posteriormente abra un navegador de internet en la correspondiente *URL*
  32 
  33 En caso de no contar con un servido web instalado, puede instalar
  34 [vite](https://vitejs.dev/) utilizando el siguiente comando de
  35 [npm](https://www.npmjs.com/):
  36 
  37 ```console
  38 $ npm -g install vite
  39 ```
  40 
  41 Instalado vite, inicialice el servidor con el siguiente comando:
  42 
  43 ```console
  44 $ vite
  45 ```
  46 
  47 Finalmente abra su navegador preferido en la *URL* especificado por vite.
  48 
  49 ## Dependencias
  50 
  51 * Un navegador que soporte [WebGL](https://get.webgl.org/)
  52 * [Node.js](https://nodejs.org/)
  53 * [npm](https://www.npmjs.com/)
  54 * [vite](https://www.npmjs.com/package/vite)
  55 
  56 ## Objetivos
  57 
  58 * [X] Terreno
  59 * [X] Arboles
  60 * [X] Vias de Tren
  61     - [X] Crear el terraplen
  62     - [X] Crear las vias
  63 * [ ] Locomotora
  64     - [X] Chassis, cabina, ruedas, caldera
  65     - [ ] Hacer que las ruedas roten sobre su eje
  66 * [X] Puente
  67     - [X] Base de ladrillos
  68     - [X] Estructura de Hierro
  69 * [X] Túnel
  70 * [X] Cámaras
  71     - [X] Orbital general
  72     - [X] Fija, locomotora frontal (desde la cabina hacia adelante)
  73     - [X] Fija, locomotora trasera (desde la cabina hacia atrás)
  74     - [X] Fija, con vistas al interior del túnel
  75     - [X] Fija, con vistas al interior del puente
  76     - [X] Primera persona (debe poder moverse sobre el terreno con el teclado y el mouse)
  77 * [X] Texturas
  78 * [X] Iluminación
  79     - [X] Modo noche/día
  80     - [X] Luz en el frente del tren
  81     - [ ] Lamparas en posiciones aleatorias del mapa
  82 
  83 ## Como se generan los elementos de la escena
  84 
  85 ### Terreno
  86 
  87 Para generar la geometría del terreno se utiliza un mapa de elevación el cual se
  88 puede encontrar en [`assets/elevationMap.png`](./assets/elevationMap.png), luego
  89 para la textura del terreno se utiliza 3 texturas diferentes, las cuales
  90 se utilizan en el terreno de acuerdo a la elevación del mismo.
  91 
  92 Para utilizar la misma textura varias veces y evitar que se note la repetición,
  93 se utiliza la función Ruido de Perlin para obtener valores pseudo-aleatorios.
  94 
  95 ### Arboles
  96 
  97 Los arboles se generan de manera aleatoria en todo el mapa, y se utiliza un mapa
  98 similar al mapa de elevación para verificar que no caiga en un punto muy bajo o
  99 muy alto, o una zona prohibida.
 100 
 101 La cantidad de arboles en el mapa se puede cambiar mediante la modificación del
 102 argumento del llamado a la función `buildTrees` en la función `buildScene` del
 103 archivo `/src/scene.js`, hay que tener en cuenta que si bien queda mejor con
 104 mas arboles en la escena, cuantos mas arboles haya peor será la performance.
 105 
 106 ### Terraplén y Vías de Tren
 107 
 108 Para generar las vías del tren se utiliza la función
 109 [`ParametricGeometry`](https://threejs.org/docs/index.html?q=param#examples/en/geometries/ParametricGeometry)
 110 de `three.js`, la cual genera una geometría a partir de una función paramétrica
 111 que recibe tres parámetros: `u`, `v` y un vector en espacio 3D.
 112 
 113 ### Locomotora
 114 
 115 A continuación se muestra el árbol de dependencias de los objetos que componen
 116 la locomotora
 117 
 118 ![Objeto tren: árbol de dependencia](./train-tree.png)
 119 
 120 Para realizar cada objeto de la locomotora se utilizan funciones primitivas de `three.js` tales como
 121 [`BoxGeometry`](https://threejs.org/docs/index.html?q=box#api/en/geometries/BoxGeometry) o
 122 [`CylinderGeometry`](https://threejs.org/docs/index.html?q=cylin#api/en/geometries/CylinderGeometry),
 123 las cuales generan cubos y cilindros, respectivamente.
 124 
 125 ### Túnel
 126 
 127 El túnel se genera con la función `ExtrudeGeometry()` utilizando como forma una
 128 curva predefinida.
 129 
 130 ### Puente
 131 
 132 El puente se genera por partes, siendo las partes principales las paredes y los
 133 soportes de metal (o `cage` como se define en el código), las paredes se generan
 134 de manera similar al túnel, extruyendo una curva, a diferencia que la curva que
 135 define la forma se define en base a parámetros definidos por el
 136 usuario, de esta manera se puede reutilizar el mismo código para ambos puentes.
 137 
 138 Para los soportes de metal del puente se utilizan cilindros para formar un cubo,
 139 luego se repite el cubo en base a parámetros especificados por el usuario.
 140 
 141 ### Iluminación
 142 
 143 La iluminación depende del modo (noche/día), en caso de estar en modo día se
 144 muestran 3 luces: ambiente, direccional y puntual, esta ultima imitando al sol,
 145 posicionándose de manera tal que coincida con el sol de la textura del cielo.
 146 
 147 En modo noche se oculta la luz ambiente y se cambia el color de la luz
 148 direccional por un tono más azulado, además se cambia la posición de la luz
 149 puntual para que coincida con la posición de la luna de la textura del cielo
 150 
 151 En cuanto a las luces del tren, solo se muestran cuando el modo noche esta
 152 activo, en modo día se oculta.
 153 
 154 ## Recursos Consultados
 155 
 156 * [Documentación de Three.js](https://threejs.org/docs/index.html#manual/en/introduction/Creating-a-scene)
 157 
 158 ## Licencia
 159 
 160 [MIT](./LICENSE)
 161