ProyectosProyectos personales

Rastrojero

Simulador off-road en el navegador con un Rastrojero 1971 modelado en Blender: físicas de vehículo con Rapier, render con WebGPU y un modo edición para armar tu propio circuito de pruebas.

Estado
En desarrollo
Periodo
2025.09 — actualidad
Tipo
Simulación
Rol
Proyecto individual, Física y simulación, Modelado 3D
Tecnologías
  • Three.js
  • WebGPU
  • TSL
  • Rapier
  • Blender
Log de desarrollo
24 entradas

Contexto y objetivo

El Rastrojero es la camioneta utilitaria que se fabricó en Argentina a partir de los años cincuenta. Modelé la versión de 1971 en Blender y la llevé a Three.js para manejarla con físicas reales: suspensión, tracción trasera y frenos.

La idea fue creciendo de a poco: primero el manejo, después un terreno para probarlo y por último un editor para que cada uno arme su propio circuito con conos, rampas, carteles, barreras y una zona de carga. El proceso está documentado en el log de abajo.

Demo

Manejo: W / ↑ acelerar · S / ↓ marcha atrás · A D / ← → girar · Espacio freno · B balizas · L luces.

Edición: activá EDIT MODE en el panel de arriba a la derecha. Se recomienda Chrome o Edge (WebGPU); en otros navegadores usa WebGL2.

Descripción técnica

  • Vehículo: el DynamicRayCastVehicleController de Rapier, con cuatro ruedas, tracción y freno atrás y dirección adelante (hasta 30°, suavizada). Los frenos traseros pierden fuerza en marcha atrás, y al soltar el acelerador hay freno motor. Colliders: la cabina usa dos convex hulls generados desde el GLB, y la caja trasera, cuboids armados desde código, para poder usarla como caja de carga.
  • Render: WebGPURenderer (con WebGL2 como respaldo), MSAA ×4 en la pasada de escena, bloom para las luces y una resolución adaptativa que baja el pixel ratio cuando los FPS no alcanzan. Materiales TSL: la grilla del suelo (con presets Dark, Contrast, Blueprint, Retro, Neon…), el borde que marca el área de manejo y la zona de carga. El concreto combina texturas de tsl-textures.
this.controller.setWheelSuspensionRestLength(i, 0.7)\nthis.controller.setWheelMaxSuspensionTravel(i, 0.6)\nthis.controller.setWheelSuspensionStiffness(i, 85)

Modo edición

Un panel de Tweakpane controla el suelo, la cámara y los assets. Cada asset se coloca con una vista previa que sigue al mouse y rota de a 22,5° con la rueda. Una vez colocado, se mueve y se rota con un gizmo propio, y tiene física, así que los objetos se empujan entre sí mientras se editan.

La zona de carga tiene una plataforma con 16 cajas. Cuando la caja de la camioneta entra en la zona, la luz pasa de rojo a verde y las cajas se pueden arrastrar hasta la camioneta. La configuración se guarda en el localStorage del navegador.

Modelo

La camioneta está modelada en Blender. Una retopología bajó el modelo de 80.000 a 22.000 vértices, y el ambient occlusion se horneó en Blender.

Resultados y limitaciones

  • Sigue en desarrollo.
  • Los circuitos se guardan en cada navegador (localStorage): no se pueden compartir.
  • Pendiente: superficies como agua, tierra y barro que cambien el manejo.

Créditos

  • Modelo del Rastrojero y assets: Pablo Mesquida (Blender).
  • Rapier de Dimforge para las físicas.
  • tsl-textures de Pavel Boytchev para el patrón del concreto.
  • Tweakpane para el panel de edición.
LOG

Log de desarrollo

  1. Zona de carga configurable

    La zona de carga se arma con assets que se arrastran hasta la camioneta.

  2. Zona de carga y descarga

    Una zona donde la camioneta puede cargar los objetos de una tarima.

  3. Nuevo collider para la camioneta

    Un convex hull para la parte delantera y cuatro cuboids para la caja trasera.

  4. Colliders más precisos para los assets

    Ajusté los colliders de varios assets para que sigan mejor la forma de los objetos.

  5. Modo edición rehecho, con gizmos nuevos

    Rehice varias partes del modo edición y sumé gizmos nuevos para mover y rotar.

  6. Guardar la configuración de los assets

    Los assets colocados ahora se guardan en el navegador.

  7. Assets nuevos: señales, neumáticos, barreras y reductores

    Nuevos assets para el circuito y una vista alejada para colocarlos.

  8. Bug del spawn resuelto

    Después de un buen rato, el bug en la aparición de la camioneta quedó resuelto.

  9. Edición para distintos assets

    El panel admite distintos assets, la cámara se arrastra y los objetos colocados se pueden mover y rotar.

  10. Panel de edición

    Un panel para colocar conos y editar el suelo y los límites.

  11. Los primeros objetos: conos

    Los conos son el primer asset del circuito de pruebas.

  12. Suelo con grilla y límites

    El material del suelo suma la grilla con presets y un shader que marca los límites del área de manejo.

  13. Dirección ajustada: lo básico está listo

    Con el steering ajustado, el manejo básico está listo.

  14. Ambient occlusion desde Blender

    Exporté el ambient occlusion desde Blender y el resultado me gusta más.

  15. Frenos traseros

    Frenos que aplican fuerza distinta según la dirección y frenado suave al soltar el acelerador.

  16. Sistema de luces

    Frontales, freno, balizas y reversa funcionando.

  17. Materiales y suspensión con Rapier

    De vuelta en Three.js: los materiales del modelo y una suspensión estable.

  18. Retopología: de 80.000 a 22.000 vértices

    Rehice la geometría del modelo para que sea más liviana en el navegador.

  19. Primera prueba en Three.js

    El modelo del Rastrojero, ya dentro de Three.js.

  20. Rastrojero 1971 en Blender

    El modelo terminado, por ahora: un Rastrojero 1971 hecho en Blender.

  21. Caja, ruedas y color

    Tercer avance en Blender: la camioneta suma la caja de madera, las ruedas y el color celeste.

  22. La cabina toma forma

    Segundo avance en Blender: la cabina suma materiales, parrilla, faros y paragolpes.

  23. Modelando el Rastrojero en Blender

    Con la física andando, empecé a modelar la camioneta: primero la carrocería de la cabina.

  24. Primeros pasos: del cubo al chasis con ruedas

    El punto de partida del Rastrojero: probar las físicas con Rapier antes de tener el modelo.