TrainBeyondEspañolEnglish← Propuesta interactiva / Interactive proposal

TrainBeyond — Player de capacitación / Training Player

La capacitación de una unidad como aplicación propia: qué ve y hace el alumno, cómo se publica y cómo se prepara una unidad. La propuesta interactiva tiene su propia documentación: Propuesta interactiva. / A unit's training as an app of its own: what the trainee sees and does, how it is published and how a unit is prepared. The interactive proposal has its own documentation: Interactive proposal.

---

ESPAÑOL

1. Qué es

El player es la capacitación de una unidad como aplicación propia, separada de la propuesta interactiva. Vive en DEMO: https://demo.trainbeyond.com/player/CODIGO/ (ALF, TAC…). La escena 3D, las estaciones, las lecciones, la guía de voz y las revisiones son las mismas piezas de la propuesta (los capítulos 4 a 8 y 10 se comparten tal cual con ella); lo que cambia es todo lo que rodea al ejercicio:

La propuesta interactiva (paneles, presentadora, /gen-proposal) se documenta aparte: Propuesta interactiva.

2. Qué ve y hace el alumno

2.1 Entrar

El alumno entra a la plataforma (LMS) con su usuario y abre el módulo; el LMS lanza el player con su identidad. Primero se ve la pantalla de carga del LMS, con el nombre del módulo y de cada ejercicio, mientras se descarga la escena; después, la pantalla del módulo. Sin el LMS, el player también se abre con el código de acceso de la unidad (para pruebas). En DEMO, el usuario Test Owner de la organización de cada unidad entra con el código de acceso de la unidad como contraseña.

2.2 La pantalla del módulo

2.3 Los ejercicios

EjercicioQué es
Tutorial (TU)Aprender a moverse y a usar los controles, sin revisiones. Hasta cuatro tareas: caminar hasta la estación 2 y mirar alrededor; hacer clic en un objeto para conocerlo (si la escena tiene objetos Show_; la tarea nombra uno de esa estación); abrir el control remoto y probar un botón y una palanca; hacerle una pregunta a la guía (el micrófono se abre solo para esa tarea; también se puede escribir).
Revisión Teórica (TE)El ejercicio guiado: la guía enseña cada estación con su lección, el alumno hace la tarea y responde la revisión de la estación, de viva voz o escribiendo. Se aprueba con el promedio de las revisiones en o sobre el 70 %.
Práctica (PR)La simulación: el alumno solo, sin guía, sin marcadores ni lista; la barra muestra solo cuántas tareas lleva («Práctica · 3/8»). A cada estación se llega caminando. Se aprueba con el 70 % de las tareas en su orden.
Examen del móduloLas tareas de los ejercicios de simulación (la Práctica), solo y sin la guía, y después las preguntas del módulo, una por estación, que la guía hace sin dar retroalimentación. Se aprueba con el 70 % en las dos partes. Va al LMS como el examen del módulo.

Los ejercicios, sus nombres y resúmenes, y cuáles entran en el examen se definen en el archivo de configuración ([module.*], capítulo 10.4); sin ellos, el módulo trae los tres estándar.

2.4 Dentro de la escena

Dentro de la escena todo funciona como en la propuesta. Lo que sigue es esa misma descripción (donde dice «el cliente», léase «el alumno»):

La visita es un ejercicio por tareas: las estaciones, en su orden, son las tareas. La instrucción de cada una es la nota de la estación, y lo que hay que hacer ahí son los objetos interactivos junto a ella (el hotspot, la hoja, la persona, la pantalla, los controles). La guía pide una tarea a la vez, al llegar explica la estación y dice qué hacer, confirma cada tarea cumplida, da una pista cuando el cliente se atasca y cierra con una retroalimentación. La lista aparece a la derecha, con las hechas tachadas; se pueden hacer en cualquier orden. (El panel de ajustes permite volver al recorrido narrado o dar la tarea por hecha solo con llegar.)

Lecciones. Cada estación tiene una lección escrita al publicar a partir del material del cliente y de la configuración de la escena, con su infografía. Al llegar, la guía la enseña completa, una parte por turno; con infografías, cada una aparece al nombrarla. El botón Lección de la lista hace que la guía la enseñe otra vez desde el principio, sin cambiar ninguna tarea. Las preguntas de la revisión salen de esa misma lección.

Pantalla de inicio. Al entrar al ejercicio (y tras reiniciarlo) aparece una pantalla con la frase de bienvenida, la misión (las tareas en orden, con el número y nombre de su estación) y los controles, con su propia música. La guía calla al instante al abrirse (también si venía hablando) y no dice nada hasta que se cierra: un clic en cualquier parte de la pantalla, o sola a los tres minutos (ajuste).

Evaluación. Al terminar cada tarea, la guía hace dos preguntas cortas sobre esa estación, sacadas de lo que acaba de enseñar (el material de la propuesta y la configuración de la escena). Cuando ella termina de preguntar aparece una tarjeta en el centro de la pantalla con sus palabras, una línea para escribir la respuesta y un botón No sé; mientras la revisión está abierta el cliente no puede caminar ni activar nada. Responde de viva voz (el micrófono se abre al terminar la pregunta) o escribiendo; ella califica cada respuesta de 0 a 100 y la lista muestra la calificación de cada pregunta y el promedio de la estación ("100 · 0 → 50 %", verde si aprueba, rojo si no). Una calificación cuenta solo después de que el cliente haya hablado o escrito; si la guía califica antes, esa nota se descarta y repite la pregunta. Mientras la revisión está abierta, nada más llega a la guía. Una pregunta sin respuesta en tres minutos vale 0 y se pasa a la siguiente. Tras cada respuesta ella dice cuál era la correcta y por qué: una frase si acertó, dos si falló. La rúbrica (100 completa y correcta · 80 una omisión menor · 60 la idea principal · 30 relacionada pero incorrecta · 0 incorrecta o sin respuesta; solo contra el material de la propuesta) y todas las instrucciones que la página le da a la guía están en el panel de ajustes, grupo "Instrucciones a la guía", y se guardan por unidad. La tarjeta aparece cuando la acción terminó por completo y ella acabó de preguntar. Al accionar un punto interactivo, la guía dice en una frase qué acaba de hacer el cliente y confirma que quedó hecho. Mientras dura la acción, un recuadro muestra de cerca el instrumento o pieza que la animación mueve, para leer su valor; si el punto trae una nota con la lectura, ella la dice al terminar. Con todas las tareas hechas y revisadas viene el examen: el cliente repite todo el ejercicio solo, en el orden correcto, sin lista, sin números de estación y sin ayuda; la guía guarda silencio hasta el final. Llegar a una estación es acercarse a ella caminando (o con su marcador, fuera del examen); la estación donde empieza el examen cuenta solo después de alejarse y volver. Se aprueba completando todas las tareas con al menos el 70 % en su orden y con el promedio de las revisiones de las estaciones en o sobre esa misma nota mínima (ajuste checksCount; apagado, decide solo la práctica). El informe muestra las dos partes con su propio resultado. Al terminar, ella cierra con el resultado del examen, el de las revisiones y una retroalimentación breve, y se abre el informe del examen: aprobado o no, tareas en orden, tiempo, y la calificación de la revisión de cada estación con su promedio (verde aprueba, rojo no); suena la música de éxito o de fallo mientras el informe está abierto. Desde el informe se cierra o se reinicia el ejercicio; el botón Informe del resultado lo vuelve a abrir. Si el cliente sale de la escena con el informe abierto y vuelve a entrar, el informe aparece de nuevo, con Cerrar y Reiniciar; si recarga la página, el ejercicio empieza de cero. (Preguntas por estación, examen y nota mínima se ajustan en el panel.) El informe final ocupa casi toda la pantalla, en tres pestañas: Resumen (resultado, nota y nota por estación), Plan de estudio para el siguiente intento, que la página arma con las propias láminas (por cada pregunta fallada: la lámina que la enseña, citada, y qué hacer en la escena: repetir esa lámina con el botón Lección y pulsar los objetos de la estación), y Preguntas y respuestas (cada pregunta con tu respuesta, la correcta, el comentario y la frase de la lección que la enseña). El botón Descargar PDF guarda el mismo informe como archivo PDF; la casilla «Incluir la transcripción completa de la sesión en el PDF» (desmarcada por defecto) añade al final del PDF todo el diálogo de la sesión, con las líneas que tratan los temas del plan de estudio resaltadas y el tema indicado debajo. Al cerrar el informe, los datos del ejercicio se conservan en el navegador: en el panel de configuración (Ctrl+Shift+K), «Informe: datos guardados» permite abrir de nuevo el último informe, guardar los datos en un archivo y cargar un informe desde un archivo, sin repetir el ejercicio.

El micrófono dentro de la escena tiene dos estados, abierto y cerrado, y la insignia de arriba a la derecha dice cuál. Se abre solo cuando la guía escucha: unos segundos después de cada intervención suya, y mientras el cliente siga hablando. Caminando, con una hoja abierta o mientras ella explica está cerrado: el ruido de la sala no le llega. Para hablarle en cualquier otro momento, mantén pulsada la tecla M o haz clic en la insignia. En el visor VR no hay teclado ni insignia: se mantiene pulsado A o X en cualquiera de los controles, y un letrero bajo la vista dice si el micrófono está abierto ("Te escucha") o cómo abrirlo. Mientras una pregunta de revisión espera la respuesta, en el visor ella escucha entre sus turnos sin tener que pulsar nada (en VR no hay dónde escribir la respuesta).

AcciónComputadoraVisor VR
Entrar a la escenaclic en la maquetabotón Enter VR
Mirararrastrar con el ratóngirar la cabeza
Caminarflechas (el suelo se sigue: escalones, rampas; paredes, postes y máquinas detienen al visitante)palanca; teletransporte apuntando al suelo
Cambiar de estaciónclic en el marcador numerado: el personaje camina hasta allí rodeando los obstáculosapuntar al marcador y gatillo
Empezar de nuevobotón Reiniciar en la lista de tareas o en el informe: todo vuelve al inicio (tareas, puntos accionados, hojas, pantallas, posición en la estación 1) y la entrada se repite: pantalla de inicio, bienvenida y lección (pide confirmación)igual
Reportar un problemaCtrl+Shift+L copia el id de la sesión y marca el momento en el registro; envíalo con lo que pasóigual
Saltar a la revisión (pruebas)Ctrl+Shift+X termina la lección de la estación en curso, da su tarea por hecha y abre la revisiónigual
Saber dónde estásla barra de estado muestra el número y el nombre de la estación ("Estación 1 · Placa"); el marcador de la estación donde estás se ve gris y quieto mientras su tarea esté pendiente; la guía nombra las estaciones por su número, como los marcadoresigual
Vista de pájarobarra espaciadora—
Cambiar de vista (tercera / primera persona / dron)V—
Activar un punto interactivo cercanoE, o clic en el rombogatillo sobre el rombo
Pasar imagen en una pantallaclic en la pantallagatillo
Hablar con un personajeE cerca de él, o clicgatillo
Hablarle a la guíase abre sola tras cada intervención suya; en otro momento, mantener M o clic en la insigniase abre sola tras cada intervención suya y durante toda una pregunta de revisión; en otro momento, mantener A o X
Pulsar un botón / girar una perilla / mover una palanca de la máquinaclic / arrastrar o rueda / arrastrargatillo / gatillo sostenido y subir o bajar la mano o usar el stick / gatillo sostenido y el stick
Abrir un formularioclic en el portapapeles: la cámara se acerca y la página aparece sola sobre élse llena desde un teléfono (?clipboard)
SalirEsc. Al volver a entrar, el visitante aparece en la estación donde estaba y el avance del ejercicio se conserva; Reiniciar lo devuelve a la estación 1—

Con un Avatar entregado, el cliente recorre la escena como un personaje (tercera persona por defecto); en VR ve su propio cuerpo del cuello hacia abajo y, con manos rastreadas, sus manos reales mueven las del avatar.

2.5 El informe y la plataforma

Al terminar, el informe del ejercicio (Resumen, Plan de estudio, Preguntas y respuestas, Descargar PDF) muestra además qué pasó con el resultado en el LMS:

Cada ejercicio envía su resultado con su propio código; el examen, el resultado del examen del módulo. Al volver, la pantalla del módulo muestra la nota nueva.

2.5b La tableta

Dentro de la escena, el botón Tableta (T) (o la tecla T) abre la tableta del alumno, que se ve y se usa como un iPad. Abajo, una barra con sus tres apps, Videos, Documentos y Llamadas, con la elegida resaltada. La tableta se abre en la última app elegida.

Si hay más miniaturas de las que caben, se pasan de página con ‹ ›. La barra de inicio o el botón de volver regresan de un video, un documento o una llamada a su app. La tabla [tablet] del archivo de configuración dice qué hay en cada app y en qué orden (capítulo 10.4); el perfil del Mentor viene de la configuración global. En el visor (con controles o con las manos) la tableta es un panel delante del alumno: se abre con el pequeño botón abajo a la izquierda de la vista, y todo se acciona apuntando y pellizcando (o con el gatillo). Si no hay nada en la tableta ni guía (la Práctica sin [tablet]), el botón no aparece.

2.6 Salir, volver y reiniciar

3. Cómo se publica

3.1 Las fuentes

3.2 El comando

En Google Chat, /gen-player CODIGO. La publicación:

  1. arma el paquete del player: la escena convertida desde el Blender, las lecciones, la voz de la guía grabada una sola vez con el mismo modelo de la guía en vivo (y reutilizada en las publicaciones siguientes), la música y el icono del módulo, renderizado desde el Blender (con su Icon_Camera si la escena la tiene);
  2. prepara el LMS en DEMO por Support Admin, solo lo que falte: la organización de la unidad, su Test Owner (con el código de acceso de la unidad como contraseña), el módulo y sus ejercicios; nunca edita lo que ya existe;
  3. publica el player en https://demo.trainbeyond.com/player/CODIGO/.

3.3 Qué devuelve

La dirección del player; cuántas lecciones y grabaciones tiene, y cuántas se grabaron esta vez; el módulo del LMS y si se creó o ya existía; y los avisos (capítulos 10.3 y 10.5).

4. Convenciones de nombres — referencia rápida

El visor no se configura: lee los nombres de los objetos y de las acciones del archivo de Blender. Lo que no coincide con ninguna convención es escenografía normal. Los nombres se comparan sin espacios sobrantes y sin distinguir mayúsculas; el separador puede ser _ o ..

NombreTipoQué haceEjemplo
Station_NN_Nombreempty en el pisopunto de pie; NN ordena; se entra por el menor; su −Y mira hacia el frenteStation_01_Recepcion, Station_02_Linea_De_Corte
Seat_Nombreempty a la altura de los ojospunto sentado (cabina, silla de control); vista limitadaSeat_Cabina_Grua
Skyboxmalla (domo invertido)el cielo y la luz ambiente; oculto en la maquetaSkybox
Sunluz tipo Sundirección y color de las sombras (la intensidad la pone el visor)Sun
Loop_Nombreacciónanimación ambiental en ciclo mientras el cliente está dentroLoop_Transportador, Loop_Antorcha
Avatar + Idle, Walkarmature + accionesel cliente recorre la escena como ese personajeAvatar, Avatar_Eyes (empty opcional a la altura de los ojos)
Hotspot_X / Play_X / Act_Xempty / acción de escena / clip del avatarinteracción: ancla donde se para, el equipo moviéndose, el gesto humanoHotspot_Abrir_Valvula, Play_Abrir_Valvula, Act_Abrir_Valvula (Act_Operate = gesto genérico)
Focus_Nombreobjeto o emptylo que la maqueta encuadra cuando el terreno es enormeFocus_Avion
Screen_Nombre_NNmallas apiladaspantalla con imágenes en secuencia; un clic pasa a la siguienteScreen_Menu_01, Screen_Menu_02
Display_Nombremalla 16:9monitor que muestra en vivo la pantalla compartida con ?displayDisplay_Registro
Character_Nombreempty o raízdónde está una persona con la que se puede hablar; propiedades persona, voice, genderCharacter_Alejandra
Clipboard_Nombremalla con forma del papelformulario que el cliente llena; propiedad form = página HTML (o fields)Clipboard_Inspeccion + form = corte.html
Show_Nombreobjetose ilumina cuando la guía dice su nombre (palabras completas, solo los de la estación actual); propiedad note opcionalShow_Casco, Show_Guantes_De_Nitrilo
Collider_Nombremalla simple (caja o plano)tope invisible para el visitante donde los pasos atravesarían barandales, barandas o cables; nunca se dibujaCollider_Barandal_Norte
Button_Nombremalla o empty con mallasbotón de máquina; reproduce Play_Nombre; propiedad mode = once / toggle / hold / latchButton_Arranque + Play_Arranque
Knob_Nombremalla o empty con mallasperilla; recorre Play_Nombre de mínimo a máximo; propiedad stepsKnob_Presion + Play_Presion
Joystick_Nombremalla o empty con mallaspalanca de dos ejes; mueve Play_Nombre_X y Play_Nombre_Y; propiedades mode (position / rate), sticky, speed, tiltJoystick_Pluma + Play_Pluma_X, Play_Pluma_Y
Indicator_Nombremallaluz de la máquina que se enciende en el color que diga el archivo de configuración ([indicators.Nombre])Indicator_LED1

Propiedades personalizadas (Object Properties → Custom Properties) que el visor lee:

ObjetoPropiedadEjemplo
Station_ / Hotspot_note — tema de la estación que la guía desarrollaAquí se inspecciona cada rollo antes del corte
Show_note — una frase sobre el objetoProtegen de químicos
Character_persona, voice, genderRecepcionista, 8 años…, Kore, female
Clipboard_form (página HTML), fields (lista A; B; C...), notecorte.html · Nombre; Fecha; Observaciones...
Button_mode (once, toggle, hold, latch), plays (otra acción)toggle · Play_Bomba
Knob_steps (posiciones fijas), value (dónde está al cargar la escena, de 0 a 1), plays5 · 0.5
Joystick_mode (position, rate), sticky (no vuelve al centro), speed (acción por segundo a tope), tilt (grados)rate · 1 · 0.5 · 20

Varios objetos en una acción: pistas NLA con el mismo nombre en cada objeto (Play_Arranque en el botón y en el pistón) se exportan como una sola animación. Así se hace que el botón se hunda y la máquina responda, o que la perilla gire y la aguja la siga.

Restricciones de huesos (máquinas): el visor resuelve en vivo, como Blender, estas restricciones de los armatures de la escena: Damped Track; Copy Location y Copy Transforms entre huesos del mismo armature, en espacio mundial; IK de una o dos huesos sin polo (con los bloqueos y límites de IK de sus huesos); Limit Rotation y Limit Location en espacio local. Así, con varias acciones a la vez (la pluma y el brazo), los cilindros siguen apuntando a sus soportes, las mangueras siguen sus puntos de control y la herramienta sigue en su enganche. Las acciones deben mover solo los huesos que de verdad se animan (pluma, brazo, herramienta, giro): lo que siguen las restricciones lo pone el visor. Otras restricciones quedan como las hornea cada acción, y el registro de la conversión las nombra (BLEND_BONE_CONSTRAINTS).

Un tablero en el cuerpo del visitante: un mando que el operador lleva puesto (en el cinturón) se empareja en Blender a un hueso del Avatar (tipo Bone). Viaja con el visitante, se ve en primera persona al bajar la vista, y sus controles se accionan con el puntero, con el rayo del control en VR o con sus teclas. La primera persona mira desde el centro de la parte libre de la pantalla, a la izquierda de la columna de la lista y el diálogo: lo que el operador tiene delante, el mando al bajar la vista, no queda bajo esa columna.

Solo en el player, además:

PrefijoTipoQué haceEjemplos
Demo_Nombreacciónla demostración en la portada del player (la pantalla del módulo), con las Loop_; sin ninguna, el avatar recorre las estaciones y sus hotspotsDemo_Brokk_v3, Demo_Pared_Trozo_033_0
Door_Nombre + Open_Nombremalla o raíz + acciónuna puerta que se abre con un clic y se cruza; con la propiedad exercise lleva a otro ejercicio del módulo y se abre al completar el actual (capítulo 8)Door_Almacen, Open_Almacen

5. Formularios (Clipboard_)

El formulario es una página HTML que escribe el diseñador: cualquier diseño, la hoja de la planta tal cual como tabla, estilos en línea, incluso un script que arme los renglones. Reglas:

  1. Cada casilla que el cliente llena es un <input>, <select> o <textarea> con name.
  2. El archivo va en las fuentes de la unidad en Drive: en una carpeta forms, o junto a los documentos del cliente (from-client / del-cliente). Se encuentra por su nombre (p. ej. corte.html).
  3. En Blender, el plano Clipboard_Inspeccion lleva la propiedad personalizada form = corte.html (también vale forms; en el objeto o en los datos de la malla). Modélalo con la forma del papel (horizontal o vertical).

Ejemplo mínimo:

<!doctype html>
<html lang="es"><meta charset="utf-8">
<style>body{font:12px Arial;padding:10px} td,th{border:1px solid #333;padding:2px} input{width:100%;border:0}</style>
<body>
<h2>Inspección · Línea de corte</h2>
<label>O.T. <input name="ot"></label> <label>Fecha <input name="fecha" type="date"></label>
<table>
  <tr><th>#</th><th>Longitud</th><th>Defectos</th></tr>
  <tr><td>1</td><td><input name="fila1_longitud"></td><td><input name="fila1_defectos"></td></tr>
  <tr><td>2</td><td><input name="fila2_longitud"></td><td><input name="fila2_defectos"></td></tr>
</table>
</body></html>

Cómo se usa: en computadora, clic en el portapapeles abre la página en la propuesta; en visor o tableta, un teléfono abre …/FCA/?clipboard y ahí aparecen todos los formularios de la escena. Lo que se escribe aparece en el papel de todos los que están en la escena. Sin página, fields = Nombre; Fecha; Observaciones... genera un formulario sencillo (... = varias líneas). Ejemplos completos: docs/examples/clipboard-forms/ en el repositorio wrk-mgr.

6. Controles de máquina (Button_, Knob_, Joystick_)

  1. Nombra el control Button_Arranque o Knob_Presion (una malla, o un empty con las mallas del control debajo).
  2. Crea la acción Play_Arranque / Play_Presion con keyframes del control y de lo que mueve: el botón que se hunde y el pistón que sube; la perilla que gira y la aguja que la sigue.
  3. Exporta.
ControlComportamientoPropiedades
Button_reproduce la acción una vez al pulsarlomode = toggle: se repite hasta pulsarlo otra vez y vuelve al reposo · mode = hold: avanza mientras se mantiene y regresa al soltar · mode = latch: avanza hasta el final y se queda ahí (encendido) hasta pulsarlo otra vez, que lo regresa (un paro de emergencia que se hunde y se jala) · plays = Play_Otra para usar otra acción
Knob_recorre la acción: inicio = mínimo, fin = máximo; se gira arrastrando, con la rueda, o en VR con el gatillo sostenido subiendo/bajando la mano (o con el stick del control)steps = 5: posiciones fijas · value = 0.5: dónde está al cargar la escena (un selector de tres posiciones que empieza al centro) · plays
Joystick_dos ejes sobre Play_Nombre_X / Play_Nombre_Y (centro = mitad de la acción); la palanca se inclina sola; vuelve al centro al soltar; se mueve arrastrando o, en VR, con el gatillo sostenido y el stick del controlmode = rate: la acción avanza mientras se empuja y se queda al soltar (grúa, pluma) · speed = 0.5 · sticky = 1 · tilt = 20

La acción de una perilla es una pose por valor, sin ciclos. Un hotspot sigue siendo la opción cuando el avatar debe caminar hasta el equipo y hacer un gesto.

Un tablero con varios controles. Un mismo tablero puede llevar varios botones, perillas y palancas a la vez, de cualquier tipo. Cada uno necesita su propio nombre y su propia acción (Button_Arranque + Play_Arranque, Button_Paro + Play_Paro, Joystick_Pluma + Play_Pluma_X / Play_Pluma_Y): dos controles con la misma acción se mueven juntos. Cada control cuenta como un punto de la tarea de su estación, también las copias de Blender (Button_Paro y Button_Paro.001 son dos puntos). En VR cada mano maneja su propio control: la palanca con una y el botón de mantener con la otra.

Lo que hace la máquina con varios controles a la vez (las dos palancas para avanzar, el botón de la palanca con la palanca para el brazo, un selector de modo, un paro de emergencia) se describe en el archivo de configuración, en [conditions] y [functions.Nombre] (capítulo 10.2). En la computadora, cada control puede tener sus teclas (keys) para manejar dos palancas a la vez.

7. La auditoría (/audit-showcase)

Revisa el archivo entregado antes de importarlo. El reporte llega al chat en varios mensajes: resumen y luego hallazgos por severidad.

SeveridadHallazgos
🛑 Bloqueante (no importar)linked_libraries_missing, image_has_no_pixels, images_not_packed, no_entry_points, reserved_loop_prefix, scene_scale_suspect
⚠️ Advertencia (algo falta)hotspot_without_clip, act_without_hotspot, single_entry_point, skybox_not_emissive, backdrop_not_emissive, sun_not_directional, focus_frames_nothing, screen_frame_unnumbered, screen_frames_misaligned, screen_single_frame, character_without_persona, character_voice_unknown, character_not_rigged, clipboard_without_fields, clipboard_not_a_mesh, clipboard_not_a_plane, collider_not_a_mesh, control_without_clip, control_not_a_mesh, mesh_without_material, names_with_stray_whitespace
💡 Notacutout_uses_alpha_blend, opaque_material_carries_alpha, avatar_idle_clip_missing, avatar_walk_clip_missing

Cada hallazgo trae en el chat qué es y cómo arreglarlo, en el idioma del --es.

8. Especificación completa de la escena

Audiencia: equipo de diseño 3D

Entregable: una escena interactiva por propuesta, mostrada dentro de la propuesta interactiva del cliente

Formato: .blend (Blender 4.x o 5.x hasta 5.2, preferido) o .fbx — entrega el archivo fuente; nosotros nos encargamos de toda la exportación y optimización

Novedades v1.1

Qué vas a construir

La escena aparece dos veces en la propuesta, desde el mismo archivo:

  1. Maqueta — un modelo a escala de mesa al centro de la galería de la propuesta, como la maqueta de un arquitecto. Es lo primero que ve el cliente.
  2. Vista interior — al hacer clic en la maqueta, el cliente entra dentro de la escena a escala real: de pie en los puntos que tú definas, sentado en puntos de vista que tú definas (cabina de vehículo, silla de control), o recorriéndola como un personaje (Avatar) en tercera o primera persona. La presentadora de IA narra mientras el cliente explora.

Diseña para ambas escalas. La escena debe verse atractiva como miniatura desde arriba Y sostenerse a la altura de los ojos desde cada punto de vista que coloques. Detalla lo que una persona de pie va a mirar; no detalles lo que nadie verá de cerca.

Requisitos obligatorios

ReglaDetalle
UnidadesMetros reales. 1 unidad de Blender = 1 m. Una puerta mide ~2.1 m, un barandal ~1.0 m.
Transformaciones aplicadasTodas las escalas aplicadas (Ctrl+A → All Transforms) antes de entregar.
MaterialesSolo Principled BSDF. Texturas procedurales horneadas a imágenes, máximo 2048×2048, y máximo ~24 imágenes de textura en total — usa atlas para props repetidos. La memoria de texturas es el recurso más escaso en los dispositivos objetivo.
AnimaciónAcciones con keyframes montadas en pistas NLA. Sin simulaciones físicas, telas ni partículas — hornéalas a keyframes si las necesitas.
Presupuesto de geometría≤ 600,000 triángulos en total (objetivo ~450 mil). Gasta triángulos donde el cliente va a estar parado; el Avatar (~20–40 mil) cuenta dentro del total.
Presupuesto de objetos≤ 150 mallas después de unir (une todo lo que comparta material) y ≤ 25 materiales únicos. Este límite decide los FPS más que los triángulos — gasta mallas y materiales como si fueran dinero: una escena de 600 mil triángulos en 120 mallas rinde mejor que una de 250 mil en 600.
AutocontenidoEmpaca todas las texturas en el archivo (File → External Data → Pack Resources). Sin bibliotecas vinculadas. Archivo empacado ≤ ~150 MB.

Nosotros comprimimos todo (geometría y texturas) después de la conversión — no necesitas optimizar el tamaño del archivo más allá de estos presupuestos.

Convenciones de nombres — cómo tu escena le habla al visor

El visor lee nombres de objetos y nombres de acciones (animaciones) para saber cómo comportarse. Los objetos que no coinciden con ninguna convención son escenografía normal.

Station_NN_Nombre — puntos de pie (empties)

Un lugar donde una persona puede pararse. Agrega un empty por ubicación, posicionado en el piso (nosotros subimos la cámara a la altura de los ojos automáticamente). La rotación del empty define la dirección inicial de la vista (su eje +Y es "adelante" — activa Display As: Arrows para verlo).

Seat_Nombre — puntos sentados (empties)

Una vista fija y sentada: cabina, grúa, silla de control. Posiciona el empty en el punto exacto de los ojos de la persona sentada (no en el piso). El visitante puede mirar alrededor desde ahí pero no moverse.

Skybox — el cielo (malla, opcional)

Una esfera o domo invertido grande, material emisivo, textura de cielo equirectangular, rodeando la escena. Se oculta mientras la escena es maqueta; se revela cuando el cliente entra. Si lo omites, el visor pone un cielo simple por defecto — uno real siempre se ve mejor.

La imagen del cielo va conectada a Emission, no a Base Color. El visor hornea el domo en un mapa de entorno dentro de una escena sin luces: un domo con la textura en Base Color sale negro y toda la escena queda a oscuras (así se entregó AER). /audit-showcase lo reporta como skybox_not_emissive.

Loop_Nombre — animación ambiental (nombres de acciones)

Toda acción cuyo nombre empiece con Loop_ se reproduce automáticamente, por siempre, cuando el cliente está dentro: Loop_Antorcha, Loop_Transportador, Loop_Trafico. Haz que el primer y último keyframe coincidan para que el ciclo sea continuo.

Demo_Nombre — la demostración de la portada (nombres de acciones, opcional)

La portada de una capacitación (la pantalla del módulo del player) muestra toda el área de entrenamiento en miniatura: cada estación, asiento y hotspot con el sujeto. Las paredes y el techo se cortan 2,2 m por encima del piso más alto donde se para el alumno. Lo que se mueve ahí lo decides tú:

En ALF la demostración de demolición es Demo_: el operador con el control remoto (Demo_Operador, Demo_Controles), el Brokk golpeando la pared (Demo_Brokk_v3) y los 50 pedazos de la pared cayendo (Demo_Pared_Trozo_033_0…). TAC no tiene Demo_: su portada muestra al avatar recorriendo sus cinco estaciones, usando el micrómetro y escribiendo.

Avatar — el personaje del cliente (armature, opcional)

Un personaje que el cliente "encarna" al entrar: puede verlo en tercera persona (cámara al hombro), mirar por sus ojos en primera persona, o soltarlo y volar libre (modo dron, el comportamiento actual). Si la escena no trae Avatar, el visor funciona como hasta ahora — solo modo dron.

Hotspot_Nombre — interacciones (empties) — el trío de nombres

Un punto donde el cliente hace algo: abrir una válvula, pulsar un botón, revisar un panel. Una interacción se define por hasta tres piezas que comparten exactamente el mismo nombre:

PiezaTipoPapel
Hotspot_AbrirValvulaempty en la escenaEl ancla (obligatoria): posición y orientación exactas donde una persona se pararía a hacerlo, con +Y hacia el equipo.
Play_AbrirValvulaacción de la escenaEl lado del equipo: el volante gira, el panel se enciende. Se reproduce una vez al activarse y se queda en su último fotograma (la válvula abierta sigue abierta; un accesorio que la acción esconde al final sigue escondido). Lo que se ve antes de activarla es la pose base del objeto: un accesorio que solo debe existir durante la acción lleva escala 0 como base.
Act_AbrirValvulaclip del avatarEl lado humano: el gesto de alcanzar y girar.

Comportamiento del visor: al acercarse (~2.5 m) aparece el aviso; al activar, el avatar se desliza al ancla y Act_ + Play_ se reproducen a la vez; después vuelve a Idle. Mientras dura la acción, un recuadro muestra de cerca lo que anima Play_ (el instrumento, la válvula): modela la lectura legible y deja la animación en el valor que debe leerse. reading en la tabla [Hotspot_Nombre] del archivo de configuración (o una propiedad note en Blender) hace que la guía diga la lectura al terminar. Por eso el ancla importa: colócala exactamente donde deberían estar los pies y la mano llegará al equipo. Sin avatar (o en modo dron), hacer clic en el marcador reproduce solo Play_ — los hotspots funcionan en toda escena, con o sin avatar.

Focus_Nombre — el sujeto de la maqueta (objeto o empty, opcional)

Dile al visor qué es lo que la maqueta muestra. En la galería la escena se ve como maqueta: el visor la escala para que su extensión más grande mida unos 4 m. Si la escena necesita mucho más entorno que sujeto — la cabina de FER tiene ventanas al frente y atrás, así que las vías y el piso deben correr lejos en ambos sentidos — el entorno se queda con esa escala y el sujeto termina diminuto.

Icon_Camera — la vista del icono del módulo (cámara, opcional)

/gen-player renderiza el icono del módulo en el LMS desde este archivo: una imagen cuadrada de 1080 px, como los iconos de los demás módulos. Sin cámara, encuadra el sujeto de la maqueta (Focus_, o toda la escena) desde detrás y por encima de la primera estación, y deja fuera lo que se interponga entre la cámara y el sujeto (un barandal, los paneles de una cabina). Para elegir la vista tú, pon una cámara llamada Icon_Camera: se usa tal cual. El avatar, el Skybox (el cielo es neutro, como en la maqueta), los Collider_ y la Navmesh nunca salen en el icono. La luz es la del visor: el Sun del archivo y un cielo neutro que nada tapa salvo el sujeto, así que un sujeto dentro de una cabina queda iluminado.

Screen_Nombre_NN — pantallas con imágenes en secuencia (mallas)

Un monitor, tablet o kiosco que muestra una serie de imágenes (las pantallas de un sistema de registro, por ejemplo). Modela la pantalla como un plano con la primera imagen y duplícalo en el mismo sitio una vez por imagen: Screen_Registro_01, Screen_Registro_02, … cada copia con su propia imagen en el material (conectada a Emission, para que se vea encendida con cualquier luz). El visor muestra solo la _01; un clic, un toque o el gatillo de VR sobre la pantalla pasa a la siguiente y, tras la última, vuelve a la primera.

Display_Nombre — pantalla en vivo (malla)

Un monitor que muestra, en vivo, la pantalla de una computadora: el programa real del cliente (su sistema de registro, por ejemplo) corriendo mientras el cliente practica frente al personaje. Modela el monitor como un plano de 16:9 con UV completo (la imagen ocupa todo el plano) y nómbralo Display_Registro. El material que le pongas es lo que se ve cuando nadie está compartiendo.

Character_Nombre — personas con las que se puede hablar (empty o raíz)

Una persona de la escena con la que el cliente practica una conversación real por voz: un huésped en la recepción, un cliente en la ventanilla. El personaje no se modela en la escena: el equipo de operaciones lo entrega en el comando de publicación, como el showcase:

/gen-proposal UNIDAD --publish --showcase <escena> --character <modelo> --persona <doc> --idle <clip> --talk <clip>

Tu parte en la escena es el lugar: un empty (o cualquier objeto) llamado Character_Nombre donde va la persona, con el mismo Nombre que el documento de persona, mirando hacia donde está el cliente. El visor pone ahí el modelo entregado y oculta el marcador. Al acercarse (~2,5 m) aparece el aviso E — 💬 Nombre; con E, un clic o el gatillo de VR empieza la conversación y la guía calla; termina con E, otro clic, alejándose (> 4 m) o cuando la persona se despide, y la guía comenta cómo fue.

Clipboard_Nombre — formularios que el cliente llena (malla, opcional)

Un portapapeles con un formulario que el cliente llena durante la práctica: el alta de un cliente, un reporte de incidente, la hoja de inspección de la planta. Modela el portapapeles como un plano con UV completo, con la forma del papel (vertical u horizontal), y nómbralo Clipboard_Registro. El material que le pongas es lo que se ve cuando nadie está en la escena; adentro, el visor dibuja el formulario con lo que se va escribiendo.

Show_Nombre — objetos que la guía señala uno por uno (objetos, opcional)

Para una estación con varios objetos que la guía explica de uno en uno — el EPP sobre una mesa, las herramientas de un banco —, nombra cada objeto Show_Nombre (Show_Casco, Show_Guantes_De_Nitrilo). Mientras la guía habla de un objeto, ese objeto brilla en naranja; al pasar al siguiente, el anterior se apaga.

Navmesh — la superficie por donde se camina (malla, opcional)

Cuando el visitante va a una estación o a un punto interactivo con un clic, el personaje recorre un camino sobre la Navmesh de la escena: rodea mesas, barandales y rodillos en vez de atravesarlos.

Pon una malla llamada Navmesh (o Navmesh_Planta, cualquier nombre que empiece así) con la superficie caminable: pasillos, plataformas, rampas. El visor la oculta al cargar (no se dibuja, no proyecta sombra, no sirve de tope) y construye con ella una cuadrícula del piso. Solo los Collider_ bloquean celdas encima de ella: el resto de la escenografía no cuenta, así que pon un Collider_ en todo lo que el visitante deba rodear. Entre celdas nunca se sube ni se baja más de un escalón.

Collider_Nombre — topes invisibles para el visitante (mallas, opcional)

El visitante choca con las mallas de la escena (seis rayos horizontales, del tobillo a la cabeza). Donde la geometría deja huecos entre esos rayos — las barras de un barandal, una baranda, un cable, una vitrina muy fina — pon una caja o un plano sencillo con el nombre Collider_Nombre (Collider_Barandal_Norte) cubriendo la zona por donde no debe pasar. El visor lo oculta al cargar: nunca se dibuja, no proyecta sombra, no sirve de suelo ni se puede señalar; solo lo sienten los pasos del visitante.

Door_Nombre y Open_Nombre — puertas que se abren y se cruzan (malla o raíz, y una acción, opcional; v1.6)

Una puerta es el objeto Door_Nombre (Door_Almacen): la hoja como malla, o una raíz con la hoja debajo. Su acción de la escena Open_Nombre (Open_Almacen) la abre: el visor la reproduce hacia adelante al abrir y hacia atrás al cerrar, y se queda en su último fotograma.

Button_Nombre, Knob_Nombre y Joystick_Nombre — controles de una máquina (mallas, opcional)

Botones, perillas, palancas e indicadores que el cliente acciona directamente sobre el equipo: pulsa el botón de arranque y el transportador se mueve; gira la perilla de presión y la aguja del manómetro la sigue. No necesitan ancla ni avatar: se accionan donde esté el cliente, con un clic, con el gatillo del visor o con la mano.

Luces

Tu Skybox es la luz principal de la escena. El visor lo convierte en un mapa de entorno (IBL): de ahí sale toda la luz ambiental y todos los reflejos del metal. Es lo mismo que hace el "world" de Blender, y es la palanca más grande que tienes sobre cómo se ve la escena. Un cielo bien expuesto ilumina bien; un cielo plano u oscuro deja todo apagado.

El Sun decide hacia dónde caen las sombras. El visor toma su dirección y su color, no su intensidad: Blender exporta W/m² convertidos a lux y el visor los vuelve a reescalar, así que la intensidad no sobrevive el viaje de forma útil. El visor pone su propia intensidad, calibrada con la exposición. Orienta el Sun como quieras que caigan las sombras y no te preocupes por su "Strength".

Se usa el primer Sun (luz direccional) de la escena; un segundo sol no se enciende. Las lámparas point y spot sí: en el player, dentro de la escena a escala real, todas las que pongas iluminan con la intensidad que les diste (en la maqueta van apagadas, porque de tan cerca la quemarían). Para un interior son la luz que cuenta: ilumínalo como quieras que se vea.

Tiene que ser una lámpara de tipo Sun: una luz Point o Area llamada "Sun" no cuenta (AER entregó un point de 17,8 millones de candelas y el visor lo ignoró: sin dirección de sol, sin sombras autoradas). /audit-showcase lo reporta como sun_not_directional.

El piso no fija la escala de la maqueta. En la galería la escena se muestra como maqueta: el visor escala la extensión más grande de la escena (sin contar Skybox y Avatar) a 4 m. Un piso o explanada mucho más grande que el sujeto se convierte en la maqueta entera y el sujeto queda diminuto (el avión de AER medía 0,8 m sobre una explanada de 185 m). Recorta el piso a la zona caminable, o — si la escena necesita ese entorno, como unas vías que deben verse largas desde la cabina — nombra el sujeto Focus_Nombre y el piso deja de contar. /audit-showcase lo reporta como diorama_fit_dominated.

Hasta 2026-08-14 esta sección decía que todas las luces iluminaban la vista interior. No era cierto: el conversor nunca las exportaba. Ya se corrigió.

Las estaciones son las tareas (sin nada nuevo que nombrar)

La visita no es un paseo: es un ejercicio por tareas, y las tareas son tus Station_NN_Nombre (y después los Seat_) en su orden. No hay que agregar nada:

La guía pide una tarea a la vez, al llegar explica la estación y dice qué hacer ahí, confirma cada tarea cumplida, da una pista si el visitante se atasca y cierra el ejercicio con una retroalimentación breve. En pantalla aparece la lista con las tareas hechas tachadas; se pueden hacer en cualquier orden.

Después de cada tarea la guía hace dos preguntas sobre la estación (solo de lo que enseñó al llegar; la lección sale del archivo de configuración de la escena y del material) y califica las respuestas. Al final, el examen: todo el ejercicio otra vez, solo, en orden, sin marcadores ni lista; la guía calla hasta el cierre. Nada de esto se nombra en Blender.

Cómo usa el visor tu escena

Entrega y retroalimentación

Entrega el archivo igual que cualquier modelo de showcase (enlace de Drive al equipo de operaciones). El pipeline de publicación valida la escena automáticamente y reporta los problemas por nombre en la tarjeta de chat — p. ej. "Station_03 está 4.2 m sobre el piso — las estaciones van en el piso" o "la escena mide 17 m de ancho pero declara estaciones caminables — reescala a metros." Corrige y vuelve a entregar; republicar es barato y el modelo solo se reconvierte cuando el archivo realmente cambia.

Antes de importar nada, el equipo de operaciones puede pedir una revisión del archivo con /audit-showcase <enlace de Drive>: abre tu archivo sin convertirlo ni publicarlo y responde en el chat con lo que encontró — bibliotecas vinculadas que faltan, imágenes que Blender no pudo cargar, objetos ocultos que no llegarían a exportarse, nombres de clips fuera de convención, los presupuestos de la escena, y desde septiembre de 2026 también si el Sun es direccional, si el Skybox es emisivo y qué objeto fija la escala de la maqueta. Si algo no cuadra, lo sabrás en minutos y sin tocar la propuesta del cliente. La tarjeta muestra los primeros seis elementos afectados de cada hallazgo; el informe completo (todas las texturas con su tamaño y los materiales que las usan, objetos ocultos, estaciones contra su piso) está en el enlace al final de la tarjeta.

Dos casos se rechazan de inmediato, porque el cliente vería una escena vacía: un archivo sin geometría (lo que produce un archivo maestro cuyas bibliotecas vinculadas no se entregaron con él) y una textura sin píxeles (una imagen cuyo archivo Blender no pudo cargar). El mensaje nombra los objetos que sí llegaron, o los materiales afectados.

Lista de verificación antes de entregar

---

9. Para desarrolladores

10. El archivo de configuración de la escena

Es el mismo archivo que el de la propuesta. Todo lo que sigue vale para el player; lo que solo usa el player está en 10.4 y 10.5.

Un solo archivo por unidad, en formato TOML, en las fuentes de la unidad en Drive, cuyo nombre contenga scene config o configuración de la escena (mayúsculas y acentos no importan). Se lee al publicar y en cada /gen-proposal CODIGO --showcase. Reúne tres cosas: los ajustes del ejercicio (los mismos del panel de ajustes), una tabla por objeto de la escena bajo su nombre exacto de Blender, y las instrucciones de la guía. El antiguo documento de "temas del recorrido" ya no existe.

Cómo se combina con el panel (Ctrl+Shift+K): el archivo es la base; lo que se guarda en el panel queda encima, por unidad. Un valor largo (una instrucción) se edita con el botón … en una ventana grande. Las tablas de objetos aparecen en el panel como el grupo Objetos de la escena y también se pueden corregir y guardar ahí.

[quiz]
perStation = 2
passMark = 0.7

[tasks]

[prompts.rubric]
text = "..."

[scene]
welcome = "Bienvenido a la línea de inspección."

[Station_01_Placa]
task = "Revisa la placa: estencilado, medidas y espesor"
topic = "Qué se verifica en la placa y por qué importa"
description = "La mesa de placas a la entrada del molino: la placa sobre los rodillos, el micrómetro de 0-1\", las cintas y el reporte F-TUAC-022 en su tablilla"
questions = [["¿Qué datos del estencilado verificas?", "colada, proveedor y grado"], ["¿Con qué mides el espesor?", "con el micrómetro"]]

[Hotspot_Micrometer]
action = "Mide el espesor de la placa con el micrómetro"
reading = "12.50 mm"

[Clipboard_Inspeccion]
instructions = "Captura la colada y el espesor medido"
[Clipboard_Inspeccion.expected]
Espesor = "12.50"

[Show_Balde_De_Pintura]
note = "Pintura de marcado para identificar la placa aprobada"

10.1 Ajustes

Una tabla por grupo del panel; las claves son las del panel, anidadas como tablas o con punto (card.radius = "14px"). Valor por defecto entre paréntesis.

[render] — Resolución de dibujo

ClavePor defectoQué hace
maxPixelRatio2Píxeles de dispositivo por píxel CSS en la galería (tope).
walkMaxPixelRatio1El mismo tope dentro de la escena; 0.5 duplica los cuadros por segundo a costa de nitidez.
powerPreference"high-performance"Pide la GPU dedicada en un portátil con dos (se aplica al recargar).

[video] — Video de la presentadora (Kira)

ClavePor defectoQué hace
layout.widthShare0.17Ancho de la tarjeta como fracción de la ventana.
layout.minWidth132Ancho mínimo en px.
layout.maxWidth288Ancho máximo en px.
layout.aspect0.76Relación ancho/alto de la tarjeta.
layout.margin16Margen al borde, px.
layout.zoom1Escala del video dentro de la tarjeta.
layout.focusY0Punto vertical del encuadre, 0–100 (0 = cabeza arriba).
fade.hold3Segundos que la tarjeta se queda tras hablar.
fade.fadeIn0.35Segundos de aparición.
fade.fadeOut0.6Segundos de desaparición.
servo.intervalMs30Cada cuánto se corrige la reproducción, ms.
servo.onset.minLag / cushion0.5 / 0.3Al empezar a hablar: retraso mínimo para saltar al borde en vivo y colchón al que salta, s.
servo.speaking.minLag / cushion / fromMs / untilMs0.6 / 0.3 / 40 / 200Durante el habla: un solo salto permitido entre fromMs y untilMs del inicio.
servo.idle.minLag / cushion1.5 / 0.3En silencio: correa para que el video no se quede atrás.
trim.after / behind / keep25 / 20 / 15Limpieza del búfer: cada cuántos segundos, cuánto detrás, cuánto conservar.
codecs.native / baselineavc1.42c01f… / avc1.42E01E…Tipos MIME del flujo (no cambiar).
card.radius"0px"Radio de las esquinas de la tarjeta (CSS).
card.edge"1px solid var(--tb-line)"Borde de la tarjeta (CSS).

[caption] — Subtítulos

ClavePor defectoQué hace
holdAfterTurnMs2500Ms que el subtítulo se queda tras el turno, dentro de la escena.
maxChars360Caracteres que se muestran (cortados al inicio de una frase).
markdowntrueMostrar negritas del modelo como negritas.
maxAgeMs20000Dentro de la escena, el subtítulo se borra también pasado este tiempo desde sus últimas palabras, aunque el turno no haya cerrado.
strayTokens["stdin"]Palabras sueltas del modelo que se quitan del subtítulo.
strayPatterns["response:…"]Expresiones regulares de lo que el modelo filtra en sus palabras y no debe subtitularse (p. ej. el resultado de una herramienta).

[presenter] — Animaciones de la presentadora 3D (Camila)

ClavePor defectoQué hace
idle / talk / talkAlternate""Nombres de clip a usar; vacío = los del modelo.
swapSeconds9Segundos entre alternar clips de habla.
crossfade.talkSwap / toTalk / toIdle / fadeOut0.6 / 0.35 / 0.45 / 0.6Segundos de fundido entre clips.
clips""Lista fija de clips (p. ej. "Idle").

[lighting] — Luces de la galería

ClavePor defectoQué hace
toneExposure0.85Exposición ACES.
envIntensity0.9Fuerza de la luz de entorno.
key.intensity / key.position2.0 / [3, 6, 4]Luz principal.
fill.intensity / fill.position / fill.color0.45 / [-4, 2.5, 5] / 0xbfd0e0Luz de relleno.
hemi.intensity / hemi.sky / hemi.ground1.0 / 0xdde7df / 0x37352fAmbiente cielo/suelo.
rim.intensity / distance / decay / position8 / 24 / 2 / [0, 3.4, -4]Luz de contorno.

[face] — Rostro de la presentadora 3D

ClavePor defectoQué hace
roles.*nombres de morphQué morph del modelo cumple cada papel (jaw, open, wide, smileL…).
visemes.*pesosMezcla de morphs por visema (AA, EE, IH…). Avanzado.

[guide] — Guía dentro de la escena

ClavePor defectoQué hace
gazeSilenttrueEn el recorrido, la mirada es contexto silencioso, no un pie para hablar.
turnStallMs12000Turno de ella sin audio por este tiempo = se da por terminado (modelo atascado).
lessonStallMs45000Lo mismo mientras enseña una lección (el modelo hace pausas más largas entre sus partes).
resumeAfterMs3000Si una lección se interrumpe y en este tiempo no se oyen palabras del cliente, fue un ruido: la guía retoma la lección desde la lámina en pantalla.
describeFormsfalseAl abrir una hoja, la guía la explica en voz alta (instrucción clipboardOpen). Apagado, solo se entera en silencio de qué hoja se abrió y puede contestar sobre ella. Mientras ella habla no se puede caminar ni accionar nada (girar y mirar alrededor, sí), pero una hoja siempre se abre, y durante una conversación con un personaje nada queda bloqueado.
clickSkipsLessontrueMientras ella habla, un clic en el marcador de otra estación (en VR, el gatillo apuntando al marcador) la calla y lleva allí. Si estaba dando una lección, la estación dejada queda sin enseñar y sin completar: hay que volver a ella, y al volver la lección empieza de nuevo; lo que se accione en ella desde lejos no cuenta hasta volver. Mientras hace una pregunta de revisión, y en el examen, el clic espera. Apagado, el clic siempre espera a que ella termine.

[gaze] — Mirada del visitante (solo en el recorrido: el ejercicio por tareas nunca usa la mirada)

ClavePor defectoQué hace
enabledtrueMedir hacia dónde mira el visitante en el recorrido.
tickSeconds0.5Cada cuánto se mide.
coneDegrees8Cono de la mirada.
minDistance / maxDistance2.5 / 12Distancias válidas, m.
dwellSeconds5Segundos quieto mirando algo para contar.
stillMove / stillTurnDegrees0.15 / 4Lo que cuenta como quieto (m, grados por medición).

[tasks] — Ejercicio por tareas

ClavePor defectoQué hace
enabledtrueApagado = recorrido narrado, sin lista.
requireInteractionstrueLa tarea exige llegar y hacer todo lo que hay en la estación; apagado = llegar basta.
stuckSeconds60Sin avance por este tiempo = un check-in de una frase (una vez por tarea).
checkEveryMs5000Cada cuánto se revisa el reloj de atasco.
maxTextChars160Largo máximo del texto de una tarea.
summaryValuesChars300Caracteres de respuestas de formularios citados a la guía.
startScreentruePantalla de inicio al empezar el ejercicio: la frase de bienvenida, las tareas en orden y los controles; la guía espera a que se cierre.
startScreenSeconds180Se cierra sola pasado este tiempo (o con un clic en cualquier parte).
startLoadMaxS20Cuánto espera como máximo la pantalla inicial a que se precargue el material (las infografías) antes de mostrar «Haz clic en cualquier parte para empezar».
startMusic"industrial"La música mientras está abierta: industrial (la de serie) u office (corporativa, de oficina); none = sin música.
startMusicVolume0.5Su volumen, 0–1.
startMusicFadeS1Segundos de desvanecimiento al cerrarla.

[quiz] — Evaluación: preguntas y examen

ClavePor defectoQué hace
enabledtruePreguntas tras cada tarea.
perStation2Preguntas por estación cuando el archivo no trae questions.
examtrueExamen final: las estaciones marcadas con exam = true otra vez, solo, en orden. Sin ninguna marcada no hay examen: las revisiones dan la calificación final.
passMark0.7Mínimo (0–1) para aprobar una revisión y el examen.
checksCounttrueEl promedio de las revisiones también debe llegar a passMark para aprobar el examen; apagado, decide solo la práctica.
nudgeSeconds45Sin calificación por este tiempo = un recordatorio a la guía.
answerSeconds180Sin respuesta por este tiempo = la pregunta vale 0 y sigue.
askSeconds20La pregunta de la guía no empieza en este tiempo (o se cortó antes de hacerla) = se le vuelve a pedir.
askRetries2Veces que se le vuelve a pedir; después la tarjeta muestra la pregunta por escrito, del banco de la estación, y el cliente responde igual.
clockTickMs5000Cada cuánto se actualizan los minutos del examen (y se revisa la edad del subtítulo).
musictrueMúsica de éxito o de fallo mientras el informe está abierto; el informe (y su música) se abre cuando la guía termina sus palabras de cierre, no encima de ellas.
musicVolume0.5Su volumen, 0–1.
musicFadeS2Segundos de desvanecimiento al cerrar el informe, reiniciar o salir.
musicDuck0.25Mientras la guía habla, cualquier música (la de inicio, la del resultado) baja a esta fracción de su volumen y vuelve al terminar.
musicDuckS0.4Segundos de esa bajada y de la vuelta.
musicSuccess"assets/music/exam-success.mp3"La pista de éxito (ruta relativa a la página de la unidad; vacía = una frase sintetizada).
musicFailure"assets/music/exam-failure.mp3"La pista de fallo (igual).

[sound] — Sonido

ClavePor defectoQué hace
muteKey"KeyX"Tecla que silencia o activa todo el sonido (su voz y la música), igual que el ícono de bocina del diálogo; no actúa mientras se escribe.

[mic] — Micrófono mientras ella habla

ClavePor defectoQué hace
level0.025Nivel de salida que cuenta como su voz.
tailMs400Ms que el micrófono sigue cerrado tras su voz.
wholeTurntrueCerrado durante todo su turno, no solo mientras suena.
turnMaxMs90000Tope de ese cierre por si un turno nunca termina.

[listen] — Micrófono: cuándo escucha

ClavePor defectoQué hace
windowstrueDentro de la escena el micrófono abre solo cuando ella escucha.
windowMs8000Ventana abierta tras cada turno de ella.
heardExtendMs6000Prórroga mientras el relé oye hablar.
holdKey"KeyM"Tecla que abre el micrófono mientras se mantiene.
vrHoldButton4En el visor VR, el botón de control que abre el micrófono mientras se mantiene (índice del control estándar de WebXR: 4 = A en la mano derecha, X en la izquierda).
vrCheckOpentrueEn el visor VR, mientras una pregunta de revisión espera la respuesta, ella escucha entre sus turnos (no hay dónde escribir); su propio turno sigue cerrado.

[show] — Brillo de los objetos que nombra

ClavePor defectoQué hace
eachS2Segundos que brilla cada objeto nombrado.
videoLeadMs1200Con la presentadora en video: espera antes de encender (el texto llega antes que la voz).

[markers] — Marcadores

ClavePor defectoQué hace
riseRatio0.6A qué altura flota el marcador de una estación sobre el nivel de los ojos, como fracción de la estatura del visitante (0.2 lo dejaba delante de los estantes y de los puntos interactivos).
hotspotRiseRatio0.2Lo mismo para el ícono de un punto interactivo, medido sobre el piso además de la estatura.
ceilingMarginRatio0.1Si hay techo, los marcadores se quedan a esta fracción de la estatura por debajo de él.

[actpip] — Primer plano de la acción

ClavePor defectoQué hace
enabledtrueMostrar el recuadro durante una acción.
widthShare / minWidth / maxWidth / aspect / margin0.3 / 220 / 520 / 1.5 / 16Tamaño y posición del recuadro.
frame"equipment"equipment encuadra lo que anima Play_; body encuadra al personaje.
equipmentFill / equipmentMinDistance / equipmentSide / equipmentAbove0.6 / 0.35 / 0.6 / 0.45Encuadre del instrumento: llenado, distancia mínima, giro hacia la derecha del personaje, elevación.
side / above / lookHeight / reach / fov1.9 / 0.2 / 0.7 / 0.45 / 38Encuadre del personaje (modo body): lateral, elevación, altura de mira, adelanto, campo de visión.

[nav] — Navegación (caminos)

ClavePor defectoQué hace
enabledtrueCon una Navmesh en la escena, un clic en una estación o un punto recorre un camino que rodea los Collider_; apagado (o sin Navmesh) = línea recta.
cellM0.25Tamaño de celda de la cuadrícula sobre la Navmesh, m.
maxStepM0.35Lo que se alza menos que esto sobre el suelo es un escalón, no un muro.
headroomM1.7Altura del visitante: lo que haya por debajo en la celda la bloquea.
radiusM0.35Medio ancho del visitante: las celdas bloqueadas crecen con él.
margin2Metros de cuadrícula más allá del contorno de la Navmesh.
budgetMs6Milisegundos por cuadro dedicados a construir la cuadrícula al entrar.
maxCells200000Una Navmesh mayor usa celdas más grandes.
speedMps2.2Velocidad del recorrido, m/s.
minHopS / maxHopS0.5 / 8Duración mínima y máxima de un recorrido, s.
snapM1.5Hasta dónde se mueve un extremo a una celda caminable, m.
navmeshPrefix"Navmesh"Prefijo del objeto de Blender con la superficie caminable (ver la especificación de la escena).

[characters] — Personajes: recorridos

Para los personajes con path (ver [Character_Nombre] en 10.2).

ClavePor defectoQué hace
walkSpeed1.2Velocidad a la que camina un personaje su recorrido, m/s.
walkClipSpeed1.4Velocidad a la que está hecha la animación de caminar; se reproduce a walkSpeed / walkClipSpeed para que los pies no resbalen.
turnSpeed4Radianes por segundo que gira (hacia el camino, la silla o el visitante).
fadeS0.35Segundos de transición entre una animación y la siguiente.
occupyM0.6Un personaje a menos de esto del punto de una estación sigue en ella, m.
besideM0.8Si el personaje no ha despejado la estación que eligió el visitante, este se detiene a esta distancia a un lado, m.
occupied"leave"Lo que vale una estación que no dice occupied: "leave" o "inactive".
sitDown / seated / standUp"Sentarse" / "Trabajar" / "Levantarse"Nombres de las animaciones de sentarse, de trabajar sentado (en bucle) y de levantarse; se buscan como las de act.
lowerBody`"Hip\Pelvis\Thigh\Calf\Knee\Foot\Toe"`Huesos (patrón sobre su nombre) que se quedan en la silla cuando un personaje sentado habla; la animación de hablar mueve el resto.
walkSrc / walkClip/avatar-assets/shared/cc-animations-meshopt.glb / "Avatar_Walk"La caminata compartida (de hombre).
walkFemaleSrc / walkFemaleClip/avatar-assets/shared/cc-walk-female-meshopt.glb / "Walk_F"La caminata compartida de un personaje cuyo género es femenino. Una caminata entregada con el personaje gana a las dos.

[lessons] — Lecciones por estación

Al publicar, el sistema escribe una lección por estación a partir del material de la propuesta y la configuración de la escena: título, objetivo, todos los puntos clave y pasos que el material da (sin límite), seguridad, las preguntas de la revisión con su respuesta, y un tablero de láminas (hasta slides): cada lámina tiene título, unas pocas etiquetas con las cifras y una infografía generada con el proveedor y modelo de imagen de [lessons]. Todas las infografías de la unidad reciben las mismas imágenes de referencia: las del material del cliente (las figuras de sus documentos y sus fotos), en su orden, hasta referenceImages; si el material no trae imágenes, ninguna se envía y la infografía se dibuja a partir de su descripción. La guía enseña la lección completa al llegar, lámina por lámina, nombrando cada una («Lámina 2: …»); al nombrarla, su infografía aparece sola en pantalla (sin marco, título ni controles), se queda showSeconds o hasta que nombra otra, y se desvanece; el botón Lección de la lista hace que la vuelva a enseñar entera desde el principio (sin marcarla, completarla ni revisarla de nuevo; elegir otra estación mientras tanto solo la calla). Sin infografías (dibujarlas está apagado por defecto: cada una se paga) no hay tablero y la lección no menciona láminas: la guía enseña las mismas partes, una por turno, cada una por su tema. Durante toda la lección el micrófono está cerrado: nada la interrumpe hasta que termina. Las preguntas de la revisión salen de la misma lección (salvo que la tabla de la estación traiga questions). La lección se vuelve a escribir solo cuando cambian el material, la configuración o la escena. Una infografía se dibuja solo cuando su lámina no tiene ninguna, o cuando el comando de publicación la nombra con --redraw: nunca por sí sola, ni porque cambie el texto de la lámina, el estilo, el proveedor o el modelo (cada imagen se paga).

ClavePor defectoQué hace
enabledtrueEscribir una lección por estación al publicar.
imagesfalseDibujar las infografías que a las láminas les falten. Apagado salvo que se encienda aquí (cada imagen se paga). Las ya dibujadas se conservan y se muestran siempre; con --redraw se vuelve a dibujar lo nombrado aunque esté apagado.
words150Palabras como máximo del texto de la lección (los guiones de todas las láminas juntos), solo sobre la estación; las preguntas salen únicamente de ese texto.
slides4Láminas como máximo por estación.
imageProvider"openai"Proveedor de imagen de las infografías (openai, gemini, bfl).
imageModel"gpt-image-2.5-sunburst"Modelo de ese proveedor para las infografías.
referenceImages4Cuántas imágenes del material se envían como referencia con cada infografía (las mismas para todas).
questions2Preguntas de revisión por lección; el banco escrito tiene questionBank veces esta cantidad y la página elige al azar [quiz] perStation de él en cada revisión (una repetición no repite las preguntas).
questionBank2Cuántas veces questions tiene el banco de preguntas de cada lección. Cada pregunta prueba un dato concreto de los guiones (valor, tolerancia, herramienta, documento, criterio, orden de pasos); la lección puede escribir menos que el banco antes que rellenar, y se descartan las preguntas que se responden solas, las que responde el nombre de la estación y las que ya hace otra estación.
sourceChars60000Cuánto del material ve cada lección.
boardtrueMostrar las infografías de la lección en pantalla.
autoOpentrueArmarlas solo al llegar a la estación (aparecen cuando la guía las nombra).
showSeconds120Segundos que una infografía queda en pantalla si la guía no nombra otra.
fadeMs600Milisegundos del fundido de entrada y salida (al cambiar de lámina, la anterior se desvanece antes de que entre la nueva).
holdAfterTurnS8Segundos que la última infografía queda en pantalla después de que la guía termina la lección.
preloadParallel2Cuántas infografías se descargan a la vez al entrar (todas juntas dejaban la música de inicio esperando).
turnPerSlidetrueLa lección va una lámina por turno: la página manda la lámina 1, y al terminar ese turno la 2, y así; cada infografía aparece cuando empieza el audio de su turno. Apagado, la lección entera va en un solo turno (el modelo lo corta a los ~170 s de audio).
cueWords["lámina", "lamina", "slide"]Palabras con las que la guía nombra una lámina y su número para que el tablero cambie.

[telemetry] — Telemetría

ClavePor defectoQué hace
enabledtrueLa página envía su registro (decisiones, errores, ajustes, marcas) al registro de la sesión en el servidor.
perftrueAdemás mide el tiempo de cada cuadro (CPU por sección, GPU, cuadros lentos, tareas largas); apagar cuando no se esté midiendo.
flushMs2000Cada cuánto se envía un lote.
maxBatch60Entradas por lote.
maxBuffer600Entradas guardadas mientras no hay conexión (se pierden las más viejas).
maxChars500Largo máximo de un mensaje.
errorsPerMinute20Errores de consola que se guardan por minuto.
markKey"KeyL"Ctrl+Shift+esta tecla copia el id de la sesión y marca el momento en el registro.
longTaskMs50Umbral de tarea larga del navegador (informativo).

[prompts] — Instrucciones a la guía

Cada clave es una tabla con es y en (el texto de la instrucción en cada idioma); {n} es un número que la página rellena. rubric y protocolExtra llevan solo text.

ClaveMomento
enterTourbienvenida al recorrido (sin tareas)
enterExercisebienvenida al ejercicio por tareas
enterStationbienvenida cuando el cliente aparece ya en la estación de la primera tarea: saluda y la enseña ({n} = frases)
vrbienvenida al visor de RV
arla maqueta en realidad aumentada
arExercisela práctica con un personaje en RA
stationllegada a una estación (recorrido)
stationReachedllegada a la estación de una tarea sin lección escrita: improvisa la lección ({n} = frases)
stationLessonllegada a la estación de una tarea con lección escrita: la enseña completa
lessonResumeuna lección interrumpida por un ruido: la retoma donde la dejó
lessonSkippedse eligió otra estación durante una lección: calla, la estación queda sin enseñar y se enseñará de nuevo al volver; solo con [guide] clickSkipsLesson
enterLessonSlidebienvenida en la estación de la primera tarea con turnPerSlide: saludo de una frase y solo la lámina 1
lessonSlideFirstllegada a una estación con lección y turnPerSlide: solo la lámina 1
lessonSlideNextcada lámina siguiente de la lección (y la lámina actual tras una interrupción por ruido)
lessonSlideResumela lámina en curso, retomada donde una pregunta escrita la interrumpió
typedQuestionlo que el cliente escribe en el diálogo: respuesta corta, sin pregunta al final. Mientras una pregunta de revisión espera respuesta, lo escrito en el diálogo es la respuesta (como en la tarjeta de la pregunta) y va tal cual, sin esta instrucción
enterLessonbienvenida cuando el cliente aparece en la estación de la primera tarea y esta tiene lección escrita
taskDonetarea hecha, pedir la siguiente
lastTaskDoneúltima tarea hecha, cierre (sin examen)
checkOpenabrir la revisión: confirmar y hacer la pregunta 1 ({n} = preguntas)
checkNextsiguiente pregunta, tras enseñar la respuesta anterior
checkDoneNextrevisión terminada, siguiente tarea
checkDoneLastúltima revisión terminada con alguna pregunta fallada: resultado final y el plan de estudio que la página arma con las láminas (por cada pregunta fallada: la lámina que la enseña, citada, y qué hacer en la escena); ella lo dice punto por punto
checkDoneLastCleanúltima revisión terminada sin ninguna pregunta fallada: resultado final y felicitación, sin plan de estudio
checkStuckrecordatorio: calificar o repetir
examStartanuncio del examen
examDonecierre con el resultado del examen y el plan de estudio que arma la página, cuando hubo alguna pregunta fallada
examDoneCleancierre con el resultado del examen sin plan de estudio: ninguna pregunta fallada
checkIncheck-in tras inactividad
actqué está haciendo el cliente en un punto
actDoneacción terminada
showClickdescribir un objeto al hacer clic
clipboardOpenhoja abierta: la enseña en profundidad (para qué sirve, cada campo y de dónde sale su dato, qué se hace con ella); solo con [guide] describeForms
formUnfilledhoja cerrada vacía
commentcomentario breve (otros eventos)
talkDebriefretroalimentación tras conversar con un personaje
awarenessprefijo de los contextos silenciosos
rubrictext: la rúbrica de calificación
protocolExtratext: instrucción adicional al protocolo de la guía

[controls] — Tablero de mando: teclas y funciones

ClavePor defectoQué hace
functionDoneS1Segundos que una función de la máquina debe mantenerse activa para contar como hecha.
keyDeflectPerS3Rapidez con que una palanca manejada con teclas llega al tope (desviación por segundo).
keyReturnPerS4Rapidez con que vuelve al centro al soltar las teclas (salvo sticky).
knobKeyPerS0.5Parte del recorrido de una perilla que gira por segundo con su tecla sostenida; una perilla con steps avanza una posición por pulsación.

10.2 Objetos de la escena

Una tabla por objeto, con el nombre exacto del objeto en Blender ([Station_01_Placa], [Hotspot_Micrometer], ["Show_Balde_De_Pintura"]): así se emparejan. Las claves dependen del prefijo. Un nombre con acentos o espacios se escribe tal cual, con o sin comillas ([Show_Tapones_Para_Oídos], [Station_03_Mesa de herramientas]).

[Station_NN_Nombre / Seat_Nombre]

ClaveQué hace
taskla tarea de la estación: lo que muestra la lista y lo que ella pide
topicel tema que enseña al llegar
descriptionla estación en sí, en 2-3 frases: el lugar, los equipos, instrumentos y documentos que hay y lo que ve el alumno; es el escenario de cada lámina de la lección y ella lo cuenta al llegar. Sin esta clave se usan los hechos de la escena (número y nombre de la estación, los objetos que hay en ella y su nota de Blender); nunca la inventa un modelo.
questionslista de pares ["pregunta", "respuesta esperada"]; con ella hace exactamente esas, en orden
imagestrue o false: false deja la estación sin infografías (ni las ya dibujadas); true dibuja las que le falten aunque [lessons] images esté apagado; sin la clave manda [lessons] images
examtrue o false (por defecto false): la estación entra al examen final; sin ninguna estación con true no hay examen y las revisiones dan la calificación
occupied"leave" o "inactive" (por defecto [characters] occupied, "leave"): qué pasa cuando el visitante elige la estación y un personaje está en ella. "leave": el personaje sigue su camino (se levanta si está sentado y continúa desde su siguiente walk); si no ha despejado al llegar el visitante, este se detiene a un lado y cuenta como llegada. "inactive": mientras el personaje esté ahí la estación no se puede usar: su marcador se ve gris y no responde, y llegar caminando no cuenta (ni lección ni tarea) hasta que el personaje se vaya por su cuenta.

[Character_Nombre]

ClaveQué hace
notelo que dice del personaje al nombrarlo o conversar
pathsu recorrido: pasos que repite en orden mientras el visitante está dentro de la escena (abajo)
[Character_Alejandra]
path = [
  { act = "Saludar" },        # una animación, una vez
  { walk = "Archivo" },       # camina a esa estación por la Navmesh
  { act = "Buscar" },
  { walk = "Escritorio" },
  { sit = true },             # se sienta, mirando hacia donde mira el empty de la estación
  { work = [20, 60] },        # mantiene lo que hace (trabajar sentado o de pie) entre 20 y 60 s
  { stand = true },           # se levanta
]

[Hotspot_Nombre]

ClaveQué hace
actionqué hace el cliente al accionarlo (lo dice al empezar)
readingla lectura del instrumento; la dice al terminar la acción
notelo demás que debe decir al terminar

[Clipboard_Nombre]

ClaveQué hace
instructionslo que dice al abrir la hoja
expectedtabla campo = valor esperado, para que juzgue la hoja

[Show_ / Screen_ / Button_ / Knob_ / Joystick_]

ClaveQué hace
notelo que dice del objeto al nombrarlo o hacer clic
keyssolo controles: las teclas que lo manejan en la computadora. Una palanca lleva cuatro (arriba, izquierda, abajo, derecha: "ijkl"), una perilla dos (bajar, subir: "zx"), un botón una ("p"). Funcionan solo en la estación del control y con ninguna tarjeta abierta; las flechas, E, V y la barra espaciadora son de la escena y no se pueden usar.
labelsolo controles: el nombre corto que el mando imprime junto al control ("S1", "B2.RL"). El visor lo muestra flotando al lado del control, con una línea hasta él (ver «Primer plano del panel y etiquetas», abajo). Sin label, el control no lleva etiqueta.

[scene]

ClaveQué hace
welcomesu primera frase al entrar, tal cual

Las tablas que solo usa el player de capacitación ([module.*], title en [scene]) y los avisos de /gen-player están en la documentación del player.

Sin tabla para un objeto, la página usa la propiedad note del objeto en Blender si existe, y si no, su nombre. Todo lo que hay en una tabla también llega a la guía como texto, así que puede contestar preguntas sobre ello.

Funciones de la máquina: [conditions] y [functions.Nombre]

En una máquina real, lo que hace la máquina sale de varios controles a la vez: las dos palancas hacia arriba avanzan las orugas; el botón de la palanca derecha sostenido con la palanca hacia adelante mueve el brazo; el regulador fija la potencia del martillo. Cada control mueve su propia acción Play_ (el control mismo, la mano del operador); lo que hace la máquina se describe aquí, una tabla por función.

[conditions]
listo = ["Button_S0 off", "Button_S1 on"]

[functions.Avanzar]
label = "Avanzar con las orugas"
when = ["listo", "Joystick_Torre.y > 0.2", "Joystick_Pluma.y > 0.2"]
plays = "Play_Orugas_Maquina"
follows = "Joystick_Torre.y"

[functions.Martillo_regulado]
label = "Martillar con potencia regulada"
when = ["listo", "Button_Percutor held", "Knob_R1 > 0"]
plays = "Play_Percutor_Maquina"
speed_from = "Knob_R1"

[functions.Avanzar_simultaneo]
label = "Avanzar con las dos orugas"
when = ["listo", "Knob_S5.step = 0", "Button_B1LR held", "Button_Alcance held"]
plays = ["Play_Oruga_Izq_Maquina", "Play_Oruga_Der_Maquina"]
drive = 1

Condiciones (en when y en [conditions]): el nombre de un grupo de [conditions], o un control con su prueba:

CondiciónSe cumple cuando
Button_X on / Button_X offel botón está encendido (mode = toggle) o mantenido; o no
Button_X heldel botón se mantiene pulsado (mode = hold)
Button_Xencendido o mantenido
Knob_X > 0.5la perilla pasa de la mitad (0 = mínimo, 1 = máximo)
Knob_X.step = 2la perilla con steps está en la posición 2 (0 = la primera): un selector
Joystick_X.y > 0.2la palanca empujada hacia adelante (.y: −1 atrás, 1 adelante; .x: −1 izquierda, 1 derecha)

Comparaciones: >, <, >=, <=, =. not delante niega una condición de control. La función está activa mientras se cumplen todas. Los nombres de los controles van tal cual en Blender, sin espacios.

ClaveQué hace
whenlista de condiciones (obligatoria)
playsla acción Play_ de la máquina que mueve, o una lista de acciones que se mueven juntas (las dos orugas): ["Play_Oruga_Izq_Maquina", "Play_Oruga_Der_Maquina"] (obligatoria)
followsuna palanca (Joystick_X.y) o perilla: la acción avanza a ese valor × speed por segundo, hacia atrás si es negativo; con la palanca a medias, a media velocidad
drivesin follows ni mode: un número de −1 a 1 (no 0); mientras la función está activa, la acción avanza a ese valor × speed por segundo, hacia atrás si es negativo. Es la función que mueve un botón: en el Brokk, con S5 arriba, B1.LR avanza las dos orugas (drive = 1) y B1.LL las hace retroceder (drive = -1). Una acción guarda una sola posición, la mueva una palanca o un botón
speedfracción de la acción por segundo a tope (por defecto, la del Joystick_: 0.5)
speed_fromuna perilla o palanca que multiplica la velocidad (el regulador). Mientras está en cero, la función no mueve nada ni cuenta como hecha.
modesin follows: loop (por defecto) repite la acción mientras está activa; once la reproduce cada vez que se activa; hold avanza mientras está activa y regresa después
restdónde está la máquina en reposo a lo largo de la acción, de 0 (inicio) a 1 (final). Por defecto, la mitad si la mueve una palanca o un drive (va en los dos sentidos, como las acciones de la palanca) y el inicio en los demás casos
traveltrue, con follows o drive: la acción lleva la máquina entera (mueve solo la raíz de su rig, como las orugas del Brokk) y la máquina va tan lejos como se la conduzca, desde donde esté, en vez de pararse al final de la acción. La detiene una pared u otro sólido, o una persona (el visitante o un personaje) a menos de 45 cm. El Collider_ que rodea la raíz de la máquina viaja con ella y es su huella; al reiniciar el ejercicio, la máquina vuelve a su sitio
labelcómo se llama la función en la lista de tareas y para la guía
notelo que la guía sabe de ella
stationla estación a la que pertenece (por defecto, la del primer control de when). Varias estaciones en un mismo lugar (a menos de 25 cm) son varias tareas que se hacen ahí sin caminar, en su orden; las teclas de un control fijo (un enchufe) funcionan en la estación de su lugar y en las que tienen funciones o estados que lo leen

Cada función es un punto de la tarea de su estación: cuenta como hecha cuando se mantiene activa [controls] functionDoneS segundos. En una estación con funciones, los controles ya no son puntos sueltos ni avisan a la guía: la tarea es lo que hace la máquina. Las acciones de los controles deben mover solo el control (y la mano del operador); el movimiento de la máquina va en las acciones que nombran las funciones.

Las acciones de las funciones se suman. Al cargar la escena, el visor pone la máquina en la pose de reposo de cada acción (rest); cada función activa añade lo que su acción se aparta de esa pose. Así las dos palancas a la vez mueven la pluma y el brazo completos, aunque Blender exporte en cada acción todos los huesos del brazo y las mangueras se muevan en varias acciones. Si se reprodujeran enteras, cada una sostendría en reposo lo que mueve la otra y el visor las promediaría a la mitad. Lo mismo vale para los dos ejes de una palanca, que se suman desde el centro.

Estados de la máquina ([states.Nombre]): lo que la máquina recuerda, como la unidad de control encendida, el motor en marcha o el circuito de control establecido.

[states.encendido]
label = "Encender la unidad de control"
set = ["Button_S1 held"]
clear = ["Button_S0 on"]

[states.circuito]
label = "Establecer el circuito de control"
set = ["encendido", "Button_Alcance held"]
clear = ["not encendido"]
idle_s = 3

Un estado se enciende mientras se cumplen todas las condiciones de set y se apaga mientras se cumplen todas las de clear (si se cumplen las dos, se apaga). Con idle_s, se apaga solo cuando pasan esos segundos sin ninguna función activa: el circuito del Brokk se corta a los 3 s y el botón de la palanca lo establece de nuevo. Con hold_s, se enciende solo cuando sus condiciones de set llevan esos segundos cumpliéndose sin interrupción: el interruptor principal Q1 del Brokk, 3 s en la posición 0 antes de pasar a la otra fase. Con while, solo puede estar encendido mientras se cumplen todas esas condiciones: el motor, mientras la unidad está encendida y la máquina tiene corriente (clear exige todas sus condiciones a la vez, así que no podría apagarlo por cualquiera de las dos). Con last = true, un estado con label va en la lista después de las funciones: la desconexión es lo último. Con initial = true, empieza encendido. Una condición nombra un estado igual que un grupo de [conditions] (encendido, not circuito). Un estado con label es también un punto de la tarea: cuenta la primera vez que se enciende y va antes que las funciones en la lista, porque el arranque va primero. También acepta note y station.

Indicadores ([indicators.Nombre]): una luz del modelo, la malla Indicator_Nombre (u otra que diga node). Cada color (green, yellow, red, orange, blue, white) lleva la lista de condiciones que lo encienden; gana el primero que se cumple, y si ninguno se cumple la luz queda con su propio material.

[indicators.LED2]
green = ["circuito"]
yellow = ["encendido", "not circuito"]

Una pantalla muestra texto mientras está encendida: su tabla text asocia una condición (un estado, un grupo de [conditions] o una condición de un control, entre comillas) con lo que dice la pantalla en ese momento. Gana la primera que se cumple; si ninguna se cumple, la pantalla solo se ilumina. \n separa las líneas. El texto se dibuja como una pantalla con luz de fondo, con el color encendido de fondo y las letras oscuras. La malla necesita UV completa (la imagen llena la pantalla) con la parte de arriba de la pantalla arriba y su izquierda a la izquierda, como la ve quien la usa; con la UV volteada las letras salen al revés.

[indicators.Pantalla]
green = ["encendido"]

[indicators.Pantalla.text]
motor = "+23°C   20 bar\n102 h"
encendido = "BROKK\nStart Engine"

En lugar de un texto, una entrada de text puede ser una pantalla con la disposición de la de la máquina, como una tabla en línea:

[indicators.Pantalla.text]
motor = { lines = ["+23°C  20 Bar", "102 h"], left = "battery 4/4", right = "signal 4/4", mark = "lubrication" }
encendido = { logo = "BROKK", lines = ["START ENGINE", "(I)  (M)"] }
ClaveQué dibuja
logouna palabra grande, en negrita y subrayada, arriba (la marca)
lineslas líneas, centradas debajo
left / rightun indicador de barras a lo largo de ese borde con su símbolo al pie: "símbolo nivel/de" (en el Brokk, la batería y la señal de radio, de 0 a 4 rayas)
topun indicador horizontal arriba, con su símbolo al principio (por ejemplo, el nivel de aceite)
markun símbolo después de la última línea (por ejemplo, la lubricación del martillo)

Símbolos: battery, signal, oil, lubrication, service. Todo se dibuja con la tinta oscura sobre el color encendido. La página dibuja la pantalla ella misma: no hace falta ninguna imagen.

Un indicador también acepta note (lo que la guía sabe de él) y label, su nombre corto ("LED2"), que se muestra a su lado como el de un control. Las luces de la máquina (sus faros de trabajo) también son indicadores: una malla Indicator_Luces que se enciende en white con el motor.

Primer plano del panel y etiquetas

Mientras el visitante maneja un panel (está en la estación de sus controles y ninguna tarjeta está abierta):

10.3 Avisos al publicar

AvisoSignificado
scene_config_missingno hay archivo de configuración en las fuentes
scene_config_invalid_tomlel archivo no es TOML válido (se ignora entero)
scene_config_unknown_objectuna tabla cuyo nombre no es un grupo de ajustes ni un objeto con prefijo conocido
scene_config_unknown_keyuna clave que ese tipo de tabla no admite
scene_config_bad_valueun valor del tipo equivocado
scene_config_stray_valueun valor suelto fuera de toda tabla
scene_config_bad_path_stepun paso de path que no es act, walk, sit, work ni stand
scene_config_bad_conditionuna condición de when o de [conditions] que no sigue la forma de la tabla de condiciones (la función se ignora)
character_path_unknown_stationun walk nombra una estación que la escena no tiene
character_path_act_no_clipun act sin animación (ni entregada, ni Act_ en la escena, ni importada)
character_path_no_sit_clipsun sit sin las animaciones de sentarse: el personaje se queda de pie
character_path_no_navmeshun recorrido con walk en una escena sin Navmesh: camina en línea recta, atravesando lo que haya
character_path_no_characterun [Character_…] con path pero sin personaje entregado

---

10.4 Solo en el player

/gen-player lee el archivo de con-mgr (DEMO); la primera vez lo toma de Drive y lo guarda allí.

[scene], además de welcome:

ClaveQué hace
titleel nombre del entrenamiento: el título de la página del reproductor y del informe (/gen-player). Sin él, el título de la última propuesta de la unidad.

[module.CÓDIGO] y [module.CÓDIGO.exercise.CÓDIGO] (solo /gen-player)

Los módulos de la unidad en el LMS, que /gen-player crea en DEMO si no existen (flow-mgr docs/player.md; capítulo 3). Puede haber varios y van en el orden del archivo. El nombre de la tabla es el código del módulo: dos letras (OB) o el código de la unidad y dos letras (ALFOB). Cada módulo puede definir sus propios ejercicios; su orden en el archivo es la secuencia del LMS. Un módulo sin ejercicios recibe los tres estándar: TU «Tutorial», TE «Revisión Teórica» y PR «Práctica».

[module.OB]
name = "Operación del Brokk 170"

[module.OB.exercise.TU]
summary = "Aprende a moverte por la escena y a usar el control remoto."

[module.OB.exercise.DM]
name = "Demolición de muro"
simulation = true
task_stations = ["Pared", "Control remoto"]
ClaveQué hace
name (módulo)el nombre del módulo en el LMS. Sin él, un modelo lo escribe a partir del material de capacitación; con varios módulos en el archivo, cada uno necesita el suyo.
name (ejercicio)el nombre del ejercicio. Opcional para TU, TE y PR, que usan el estándar; obligatorio para cualquier otro código.
summaryla frase del ejercicio que muestran la pantalla de carga del LMS y el menú del módulo. Sin ella, la escribe el modelo a partir del material.
simulationtrue incluye el ejercicio en la etapa práctica del examen del módulo. Por defecto, solo PR.
task_stationslas estaciones que son las tareas del ejercicio, con los nombres que usa walk de un personaje (Locker es Station_02_Locker), en el orden de la escena. Cada ejercicio tiene las suyas, así que los ejercicios pueden tener estaciones distintas. Una estación que ningún ejercicio lista es solo de los personajes: no es tarea, no tiene marcador y no se le asigna ningún objeto (los objetos van a la estación listada más cercana). Sin la lista, todas las estaciones son tareas. El examen del módulo usa las de la práctica.

Sin tablas [module.*], la unidad tiene un módulo con el nombre que un modelo escribe a partir del material. Su código es el de la unidad más las iniciales de las dos primeras palabras con significado (ALF + «Operación del Brokk» = ALFOB). Lo que el archivo no da (nombres, resúmenes) se escribe una vez y se conserva, porque el LMS compara esos textos en cada publicación. Si después se cambia en el archivo un nombre o resumen que DEMO ya tiene, el aviso es lms_demo_conflict; nunca se edita lo que ya existe. El icono del módulo se renderiza desde el archivo de Blender de la unidad, con su Icon_Camera si la escena la tiene (ver la especificación de la escena).

[tablet] (solo /gen-player)

Lo que hay en cada app de la tableta (capítulo 2.5b). Cada elemento es una tabla con nombre propio, para que la unidad pueda completar o cambiar uno que viene de la configuración global. sequence ordena cada lista; enabled = false oculta uno heredado. Documentos y videos: source es la etiqueta de un recurso de con-mgr (DEMO), de la unidad o de la biblioteca compartida (un documento debe ser PDF; un video, MP4 o WebM). Contactos: name, role, portrait (etiqueta de una imagen PNG o JPEG); guide = true es la guía del ejercicio; cualquier otro necesita instructions (quién es y cómo responde) y puede llevar voice (una voz de Gemini) o gender. live_avatar nombra su Gemini Live Avatar; avatar nombra su avatar de voz entre los presentadores de flow-mgr (sin él: el presentador propio de la unidad para la guía, el presentador incluido para los demás). Las instrucciones, la voz y el Live Avatar se quedan en flow-mgr: nunca llegan a la página.

[tablet.documents.manual]
source = "manual"
title = "Manual de uso"

[tablet.videos.arranque]
source = "video.brokk-arranque"
title = "Arranque"

[tablet.contacts.jefe]
name = "Carlos Ruiz"
role = "Jefe de planta"
voice = "Charon"
instructions = "Respondes sobre los turnos y la seguridad de la planta."

Configuración global y herencia. con-mgr guarda además una player-config global (biblioteca compartida). La de la unidad se aplica encima, con la regla de GW2: un valor de la unidad gana, las tablas se combinan y una lista reemplaza a la otra entera. Ahí vive el perfil del Mentor:

[tablet.contacts.mentor]
name = "Camila Rojas"
role = "Mentor"
live_avatar = "Kira"
guide = true
sequence = 10

Una unidad le cambia el nombre con solo [tablet.contacts.mentor] y name = "Laura".

10.5 Avisos de /gen-player

AvisoSignificado
lms_module_unnamed/gen-player: un módulo sin name cuando el archivo define varios, o el modelo no dio ninguno
lms_module_bad_code/gen-player: un código de módulo que no es dos letras ni el código de la unidad más dos
lms_module_duplicate/gen-player: dos módulos con el mismo código
lms_exercise_unnamed/gen-player: un ejercicio distinto de TU, TE o PR sin name
lms_demo_conflict/gen-player: DEMO ya tiene la organización o el módulo con otro nombre o resumen; no se escribió nada
lms_demo_error/gen-player: Support Admin no respondió, o no se pudo hacer el icono; no se escribió nada
lms_demo_not_configured/gen-player: flow-mgr no tiene la clave del listener de Support Admin
player_music_not_configuredflow-mgr no tiene la dirección o la clave de con-mgr: sin música
player_music_missingla biblioteca de con-mgr no tiene una de las pistas: ese momento queda con la música propia del player, o en silencio
player_music_faileduna pista no se pudo copiar, o la biblioteca no se pudo leer: igual que arriba
player_tablet_not_configuredni la configuración global ni la de la unidad tienen [tablet]: las apps de la tableta quedan vacías
player_tablet_source_faileduna fuente de [tablet] (documento, video o foto) no está en con-mgr, no se pudo copiar o no es del tipo esperado: queda fuera

---

ENGLISH

1. What it is

The player is a unit's training as an app of its own, separate from the interactive proposal. It lives on DEMO: https://demo.trainbeyond.com/player/CODE/ (ALF, TAC…). The 3D scene, the stations, the lessons, the voice guide and the checks are the proposal's own pieces (chapters 4 to 8 and 10 are shared with it as they are); what changes is everything around the exercise:

The interactive proposal (panels, presenter, /gen-proposal) is documented on its own: Interactive proposal.

2. What the trainee sees and does

2.1 Getting in

The trainee signs in to the platform (LMS) and opens the module; the LMS launches the player with their identity. The LMS's loading screen comes first, with the module's and each exercise's name, while the scene downloads; then the module screen. Without the LMS the player also opens with the unit's access code (for testing). On DEMO, the Test Owner of each unit's organization signs in with the unit's access code as the password.

2.2 The module screen

2.3 The exercises

ExerciseWhat it is
Tutorial (TU)Learning to move and use the controls, with no checks. Up to four tasks: walk to station 2 and look around; click an object to learn about it (when the scene has Show_ objects; the task names one at that station); open the remote control and try a button and a joystick; ask the guide a question (the microphone opens by itself for that task; typing works too).
Theory Review (TE)The guided exercise: the guide teaches each station with its lesson, the trainee does the task and answers the station's check, aloud or typed. Passed with the checks' average at or above 70%.
Practice (PR)The simulation: the trainee alone, with no guide, no markers and no checklist; the bar only says how many tasks are done ("Práctica · 3/8"). Each station is reached on foot. Passed with 70% of the tasks in their order.
Module examThe tasks of the simulation exercises (Practice), alone and without the guide, then the module's questions, one per station, which the guide asks without feedback. Passed with 70% in both parts. It goes to the LMS as the module's exam.

The exercises, their names and summaries, and which ones the exam takes are set in the configuration file ([module.*], chapter 10.4); without them the module has the three standard ones.

2.4 Inside the scene

Inside the scene everything works as in the proposal. What follows is that same description (where it says "the client", read "the trainee"):

The visit is a task exercise: the stations, in their order, are the tasks. Each one's instruction is the station's note, and what there is to do there are the interactive objects beside it (the hotspot, the sheet, the person, the screen, the controls). The guide asks for one task at a time, on arrival teaches the station and says what to do, confirms each task done, hints when the client gets stuck and closes with feedback. The checklist shows on the right, done tasks struck through; they can be done in any order. (The tuning panel can switch back to the narrated tour, or count a task done on arrival alone.)

Lessons. Every station has a lesson written at publish from the client's material and the scene configuration, with its infographic. On arrival the guide teaches it in full, one part per turn; with infographics, each one appears as she names it. The checklist's Lesson button has the guide teach it again from the start, changing no task. The check questions come from that same lesson.

Start screen. On entering the exercise (and after a reset) a screen shows the welcome line, the mission (the tasks in order, with their station's number and name) and the controls, with its own music. The guide falls silent the moment it opens (even mid-sentence) and says nothing until it closes: a click anywhere on it, or by itself after three minutes (a setting). The checklist and the dialog stay hidden while it is open, so the screen shows alone.

Assessment. When each task is done, the guide asks two short questions about that station, drawn from what she just taught (the proposal's material and the scene configuration). When she finishes asking, a card appears in the middle of the screen with her words, a line to type the answer and an I don't know button; while the check is open the client cannot walk or work anything. They answer aloud (the microphone opens when the question ends) or by typing; she scores each answer from 0 to 100 and the checklist shows each question's score and the station's average ("100 · 0 → 50 %", green when it passes, red when not). A grade counts only after the client has spoken or typed; if the guide grades before that, the grade is discarded and she repeats the question. While the check is open nothing else reaches the guide. A question unanswered for three minutes scores 0 and the next one comes. After each answer she says what the correct one was and why: one sentence if right, two if wrong. The rubric (100 complete and correct · 80 one minor omission · 60 the main idea · 30 related but wrong · 0 wrong or no answer; judged only against the proposal's material) and every instruction the page gives the guide are in the tuning panel, group "Instructions to the guide", saved per unit. The card appears once the action has fully finished and she has finished asking. When a hotspot is worked, the guide says in a sentence what the client just did and confirms it is done. While the action plays, an inset shows up close the instrument or part the animation moves, so its reading can be read; if the point carries a note with the reading, she says it when done. With every task done and checked comes the exam: the client repeats the whole exercise alone, in the correct order, with no checklist, no station numbers and no help; the guide stays silent until the end. Reaching a station means walking up to it (or using its marker, outside the exam); the station where the exam begins counts only after walking away and coming back. It is passed by completing every task with at least 70% of them in order and with the station checks' average at or above that same pass mark (setting checksCount; off, the practical alone decides). The report shows both parts with their own result. At the end she closes with the exam result, the check results and brief feedback, and the exam report opens: passed or not, tasks in order, time, and each station's check score with their average (green passes, red fails); the success or failure music plays while the report is open. The report closes or restarts the exercise; the result's Report button reopens it. If the client leaves the scene with the report open and comes back in, the report shows again, with Close and Restart; reloading the page starts the exercise over. (Questions per station, the exam and the pass mark are settings in the panel.) The final report fills most of the screen, in three tabs: Summary (result, score and score per station), Study plan for the next attempt, which the page builds from the slides themselves (per missed question: the slide that teaches it, quoted, and what to do in the scene: replay that slide with the Lesson button and click the station's objects), and Questions and answers (every question with your answer, the correct one, the feedback and the lesson sentence that teaches it). The Download PDF button saves the same report as a PDF file; the box “Include the full session transcript in the PDF” (unticked by default) appends the whole session's dialog at the end of the PDF, with the lines that cover the study plan's topics highlighted and the topic named under them. When the report is closed the exercise data stays in the browser: in the configuration panel (Ctrl+Shift+K), “Report: saved data” opens the last report again, saves the data to a file and loads a report from a file, without repeating the exercise.

The microphone inside the scene has two states, open and closed, and the badge at the top right says which. It opens only when the guide is listening: for a few seconds after each thing she says, and for as long as the client keeps talking. While walking, with a sheet open or while she explains, it is closed, so the room's noise never reaches her. To speak to her at any other time, hold the M key or click the badge. A VR headset has no keyboard and no badge: hold A or X on either controller, and a small sign below the view says whether the mic is open ("Listening") or how to open it. While a check question waits for its answer, in the headset she listens between her turns without any button (in VR there is nowhere to type the answer).

ActionComputerVR headset
Enter the sceneclick the dioramaEnter VR button
Lookdrag with the mouseturn your head
Walkarrow keys (the ground is followed: steps, ramps; walls, posts and machines stop the visitor)thumbstick; teleport by pointing at the floor
Change stationclick the numbered marker: the character walks there around obstaclespoint at the marker and pull the trigger
Start overReset button on the checklist or the report: everything goes back to the start (tasks, worked points, sheets, screens, position at station 1) and the entry runs again: start screen, welcome and lesson (asks to confirm)same
Report a problemCtrl+Shift+L copies the session id and marks the moment in the log; send it with what happenedsame
Skip to the check (testing)Ctrl+Shift+X ends the current station's lesson, takes its task as done and opens the checksame
Know where you arethe status bar shows the station's number and name ("Station 1 · Placa"); the marker of the station you stand on shows grey and still while its task is pending; the guide names stations by their number, as the markers dosame
Bird's-eye viewspace bar—
Change view (third / first person / drone)V—
Activate a nearby interactive pointE, or click the diamondtrigger on the diamond
Next image on a screenclick the screentrigger
Talk to a characterE near them, or clicktrigger
Speak to the guideopens by itself after each thing she says; at other times, hold M or click the badgeopens by itself after each thing she says and for a whole check question; at other times, hold A or X
Press a machine button / turn a knob / move a joystickclick / drag or wheel / dragtrigger / hold the trigger and raise or lower the hand or use the thumbstick / hold the trigger and use the thumbstick
Open a formclick the clipboard: the camera comes close and the page appears alone over itfilled in from a phone (?clipboard)
LeaveEsc. On re-entry the visitor stands at the station they left and the exercise's progress is kept; Reset returns them to station 1—

With a delivered Avatar, the client tours the scene as a character (third person by default); in VR they see their own body from the neck down and, with hand tracking, their real hands drive the avatar's.

2.5 The report and the platform

At the end, the exercise's report (Summary, Study plan, Questions and answers, Download PDF) also shows what happened to the result in the LMS:

Each exercise sends its result under its own code; the exam sends the module exam's result. Back on the module screen, the pill shows the new score.

2.5b The tablet

Inside the scene, the Tablet (T) button (or the T key) opens the trainee's tablet, which looks and works like an iPad. At the bottom, a bar holds its three apps, Videos, Documentos and Llamadas, with the chosen one lit. The tablet opens on the app last chosen.

When there are more thumbnails than fit, ‹ › turns the page. The home indicator or the back button returns from a video, document or call to its app. The configuration file's [tablet] table says what each app holds and in what order (chapter 10.4); the Mentor's profile comes from the global configuration. In a headset (controllers or hands) the tablet is a panel in front of the trainee: it opens with the small button at the bottom left of the view, and everything is pointed at and pinched (or triggered). With nothing on the tablet and no guide (the Practice without [tablet]), the button does not show.

2.6 Leaving, coming back and restarting

3. How a player is published

3.1 The sources

3.2 The command

In Google Chat, /gen-player CODE. The publish:

  1. builds the player's package: the scene converted from the Blender file, the lessons, the guide's voice recorded once with the live guide's own model (and reused by later publishes), the music, and the module's icon, rendered from the Blender file (with its Icon_Camera when the scene has one);
  2. prepares the LMS on DEMO through Support Admin, only what is missing: the unit's organization, its Test Owner (with the unit's access code as the password), the module and its exercises; it never edits what exists;
  3. publishes the player at https://demo.trainbeyond.com/player/CODE/.

3.3 What a publish returns

The player's address; how many lessons and recordings it has, and how many were recorded this time; the LMS module and whether it was created or already there; and the findings (chapters 10.3 and 10.5).

4. Naming conventions — quick reference

The viewer is not configured: it reads the object and action names in the Blender file. Anything that matches no convention is plain scenery. Names are compared trimmed and case-insensitively; the separator can be _ or ..

NameTypeWhat it doesExample
Station_NN_Nameempty on the floorstanding viewpoint; NN orders; entered at the lowest; its −Y faces forwardStation_01_Reception, Station_02_Cutting_Line
Seat_Nameempty at eye heightseated viewpoint (cab, control chair); limited lookSeat_Crane_Cab
Skyboxmesh (inverted dome)the sky and the ambient light; hidden in the dioramaSkybox
SunSun-type lightdirection and colour of the shadows (the viewer sets the strength)Sun
Loop_Nameactionambient animation looping while the client is insideLoop_Conveyor, Loop_Flare
Avatar + Idle, Walkarmature + actionsthe client tours the scene as that characterAvatar, Avatar_Eyes (optional empty at eye height)
Hotspot_X / Play_X / Act_Xempty / scene action / avatar clipinteraction: the anchor where they stand, the equipment moving, the human gestureHotspot_Open_Valve, Play_Open_Valve, Act_Open_Valve (Act_Operate = generic gesture)
Focus_Nameobject or emptywhat the diorama frames when the ground is hugeFocus_Airliner
Screen_Name_NNstacked meshesscreen with an image sequence; a click advancesScreen_Menu_01, Screen_Menu_02
Display_Name16:9 meshmonitor showing live the screen shared with ?displayDisplay_Registration
Character_Nameempty or rootwhere a person the client can talk to stands; properties persona, voice, genderCharacter_Alejandra
Clipboard_Namemesh in the paper's shapea form the client fills in; property form = HTML page (or fields)Clipboard_Inspection + form = corte.html
Show_Nameobjectlights up when the guide says its name (whole words, only those at the current station); optional noteShow_Helmet, Show_Nitrile_Gloves
Collider_Namesimple mesh (box or plane)invisible stop for the visitor where steps would pass through railings, guardrails or cables; never drawnCollider_North_Rail
Button_Namemesh or empty over meshesmachine button; plays Play_Name; property mode = once / toggle / hold / latchButton_Start + Play_Start
Knob_Namemesh or empty over meshesknob; scrubs Play_Name from minimum to maximum; property stepsKnob_Pressure + Play_Pressure
Joystick_Namemesh or empty over meshestwo-axis stick; drives Play_Name_X and Play_Name_Y; properties mode (position / rate), sticky, speed, tiltJoystick_Boom + Play_Boom_X, Play_Boom_Y
Indicator_Namemesha machine light that glows in the colour the configuration file says ([indicators.Name])Indicator_LED1

Custom properties (Object Properties → Custom Properties) the viewer reads:

ObjectPropertyExample
Station_ / Hotspot_note — the station's topic the guide expandsEvery coil is inspected here before cutting
Show_note — one sentence about the objectProtects against chemicals
Character_persona, voice, genderReceptionist, 8 years…, Kore, female
Clipboard_form (HTML page), fields (A; B; C... list), notecorte.html · Name; Date; Notes...
Button_mode (once, toggle, hold, latch), plays (another action)toggle · Play_Pump
Knob_steps (fixed positions), value (where it stands when the scene loads, 0 to 1), plays5 · 0.5
Joystick_mode (position, rate), sticky (no spring back), speed (action per second at full push), tilt (degrees)rate · 1 · 0.5 · 20

Several objects in one action: NLA tracks with the same name on each object (Play_Start on the button and on the piston) export as one animation. That is how the button sinks and the machine answers, or the knob turns and the needle follows.

Bone constraints (machines): the viewer solves these constraints of the scene's armatures live, as Blender does: Damped Track; Copy Location and Copy Transforms between bones of the same armature, in world space; IK of one or two bones without a pole (with its bones' IK locks and limits); Limit Rotation and Limit Location in local space. So with several actions at once (the boom and the arm), the cylinders keep aiming at their mounts, the hoses follow their control points and the tool stays on its mount. Actions should move only the bones that are really animated (boom, arm, tool, slew): what the constraints follow, the viewer places. Other constraints stay as each action bakes them, and the conversion log names them (BLEND_BONE_CONSTRAINTS).

A panel on the visitor's body: a remote the operator wears (on the belt) is parented in Blender to a bone of the Avatar (Bone parent type). It travels with the visitor, shows in first person when looking down, and its controls work with the pointer, the controller ray in VR or their keys. First person looks out of the middle of the open part of the screen, left of the checklist and dialog column: what the operator faces, the remote when looking down, is not under that column.

In the player only, also:

PrefixTypeWhat it doesExamples
Demo_Nameactionthe demo on the player's first page (the module screen), with the Loop_ actions; without any, the avatar tours the stations and their hotspotsDemo_Brokk_v3, Demo_Pared_Trozo_033_0
Door_Name + Open_Namemesh or root + actiona door opened with a click and walked through; with the exercise property it leads to another exercise of the module and opens once the current one is complete (chapter 8)Door_Storeroom, Open_Storeroom

5. Forms (Clipboard_)

The form is an HTML page the designer writes: any layout, the plant's sheet as a table, inline styles, even a script that builds the rows. Rules:

  1. Every box the client fills in is an <input>, <select> or <textarea> with a name.
  2. The file goes with the unit's Drive sources: in a forms folder, or beside the client's documents (from-client). It is found by its name (e.g. corte.html).
  3. In Blender, the Clipboard_Inspection plane carries the custom property form = corte.html (forms works too; on the object or on its mesh data). Model it in the paper's shape (landscape or portrait).

Minimal example:

<!doctype html>
<html lang="en"><meta charset="utf-8">
<style>body{font:12px Arial;padding:10px} td,th{border:1px solid #333;padding:2px} input{width:100%;border:0}</style>
<body>
<h2>Inspection · Cutting line</h2>
<label>W.O. <input name="wo"></label> <label>Date <input name="date" type="date"></label>
<table>
  <tr><th>#</th><th>Length</th><th>Defects</th></tr>
  <tr><td>1</td><td><input name="row1_length"></td><td><input name="row1_defects"></td></tr>
  <tr><td>2</td><td><input name="row2_length"></td><td><input name="row2_defects"></td></tr>
</table>
</body></html>

How it is used: on a computer, a click on the clipboard opens the page inside the proposal; in a headset or on a tablet, a phone opens …/FCA/?clipboard and every form in the scene appears there. What is typed shows on the paper for everyone in the scene. Without a page, fields = Name; Date; Notes... generates a plain form (... = multi-line). Full examples: docs/examples/clipboard-forms/ in the wrk-mgr repository.

6. Machine controls (Button_, Knob_, Joystick_)

  1. Name the control Button_Start or Knob_Pressure (a mesh, or an empty with the control's meshes under it).
  2. Create the action Play_Start / Play_Pressure with keyframes of the control and of what it moves: the button sinking and the piston rising; the knob turning and the needle following.
  3. Export.
ControlBehaviourProperties
Button_plays the action once when pressedmode = toggle: repeats until pressed again, then rests · mode = hold: runs forward while held, back on release · mode = latch: runs to the end and stays there (on) until pressed again, which runs it back (an emergency stop pushed in and pulled out) · plays = Play_Other to use another action
Knob_scrubs the action: start = minimum, end = maximum; turned by dragging, with the wheel, or in VR holding the trigger and raising/lowering the hand (or with the controller's thumbstick)steps = 5: fixed positions · value = 0.5: where it stands when the scene loads (a three-way selector starting in the middle) · plays
Joystick_two axes over Play_Name_X / Play_Name_Y (centre = the middle of the action); the stick tilts by itself; springs back on release; moved by dragging or, in VR, holding the trigger and using the controller's thumbstickmode = rate: the action runs while pushed and stays when let go (crane, boom) · speed = 0.5 · sticky = 1 · tilt = 20

A knob's action is one pose per value, no cycles. A hotspot is still the choice when the avatar should walk to the equipment and make a gesture.

A panel with several controls. One panel can carry several buttons, knobs and joysticks at once, of any kind. Each needs its own name and its own action (Button_Start + Play_Start, Button_Stop + Play_Stop, Joystick_Boom + Play_Boom_X / Play_Boom_Y): two controls on one action move together. Each control counts as one item of its station's task, Blender copies included (Button_Stop and Button_Stop.001 are two items). In VR each hand works its own control: the joystick in one, the hold button in the other.

What the machine does with several controls at once (both sticks to drive, the stick's button with the stick for the arm, a mode selector, an emergency stop) is described in the configuration file, in [conditions] and [functions.Name] (chapter 10.2). On a computer each control can have its keys (keys) to work two sticks at once.

7. The audit (/audit-showcase)

Checks the delivered file before importing it. The report arrives in chat as several messages: a summary, then findings by severity.

SeverityFindings
🛑 Blocking (do not import)linked_libraries_missing, image_has_no_pixels, images_not_packed, no_entry_points, reserved_loop_prefix, scene_scale_suspect
⚠️ Warning (something is missing)hotspot_without_clip, act_without_hotspot, single_entry_point, skybox_not_emissive, backdrop_not_emissive, sun_not_directional, focus_frames_nothing, screen_frame_unnumbered, screen_frames_misaligned, screen_single_frame, character_without_persona, character_voice_unknown, character_not_rigged, clipboard_without_fields, clipboard_not_a_mesh, clipboard_not_a_plane, collider_not_a_mesh, control_without_clip, control_not_a_mesh, mesh_without_material, names_with_stray_whitespace
💡 Notecutout_uses_alpha_blend, opaque_material_carries_alpha, avatar_idle_clip_missing, avatar_walk_clip_missing

Each finding comes with what it is and how to fix it, in the language of --es.

8. Full scene specification

Audience: 3D design team

Deliverable: one interactive scene per proposal, shown inside the client's interactive proposal

Format: .blend (Blender 4.x or 5.x up to 5.2, preferred) or .fbx — deliver the source file, we handle all export and optimization

What's new in v1.1

What you are building

The scene appears twice in the proposal, from the same file:

  1. Diorama — a tabletop-scale model at the center of the proposal gallery, like an architect's scale model. This is what the client sees first.
  2. Inside view — clicking the diorama puts the client inside the scene at full scale: standing at locations you define, seated at eye points you define (vehicle cab, control chair), or touring it as a character (Avatar) in third or first person. The AI presenter narrates while they explore.

Design for both scales. The scene must read as an attractive miniature from above AND hold up at eye level from every viewpoint you place. Detail what a standing person will look at; don't detail what nobody will ever be near.

Hard requirements

RuleDetail
UnitsReal-world meters. 1 Blender unit = 1 m. A door is ~2.1 m, a handrail ~1.0 m.
Transforms appliedAll object scales applied (Ctrl+A → All Transforms) before delivery.
MaterialsPrincipled BSDF only. Procedural textures baked to image textures, max 2048×2048, and at most ~24 texture images total — atlas repeated props. Texture memory is the scarcest resource on target devices.
AnimationKeyframed actions staged on NLA tracks. No physics sims, cloth, or particles — bake them to keyframes if needed.
Geometry budget≤ 600,000 triangles total (aim ~450k). Spend triangles where the client will be standing; the Avatar (~20–40k) counts inside the total.
Object budget≤ 150 meshes after joining (join everything that shares a material) and ≤ 25 unique materials. This budget decides frame rate more than triangles do — spend meshes and materials like money: a 600k-triangle scene in 120 meshes outperforms a 250k one in 600.
Self-containedPack all textures into the file (File → External Data → Pack Resources). No linked libraries. Packed file ≤ ~150 MB.

We compress everything (geometry and textures) after conversion — you do not need to optimize file size beyond the budgets above.

Naming conventions — how your scene talks to the viewer

The viewer reads object names and animation (action) names to know how to behave. Objects that don't match any convention below are ordinary scenery.

Station_NN_Name — standing viewpoints (empties)

A place a person can stand. Add one empty per location, positioned on the floor (we raise the camera to the avatar's measured eye height automatically, and a station that is not on its floor is reported by /audit-showcase instead of being silently moved). The empty's rotation sets the initial view direction (its +Y axis is "forward" — enable Display As: Arrows to see it).

Seat_Name — seated viewpoints (empties)

A locked, seated view: cockpit, crane cab, control chair. Position the empty at the exact eye point of the seated person (not the floor). The visitor can look around from there but cannot move.

Skybox — the sky (mesh, optional)

A large inverted sphere or dome, emissive material, equirectangular sky texture, surrounding the scene. Hidden while the scene is a diorama; revealed when the client steps inside. If you skip it, the viewer supplies a plain default sky — a real one is always better.

The sky image is wired to Emission, not Base Color. The viewer bakes the dome into an environment map inside a scene with no lights: a dome with its texture on Base Color bakes black and the whole scene goes dark (AER shipped this way). /audit-showcase reports it as skybox_not_emissive.

Loop_Name — ambient animation (action names)

Any action whose name starts with Loop_ plays automatically, forever, once the client is inside: Loop_FlareStack, Loop_Conveyor, Loop_Traffic. Make the first and last keyframes match so the loop is seamless.

Demo_Name — the first page's demo (action names, optional)

A training's first page (the player's module screen) shows the whole training area as a miniature: every station, seat and hotspot with the subject. Its walls and roof are cut 2.2 m above the highest floor the trainee stands on. What moves there is up to you:

In ALF the demolition demo is Demo_: the operator at the remote (Demo_Operador, Demo_Controles), the Brokk hammering the wall (Demo_Brokk_v3) and the wall's 50 pieces falling (Demo_Pared_Trozo_033_0…). TAC has no Demo_: its first page shows the avatar touring its five stations, using the micrometer and writing.

Avatar — the client's character (armature, optional)

A character the client "embodies" once inside: they can see it in third person (over-the-shoulder camera), look through its eyes in first person, or release it and fly free (drone mode, the current behavior). If the scene has no Avatar, the viewer works exactly as before — drone mode only.

Hotspot_Name — interactions (empties) — the name triad

A point where the client does something: open a valve, push a button, inspect a panel. An interaction is defined by up to three pieces that share exactly the same name:

PieceTypeRole
Hotspot_OpenValveempty in the sceneThe anchor (required): the exact position and orientation where a person would stand to do it, with +Y toward the equipment.
Play_OpenValvescene actionThe equipment side: the wheel turns, the panel lights up. It plays once when triggered and holds its last frame (an opened valve stays open; a prop the action hides at the end stays hidden). What shows before the trigger is the object's base pose: a prop that should exist only during the action has scale 0 as its base.
Act_OpenValveavatar clipThe human side: the reach-and-turn motion.

Viewer behavior: approaching (~2.5 m) surfaces the prompt; on trigger the avatar glides onto the anchor and Act_ + Play_ play together, then it returns to Idle. While the action plays, an inset shows up close what Play_ animates (the instrument, the valve): model the reading legibly and leave the animation on the value to be read. reading in the [Hotspot_Name] table of the configuration file (or a Blender note property) has the guide say the reading when done. That's why the anchor matters: place it exactly where the feet should be and the hand will land on the equipment. Without an avatar (or in drone mode), clicking the marker plays Play_ alone — hotspots work in every scene, avatar or not.

Focus_Name — the diorama's subject (object or empty, optional)

Tell the viewer what the diorama is showing. In the gallery the scene is a diorama: the viewer scales it so its largest extent measures about 4 m. When a scene needs far more surroundings than subject — FER's cab has windows front and back, so the rails and the floor must run a long way in both directions — the surroundings own that scale and the subject ends up tiny.

Icon_Camera — the module icon's view (camera, optional)

/gen-player renders the LMS module's icon from this file: a 1080 px square image, like the other modules' icons. Without a camera it frames the diorama's subject (Focus_, or the whole scene) from behind and above the first station, leaving out whatever stands between the camera and the subject (a railing, a cabin's panels). To choose the view yourself, add a camera named Icon_Camera: it is used as it is. The avatar, the Skybox (the sky is neutral, as in the diorama), Collider_ objects and the Navmesh never appear in the icon. The light is the viewer's: the file's Sun and a neutral sky that nothing but the subject blocks, so a subject inside a cabin stays lit.

Screen_Name_NN — screens with image sequences (meshes)

A monitor, tablet or kiosk that shows a series of images (the screens of a registration system, say). Model the screen as a plane carrying the first image and duplicate it in place once per image: Screen_Registration_01, Screen_Registration_02, … each copy with its own image in the material (wired to Emission, so it reads as a lit display under any lighting). The viewer shows only _01; a click, a tap or the VR trigger on the screen advances to the next image and wraps around after the last.

Display_Name — live display (mesh)

A monitor that shows a computer's screen live: the client's real software (their registration system, say) running while the client practises in front of the character. Model the monitor as a 16:9 plane with a full UV (the image fills the plane) and name it Display_Registration. Whatever material you give it is what shows while nobody is sharing.

Character_Name — people the client can talk to (empty or root)

A person in the scene the client practises a real voice conversation with: a guest at the reception desk, a customer at the counter. The character is not modelled in the scene: the operations team delivers it on the publish command, like the showcase:

/gen-proposal UNIT --publish --showcase <scene> --character <model> --persona <doc> --idle <clip> --talk <clip>

Your part in the scene is the spot: an empty (or any object) named Character_Name where the person stands, with the same Name as the persona doc, facing where the client will be. The viewer puts the delivered model there and hides the marker. Within ~2.5 m the prompt E — 💬 Name appears; E, a click or the VR trigger starts the conversation and the guide stays quiet; it ends with E again, another click, walking away (> 4 m) or the person saying goodbye, and the guide comments on how it went.

Clipboard_Name — forms the client fills in (mesh, optional)

A clipboard with a form the client fills in during the practice: a new-customer registration, an incident report, the plant's own inspection sheet. Model the clipboard as a plane with full UV, in the paper's shape (portrait or landscape), and name it Clipboard_Registration. The material you give it is what shows when nobody is in the scene; inside, the viewer draws the form with what is being typed.

Show_Name — objects the guide points out one by one (objects, optional)

For a station with several objects the guide explains one at a time — PPE on a table, tools on a bench — name each object Show_Name (Show_Helmet, Show_Nitrile_Gloves). While the guide talks about an object it glows orange; moving on to the next one turns the previous one off.

Navmesh — the surface to walk on (mesh, optional)

When the visitor goes to a station or an interactive point with a click, the character walks a path on the scene's Navmesh, around tables, railings and rollers instead of through them.

Add a mesh named Navmesh (or Navmesh_Plant, anything starting that way) with the walkable surface: aisles, platforms, ramps. The viewer hides it on load (never drawn, no shadow, not a stop) and builds a floor grid from it. Only Collider_ objects block cells above it: the rest of the scenery is not read, so give everything the visitor must walk around a Collider_. Between cells the path never climbs or drops more than a step.

Collider_Name — invisible stops for the visitor (meshes, optional)

The visitor collides with the scene's meshes (six horizontal rays, ankle to head). Where the geometry leaves gaps between those rays — a guardrail's bars, a railing, a cable, a very thin showcase — place a simple box or plane named Collider_Name (Collider_North_Rail) over the zone that must not be crossed. The viewer hides it on load: it is never drawn, casts no shadow, is not a floor and cannot be pointed at; only the visitor's steps feel it.

Door_Name and Open_Name — doors that open and are walked through (mesh or root, and an action, optional; v1.6)

A door is the object Door_Name (Door_Storeroom): the leaf as a mesh, or a root with the leaf under it. Its scene action Open_Name (Open_Storeroom) opens it: the viewer plays it forward to open and backward to close, and it holds its last frame.

Button_Name, Knob_Name and Joystick_Name — controls on a machine (meshes, optional)

Buttons, knobs, levers and gauges the client operates right on the equipment: press the start button and the conveyor runs; turn the pressure knob and the gauge needle follows. They need no anchor and no avatar: the client works them from wherever they stand, with a click, the headset trigger or a hand.

Lights

Your Skybox is the scene's main light. The viewer bakes it into an environment map (IBL), and that is where all ambient light and every metal reflection comes from. It is the same thing Blender's world does, and it is the biggest lever you have over how the scene looks. A well-exposed sky lights the scene well; a flat or dark one leaves everything dull.

The Sun decides where shadows fall. The viewer takes its direction and colour, not its intensity: Blender exports W/m² converted to lux and the viewer rescales again, so intensity does not survive the trip usefully. The viewer sets its own strength, calibrated against exposure. Aim the Sun how you want the shadows and ignore its Strength value.

The first Sun (directional light) in the scene is the one used; a second sun is not switched on. Point and spot lamps are: in the player, inside the scene at full size, every one you place lights at the strength you gave it (in the miniature they are off, since that close they would burn it out). For an interior they are the light that counts: light it the way you want it to look.

It has to be a Sun-type lamp: a Point or Area light named "Sun" does not count (AER shipped a 17.8-million-candela point and the viewer ignored it — no sun direction, no authored shadows). /audit-showcase reports it as sun_not_directional.

The ground must not set the diorama scale. In the gallery the scene is shown as a diorama: the viewer scales the scene's largest extent (Skybox and Avatar excluded) to 4 m. A ground plane or apron much larger than the subject becomes the whole diorama and the subject turns tiny (AER's airliner rendered 0.8 m on a 185 m apron). Trim the ground to the walkable area, or — when the scene needs those surroundings, like rails that must look long from the cab — name the subject Focus_Name and the ground stops counting. /audit-showcase reports it as diorama_fit_dominated.

Until 2026-08-14 this section claimed every light lit the inside view. It did not: the converter never exported them. Fixed.

The stations are the tasks (nothing new to name)

The visit is not a stroll: it is a task exercise, and the tasks are your Station_NN_Name (then the Seat_) in their order. Nothing has to be added:

The guide asks for one task at a time, on arrival teaches the station and says what to do there, confirms each task done, hints when the visitor gets stuck and closes the exercise with brief feedback. A checklist on screen shows the tasks, done ones struck through; they can be done in any order.

After each task the guide asks two questions about the station (only about what she taught on arrival; the lesson comes from the scene configuration file and the material) and grades the answers. At the end, the exam: the whole exercise again, alone, in order, with no markers and no checklist; the guide stays silent until the close. None of this is named in Blender.

How the viewer uses your scene

Delivery and feedback

Deliver the file the same way as any showcase model (Drive link to the operations team). The publish pipeline validates the scene automatically and reports problems by name in the chat card — e.g. "Station_03 sits 4.2 m above the ground — stations belong on the floor" or "scene is 17 m wide but declares walkable stations — rescale to meters." Fix and re-deliver; re-publishing is cheap and the model is reconverted only when the file actually changes.

Before anything is imported, the operations team can ask for a check with /audit-showcase <drive link>: it opens your file without converting or publishing it and answers in chat with what it found — missing linked libraries, images Blender could not load, hidden objects that would never reach the export, clip names outside the conventions, the scene budgets, and since September 2026 also whether the Sun is directional, whether the Skybox is emissive, and which object sets the diorama scale. If something is off you hear about it in minutes, without touching the client's proposal. The card shows the first six affected items of each finding; the full report (every texture with its size and the materials using it, hidden objects, stations against their floor) is at the link at the end of the card.

Two cases are rejected outright, because the client would open an empty scene: a file with no geometry (what a master file whose linked libraries were not delivered with it produces) and a texture with no pixels (an image whose file Blender could not load). The message names the objects that did arrive, or the materials affected.

Pre-delivery checklist

9. For developers

10. The scene configuration file

It is the proposal's own file. Everything below applies to the player; what only the player uses is in 10.4 and 10.5.

One file per unit, in TOML, in the unit's Drive sources, whose name contains scene config or configuración de la escena (case and accents ignored). It is read at publish and on every /gen-proposal CODE --showcase. It holds three things: the exercise's settings (the same ones in the tuning panel), one table per scene object under its exact Blender name, and the guide's instructions. The former "scene topics" document no longer exists.

How it combines with the panel (Ctrl+Shift+K): the file is the baseline; whatever is saved in the panel sits on top, per unit. A long value (an instruction) is edited with the … button in a large box. The object tables appear in the panel as the Scene objects group and can be corrected and saved there too.

[quiz]
perStation = 2
passMark = 0.7

[tasks]

[prompts.rubric]
text = "..."

[scene]
welcome = "Bienvenido a la línea de inspección."

[Station_01_Placa]
task = "Revisa la placa: estencilado, medidas y espesor"
topic = "Qué se verifica en la placa y por qué importa"
description = "The plate table at the mill entrance: the plate on the rollers, the 0-1\" micrometer, the tapes and the F-TUAC-022 report on its clipboard"
questions = [["¿Qué datos del estencilado verificas?", "colada, proveedor y grado"], ["¿Con qué mides el espesor?", "con el micrómetro"]]

[Hotspot_Micrometer]
action = "Mide el espesor de la placa con el micrómetro"
reading = "12.50 mm"

[Clipboard_Inspeccion]
instructions = "Captura la colada y el espesor medido"
[Clipboard_Inspeccion.expected]
Espesor = "12.50"

[Show_Balde_De_Pintura]
note = "Pintura de marcado para identificar la placa aprobada"

10.1 Settings

One table per panel group; the keys are the panel's, nested as tables or dotted (card.radius = "14px"). Default in parentheses.

[render] — Render resolution

KeyDefaultWhat it does
maxPixelRatio2Device pixels per CSS pixel in the gallery (cap).
walkMaxPixelRatio1The same cap inside the scene; 0.5 doubles the frame rate at the cost of sharpness.
powerPreference"high-performance"Asks a two-GPU laptop for the discrete one (applies on reload).

[video] — Presenter video (Kira)

KeyDefaultWhat it does
layout.widthShare0.17Card width as a share of the window.
layout.minWidth132Minimum width in px.
layout.maxWidth288Maximum width in px.
layout.aspect0.76Width/height ratio of the card.
layout.margin16Margin to the edge, px.
layout.zoom1Scale of the video inside the card.
layout.focusY0Vertical framing point, 0–100 (0 = head at the top).
fade.hold3Seconds the card stays after she speaks.
fade.fadeIn0.35Fade-in seconds.
fade.fadeOut0.6Fade-out seconds.
servo.intervalMs30How often playback is corrected, ms.
servo.onset.minLag / cushion0.5 / 0.3At speech onset: the minimum lag before a snap to the live edge, and the cushion it snaps to, s.
servo.speaking.minLag / cushion / fromMs / untilMs0.6 / 0.3 / 40 / 200While speaking: one snap allowed between fromMs and untilMs after onset.
servo.idle.minLag / cushion1.5 / 0.3When idle: the leash that keeps the video from falling behind.
trim.after / behind / keep25 / 20 / 15Buffer trimming: every how many seconds, how far behind, how much to keep.
codecs.native / baselineavc1.42c01f… / avc1.42E01E…MIME types of the stream (leave alone).
card.radius"0px"Corner radius of the card (CSS).
card.edge"1px solid var(--tb-line)"Card border (CSS).

[caption] — Captions

KeyDefaultWhat it does
holdAfterTurnMs2500Ms the caption stays after her turn, inside the scene.
maxChars360Characters shown (cut at a sentence start).
markdowntrueRender the model's bold as bold.
maxAgeMs20000Inside the scene the caption also clears this long after its last words, even if the turn never closed.
strayTokens["stdin"]Stray model tokens removed from the caption.
strayPatterns["response:…"]Regular expressions for what the model leaks into its words and must never be captioned (e.g. a tool result).

[presenter] — 3D presenter animations (Camila)

KeyDefaultWhat it does
idle / talk / talkAlternate""Clip names to use; empty = the model's.
swapSeconds9Seconds between alternating talk clips.
crossfade.talkSwap / toTalk / toIdle / fadeOut0.6 / 0.35 / 0.45 / 0.6Crossfade seconds between clips.
clips""Fixed clip list (e.g. "Idle").

[lighting] — Gallery lighting

KeyDefaultWhat it does
toneExposure0.85ACES exposure.
envIntensity0.9Image-based lighting strength.
key.intensity / key.position2.0 / [3, 6, 4]Main key light.
fill.intensity / fill.position / fill.color0.45 / [-4, 2.5, 5] / 0xbfd0e0Fill light.
hemi.intensity / hemi.sky / hemi.ground1.0 / 0xdde7df / 0x37352fSky/ground ambient.
rim.intensity / distance / decay / position8 / 24 / 2 / [0, 3.4, -4]Rim light.

[face] — 3D presenter face

KeyDefaultWhat it does
roles.*nombres de morphWhich model morph plays each role (jaw, open, wide, smileL…).
visemes.*pesosMorph mix per viseme (AA, EE, IH…). Advanced.

[guide] — Guide inside the scene

KeyDefaultWhat it does
gazeSilenttrueOn a tour, gaze is silent context, not a cue to speak.
turnStallMs12000Her turn with no audio for this long = closed (stalled model).
lessonStallMs45000The same while she teaches a lesson (the model pauses longer between its parts).
resumeAfterMs3000If a lesson is interrupted and no words of the client are heard within this time, it was a noise: the guide resumes the lesson from the slide on screen.
describeFormsfalseWhen a sheet opens, the guide explains it aloud (the clipboardOpen instruction). Off, she only learns silently which sheet was opened and can answer about it. While she speaks nothing can be walked to or worked (turning and looking around still work), but a sheet always opens, and nothing is held during a conversation with a character.
clickSkipsLessontrueWhile she speaks, a click on another station's marker (in VR, the trigger pointed at the marker) quiets her and goes there. If she was teaching a lesson, the station left stays untaught and not done: the trainee has to come back, and the lesson starts over then; work on it from a distance does not count until they do. While she asks a check question, and in the exam, the click waits. Off, the click always waits for her to finish.

[gaze] — Visitor gaze (the tour only: the task exercise never uses gaze)

KeyDefaultWhat it does
enabledtrueMeasure where the visitor looks, on a tour.
tickSeconds0.5How often it is measured.
coneDegrees8Gaze cone.
minDistance / maxDistance2.5 / 12Valid distances, m.
dwellSeconds5Seconds still on something to count.
stillMove / stillTurnDegrees0.15 / 4What counts as still (m, degrees per tick).

[tasks] — Task exercise

KeyDefaultWhat it does
enabledtrueOff = narrated tour, no checklist.
requireInteractionstrueA task requires arriving and doing everything at the station; off = arrival alone.
stuckSeconds60No progress for this long = a one-line check-in (once per task).
checkEveryMs5000How often the stuck clock is checked.
maxTextChars160Maximum length of a task's text.
summaryValuesChars300Characters of form answers quoted to the guide.
startScreentrueStart screen when the exercise begins: the welcome line, the tasks in order and the controls; the guide waits until it closes.
startScreenSeconds180It closes by itself after this long (or on a click anywhere).
startLoadMaxS20How long at most the start screen waits for the material (the infographics) to preload before showing "Click anywhere to begin".
startMusic"industrial"The music while it is open: industrial (the default) or office (corporate); none = no music.
startMusicVolume0.5Its volume, 0–1.
startMusicFadeS1Fade-out seconds when it closes.

[quiz] — Assessment: checks and exam

KeyDefaultWhat it does
enabledtrueQuestions after each task.
perStation2Questions per station when the file gives no questions.
examtrueFinal exam: the stations marked exam = true again, alone, in order. With none marked there is no exam: the checks give the final score.
passMark0.7Minimum (0–1) to pass a check and the exam.
checksCounttrueThe checks' average must reach passMark too for the exam to pass; off, the practical alone decides.
nudgeSeconds45No grade for this long = one reminder to the guide.
answerSeconds180No answer for this long = the question scores 0 and the check moves on.
clockTickMs5000How often the exam's minutes are refreshed (and the caption's age checked).
musictrueSuccess or failure music while the report is open; the report (and its music) opens once the guide has finished her closing words, not over them.
musicVolume0.5Its volume, 0–1.
musicFadeS2Fade-out seconds when the report closes, on restart or on exit.
musicDuck0.25While the guide speaks, any music (the start screen's, the outcome's) drops to this fraction of its volume and comes back after.
musicDuckS0.4Seconds of that drop and of the return.
musicSuccess"assets/music/exam-success.mp3"The success track (path relative to the unit's page; empty = a synthesized phrase).
musicFailure"assets/music/exam-failure.mp3"The failure track (same).

[sound] — Sound

KeyDefaultWhat it does
muteKey"KeyX"Key that mutes or unmutes all sound (her voice and the music), like the dialog's speaker icon; inactive while typing.

[mic] — Microphone while she speaks

KeyDefaultWhat it does
level0.025Output level that counts as her voice.
tailMs400Ms the mic stays closed after her voice.
wholeTurntrueClosed for her whole turn, not only while sound plays.
turnMaxMs90000Cap on that, in case a turn never ends.

[listen] — Microphone: when she listens

KeyDefaultWhat it does
windowstrueInside the scene the mic opens only when she listens.
windowMs8000Window open after each of her turns.
heardExtendMs6000Extension while the relay hears speech.
holdKey"KeyM"Key that opens the mic while held.
vrHoldButton4In the VR headset, the controller button that opens the mic while held (WebXR standard gamepad index: 4 = A on the right hand, X on the left).
vrCheckOpentrueIn the VR headset, while a check question waits for its answer, she listens between her turns (there is nowhere to type); her own turn stays closed.

[show] — Glow of the objects she names

KeyDefaultWhat it does
eachS2Seconds each named object glows.
videoLeadMs1200With the video presenter: wait before lighting (text arrives before the voice).

[markers] — Markers

KeyDefaultWhat it does
riseRatio0.6How high a station's marker floats over eye level, as a fraction of the visitor's stature (0.2 left it across the shelves and in front of the hotspots).
hotspotRiseRatio0.2The same for a hotspot's icon, measured over the floor plus the stature.
ceilingMarginRatio0.1Under a ceiling, markers stay this fraction of the stature below it.

[actpip] — Action close-up

KeyDefaultWhat it does
enabledtrueShow the inset during an action.
widthShare / minWidth / maxWidth / aspect / margin0.3 / 220 / 520 / 1.5 / 16Size and placement of the inset.
frame"equipment"equipment frames what Play_ animates; body frames the character.
equipmentFill / equipmentMinDistance / equipmentSide / equipmentAbove0.6 / 0.35 / 0.6 / 0.45Instrument framing: fill, minimum distance, swing toward the character's right, elevation.
side / above / lookHeight / reach / fov1.9 / 0.2 / 0.7 / 0.45 / 38Character framing (body mode): side offset, elevation, look height, forward offset, field of view.

[nav] — Navigation (paths)

KeyDefaultWhat it does
enabledtrueWith a Navmesh in the scene, a click on a station or a point walks a path around the Collider_ objects; off (or no Navmesh) = a straight line.
cellM0.25Cell size of the grid over the Navmesh, m.
maxStepM0.35What rises less than this above the floor is a step, not a wall.
headroomM1.7The visitor's height: anything lower in the cell blocks it.
radiusM0.35The visitor's half-width: blocked cells grow by it.
margin2Metres of grid beyond the Navmesh's footprint.
budgetMs6Milliseconds per frame spent building the grid on entry.
maxCells200000A larger Navmesh gets coarser cells.
speedMps2.2Walking speed along the path, m/s.
minHopS / maxHopS0.5 / 8Shortest and longest hop, s.
snapM1.5How far an endpoint may move onto a walkable cell, m.
navmeshPrefix"Navmesh"Prefix of the Blender object with the walkable surface (see the scene spec).

[characters] — Characters: action paths

For characters with a path (see [Character_Name] in 10.2).

KeyDefaultWhat it does
walkSpeed1.2How fast a character walks its path, m/s.
walkClipSpeed1.4The pace the walk animation is authored at; it plays at walkSpeed / walkClipSpeed so the feet do not slide.
turnSpeed4Radians per second it turns (toward the way ahead, the chair, the visitor).
fadeS0.35Seconds one animation blends into the next.
occupyM0.6A character within this of a station's spot is still on it, m.
besideM0.8When the character has not cleared the station the visitor chose, the visitor stops this far to one side, m.
occupied"leave"What a station that does not say occupied means: "leave" or "inactive".
sitDown / seated / standUp"Sentarse" / "Trabajar" / "Levantarse"Names of the sit-down, seated-work (looping) and stand-up animations; found like an act's.
lowerBody`"Hip\Pelvis\Thigh\Calf\Knee\Foot\Toe"`Bones (a pattern on their names) that stay with the chair while a seated character talks; the talk animation moves the rest.
walkSrc / walkClip/avatar-assets/shared/cc-animations-meshopt.glb / "Avatar_Walk"The shared walk (a man's).
walkFemaleSrc / walkFemaleClip/avatar-assets/shared/cc-walk-female-meshopt.glb / "Walk_F"The shared walk of a character whose gender is female. A walk delivered with the character wins over both.

[lessons] — Station lessons

At publish the system writes one lesson per station from the proposal's material and the scene configuration: title, objective, every key point and step the material gives (no cap), safety, the check questions with their answers, and a board of slides (up to slides): each slide has a title, a few labels carrying the figures and an infographic generated with the image provider and model of [lessons]. Every infographic of the unit gets the same reference images: the client's material images (its documents' figures and its photos), in their order, up to referenceImages; when the material has no images none are sent and the infographic is drawn from its description. The guide teaches the whole lesson on arrival, slide by slide, naming each one ("Slide 2: …"); when she names one, its infographic appears alone on screen (no frame, title or controls), stays showSeconds or until she names another, and fades out; the checklist's Lesson button has her teach it all again from the start (it does not mark, complete or check it again; choosing another station meanwhile only quiets her). Without infographics (drawing them is off by default: each one is paid) there is no board and the lesson never mentions slides: the guide teaches the same parts, one per turn, each by its topic. The microphone is closed for the whole lesson: nothing interrupts it until it ends. The check questions come from that same lesson (unless the station's table carries questions). The lesson is rewritten only when the material, the configuration or the scene changes. An infographic is drawn only when its slide has none, or when the publish command names it with --redraw: never by itself, not because the slide's text, the style, the provider or the model changed (every image is paid for).

KeyDefaultWhat it does
enabledtrueWrite a lesson per station at publish.
imagesfalseDraw the infographics the slides still lack. Off unless turned on here (each image is paid). Pictures already drawn are always kept and shown; --redraw redraws what it names even when off.
words150Words at most in the lesson text (the scripts of all slides together), about the station only; the questions come from that text alone.
slides4Slides per station at most.
imageProvider"openai"Image provider for the infographics (openai, gemini, bfl).
imageModel"gpt-image-2.5-sunburst"That provider's model for the infographics.
referenceImages4How many images of the material go as references with each infographic (the same for all).
questions2Check questions per lesson; the written bank holds questionBank times this many and the page picks [quiz] perStation of them at random on each check (a replay does not repeat the questions).
questionBank2How many times questions the lesson's question bank holds. Each question tests one concrete fact of the scripts (a value, tolerance, tool, document, criterion, step order); the lesson may write fewer than the bank rather than pad, and questions that answer themselves, that the station's name answers, or that another station already asks are dropped.
sourceChars60000How much of the material each lesson sees.
boardtrueShow the lesson's infographics on screen.
autoOpentrueArm them by itself on reaching the station (they appear when the guide names them).
showSeconds120Seconds an infographic stays on screen unless the guide names another.
fadeMs600Milliseconds of the fade in and out (on a change the old picture fades out before the new one fades in).
holdAfterTurnS8Seconds the last infographic stays on screen after the guide finishes the lesson.
preloadParallel2How many infographics download at once on entry (all at once left the intro music waiting).
turnPerSlidetrueThe lesson goes one slide per turn: the page sends slide 1, when that turn ends slide 2, and so on; each infographic appears as its own turn's audio starts. Off, the whole lesson goes in one turn (the model cuts it at ~170 s of audio).
cueWords["lámina", "lamina", "slide"]Words with which the guide names a slide and its number so the board turns.

[telemetry] — Telemetry

KeyDefaultWhat it does
enabledtrueThe page sends its log (decisions, errors, settings, marks) to the session's log on the server.
perftrueAlso times every frame (CPU per section, GPU, slow frames, long tasks); turn off when not measuring.
flushMs2000How often a batch goes.
maxBatch60Entries per batch.
maxBuffer600Entries kept while disconnected (oldest dropped).
maxChars500A message's maximum length.
errorsPerMinute20Console errors kept per minute.
markKey"KeyL"Ctrl+Shift+this key copies the session id and marks the moment in the log.
longTaskMs50The browser's long-task threshold (informational).

[prompts] — Instructions to the guide

Each key is a table with es and en (the instruction in each language); {n} is a number the page fills in. rubric and protocolExtra carry text only.

KeyMoment
enterTourwelcome to the tour (no tasks)
enterExercisewelcome to the task exercise
enterStationwelcome when the client spawns on the first task's station: greets and teaches it ({n} = sentences)
vrwelcome into the VR headset
arthe model in augmented reality
arExercisethe character practice in AR
stationarrival at a station (tour)
stationReachedarrival at a task's station with no written lesson: improvises one ({n} = sentences)
stationLessonarrival at a task's station with a written lesson: teaches it in full
lessonResumea lesson interrupted by a noise: picks it up where it left off
lessonSkippedanother station was chosen during a lesson: she stops, the station stays untaught and is taught again on return; only with [guide] clickSkipsLesson
enterLessonSlidewelcome on the first task's station with turnPerSlide: a one-sentence greeting and slide 1 only
lessonSlideFirstarrival at a station with a lesson and turnPerSlide: slide 1 only
lessonSlideNextevery following slide of the lesson (and the current one again after a noise interruption)
lessonSlideResumethe current slide, picked up where a typed question cut it off
typedQuestionwhat the client types in the dialog: a short answer, no question at the end. While a check question waits for its answer, what is typed in the dialog is the answer (as in the question's card) and goes as written, without this instruction
enterLessonwelcome when the client spawns on the first task's station and it has a written lesson
taskDonetask done, ask for the next
lastTaskDonelast task done, closing (no exam)
checkOpenopen the check: confirm and ask question 1 ({n} = questions)
checkNextnext question, after teaching the previous answer
checkDoneNextcheck finished, next task
checkDoneLastlast check finished with some question missed: final result and the study plan the page builds from the slides (per missed question: the slide that teaches it, quoted, and what to do in the scene); she says it point by point
checkDoneLastCleanlast check finished with no question missed: final result and a congratulation, no study plan
checkStuckreminder: grade or repeat
examStartexam announcement
examDoneclosing with the exam result and the page's study plan, when some question was missed
examDoneCleanclosing with the exam result and no study plan: no question missed
checkIncheck-in after inactivity
actwhat the client is doing at a point
actDoneaction finished
showClickdescribe an object on click
clipboardOpensheet opened: teaches it in depth (what for, each field and where its data comes from, what happens to it); only with [guide] describeForms
formUnfilledsheet closed empty
commentbrief comment (other events)
talkDebrieffeedback after a character conversation
awarenessprefix of silent contexts
rubrictext: the grading rubric
protocolExtratext: an addition to the guide's protocol

[controls] — Control panel: keys and functions

KeyDefaultWhat it does
functionDoneS1Seconds a machine function must stay active to count as done.
keyDeflectPerS3How fast a stick worked by keys reaches full deflection (per second).
keyReturnPerS4How fast it springs back when the keys are let go (unless sticky).
knobKeyPerS0.5Share of a knob's range its held key turns per second; a knob with steps moves one position per press.

10.2 Scene objects

One table per object, under the exact Blender object name ([Station_01_Placa], [Hotspot_Micrometer], ["Show_Balde_De_Pintura"]): that is how they match. The keys depend on the prefix. A name with accents or spaces is written as it is, with or without quotes ([Show_Tapones_Para_Oídos], [Station_03_Mesa de herramientas]).

[Station_NN_Name / Seat_Name]

KeyWhat it does
taskthe station's task: what the checklist shows and what she asks for
topicthe topic she teaches on arrival
descriptionthe station itself in 2-3 sentences: the place, the equipment, instruments and documents there and what the learner sees; it is the setting of every slide of the lesson and she says it on arrival. Without it the scene's facts are used (the station's number and name, the objects that stand at it and its Blender note); a model never invents one.
questionslist of ["question", "expected answer"] pairs; with it she asks exactly those, in order
imagestrue or false: false leaves the station with no infographics (not even drawn ones); true draws the ones it lacks even when [lessons] images is off; without the key [lessons] images rules
examtrue or false (default false): the station is part of the final exam; with no station set to true there is no exam and the checks give the score
occupied"leave" or "inactive" (default [characters] occupied, "leave"): what happens when the visitor chooses the station while a character is on it. "leave": the character moves on (stands up if seated and goes on from its next walk); if it has not cleared the spot when the visitor arrives, the visitor stops to one side and it still counts as arriving. "inactive": while the character is there the station cannot be used: its marker is grey and takes no click, and walking up to it does not count (no lesson, no task) until the character leaves on its own path.

[Character_Name]

KeyWhat it does
notewhat she says about the character when it is named or talked to
pathits action path: steps it repeats in order while the visitor is inside the scene (below)
[Character_Alejandra]
path = [
  { act = "Saludar" },        # an animation, once
  { walk = "Archivo" },       # walk to that station along the Navmesh
  { act = "Buscar" },
  { walk = "Escritorio" },
  { sit = true },             # sit, facing the way the station's empty faces
  { work = [20, 60] },        # hold what it is doing (seated work, or idle standing) 20 to 60 s
  { stand = true },           # get up
]

[Hotspot_Name]

KeyWhat it does
actionwhat the client does when working it (said at the start)
readingthe instrument's reading; said when the action completes
noteanything else to say on completion

[Clipboard_Name]

KeyWhat it does
instructionswhat she says when the sheet opens
expectedtable of field = expected value, for her to judge the sheet

[Show_ / Screen_ / Button_ / Knob_ / Joystick_]

KeyWhat it does
notewhat she says about the object when named or clicked
keyscontrols only: the keys that work it on a computer. A joystick takes four (up, left, down, right: "ijkl"), a knob two (down, up: "zx"), a button one ("p"). They work only at the control's station with no card open; the arrows, E, V and the space bar belong to the scene and cannot be used.
labelcontrols only: the short name the remote prints beside the control ("S1", "B2.RL"). The viewer shows it floating beside the control, with a line to it (see "The panel's close-up and labels" below). A control without a label gets none.

[scene]

KeyWhat it does
welcomeher first sentence on entry, as written

The tables only the training player uses ([module.*], title in [scene]) and the /gen-player findings are in the player's documentation.

Without a table for an object, the page uses the object's Blender note property if present, else its name. Everything in a table also reaches the guide as text, so she can answer questions about it.

Machine functions: [conditions] and [functions.Name]

On a real machine, what the machine does comes from several controls at once: both sticks up drives the tracks; the right stick's button held with the stick forward moves the arm; the regulator sets the hammer's power. Each control moves its own Play_ action (the control itself, the operator's hand); what the machine does is described here, one table per function.

[conditions]
ready = ["Button_S0 off", "Button_S1 on"]

[functions.Drive_forward]
label = "Drive forward on the tracks"
when = ["ready", "Joystick_Turret.y > 0.2", "Joystick_Boom.y > 0.2"]
plays = "Play_Tracks_Machine"
follows = "Joystick_Turret.y"

[functions.Regulated_hammer]
label = "Hammer at regulated power"
when = ["ready", "Button_Hammer held", "Knob_R1 > 0"]
plays = "Play_Hammer_Machine"
speed_from = "Knob_R1"

[functions.Drive_both_tracks]
label = "Drive forward on both tracks"
when = ["ready", "Knob_S5.step = 0", "Button_B1LR held", "Button_B2RL held"]
plays = ["Play_Track_Left_Machine", "Play_Track_Right_Machine"]
drive = 1

Conditions (in when and in [conditions]): the name of a [conditions] set, or a control with its test:

ConditionHolds when
Button_X on / Button_X offthe button is on (mode = toggle) or held; or not
Button_X heldthe button is held down (mode = hold)
Button_Xon or held
Knob_X > 0.5the knob is past halfway (0 = minimum, 1 = maximum)
Knob_X.step = 2the knob with steps is at position 2 (0 = the first): a selector
Joystick_X.y > 0.2the stick pushed forward (.y: −1 back, 1 forward; .x: −1 left, 1 right)

Comparisons: >, <, >=, <=, =. not in front negates a control condition. The function is active while all hold. Control names are written as in Blender, without spaces.

KeyWhat it does
whenlist of conditions (required)
playsthe machine's Play_ action it moves, or a list of actions moved together (both tracks): ["Play_Track_Left_Machine", "Play_Track_Right_Machine"] (required)
followsa stick axis (Joystick_X.y) or knob: the action runs at that value × speed per second, backwards when negative; half-pushed, at half speed
drivewithout follows or mode: a number from −1 to 1 (not 0); while the function is active the action runs at that value × speed per second, backwards when negative. It is a function a button moves: on the Brokk, with S5 up, B1.LR drives both tracks forward (drive = 1) and B1.LL back (drive = -1). An action keeps one position, whether a stick or a button moves it
speedshare of the action per second at full push (default the Joystick_'s: 0.5)
speed_froma knob or stick axis that scales the speed (the regulator). While it is at zero the function moves nothing and does not count as done.
modewithout follows: loop (default) repeats the action while active; once plays it each time it becomes active; hold runs it forward while active and back after
restwhere along the action the machine stands at rest, from 0 (start) to 1 (end). Default: the middle when a stick or a drive moves it (it goes both ways, like the stick's own actions), else the start
traveltrue, with follows or drive: the action carries the whole machine (it moves only the root of its rig, as the Brokk's tracks do) and the machine goes as far as it is driven, from wherever it stands, instead of stopping at the action's end. A wall or other solid stops it, or a person (the visitor or a character) within 45 cm. The Collider_ round the machine's root travels with it and is its footprint; restarting the exercise puts the machine back
labelthe function's name in the task list and to the guide
notewhat the guide knows about it
stationthe station it belongs to (default: the station of the first control in when). Several stations at one place (within 25 cm) are several tasks done there in order without walking; a fixed control's keys (a plug) work at the station of its place and at those whose functions or states read it

Each function is an item of its station's task: done once it stays active for [controls] functionDoneS seconds. At a station with functions, the controls are no longer items of their own nor news to the guide: the task is what the machine does. The controls' actions should move only the control (and the operator's hand); the machine's movement goes in the actions the functions name.

Function actions add up. As the scene loads, the viewer stands the machine at each action's rest pose (rest), and each active function adds how far its action moves away from that pose. That way both sticks at once move the boom and the arm fully, even though Blender exports every bone of the arm in each action and the hoses move in several actions. Played whole, each action would hold at rest what the other moves, and the viewer would average them to half. The same goes for a stick's two axes, which add up from the centre.

Machine states ([states.Name]): what the machine remembers, such as the control unit switched on, the motor running or the control circuit made.

[states.on]
label = "Switch the control unit on"
set = ["Button_S1 held"]
clear = ["Button_S0 on"]

[states.circuit]
label = "Make the control circuit"
set = ["on", "Button_Reach held"]
clear = ["not on"]
idle_s = 3

A state turns on while all its set conditions hold and off while all its clear conditions hold (when both hold, it turns off). With idle_s it turns off by itself after that many seconds with no function active: the Brokk's circuit drops after 3 s and the stick's button makes it again. With hold_s it turns on only once its set conditions have held that many seconds without a break: the Brokk's main switch Q1, 3 s at 0 before the other phase. With while it can only be on while all those conditions hold: the motor, while the unit is on and the machine has power (clear needs all its conditions at once, so it could not stop it on either one). With last = true, a state with a label is listed after the functions: disconnecting comes last. With initial = true it starts on. A condition names a state the way it names a [conditions] set (on, not circuit). A state with a label is also a task item: it counts the first time it turns on and comes before the functions in the list, because the start-up comes first. It also takes note and station.

Indicators ([indicators.Name]): a light on the model, the mesh Indicator_Name (or another that node names). Each colour (green, yellow, red, orange, blue, white) lists the conditions that light it; the first that holds wins, and when none holds the light keeps its own material.

[indicators.LED2]
green = ["circuit"]
yellow = ["on", "not circuit"]

A display shows words while it is lit: its text table pairs a condition (a state, a [conditions] set, or a control's condition, quoted) with what the display says at that moment. The first that holds wins; when none holds, the display only glows. \n separates the lines. The words are drawn as a backlit screen, the lit colour behind and the letters dark. The mesh needs a full UV (the image fills the display) with the top of the display at the top and its left at the left, as its user sees it; a mirrored UV shows the words backwards.

[indicators.Display]
green = ["on"]

[indicators.Display.text]
motor = "+23°C   20 bar\n102 h"
on = "BROKK\nStart Engine"

Instead of words, a text entry may be a screen laid out like the machine's own, as an inline table:

[indicators.Display.text]
motor = { lines = ["+23°C  20 Bar", "102 h"], left = "battery 4/4", right = "signal 4/4", mark = "lubrication" }
on = { logo = "BROKK", lines = ["START ENGINE", "(I)  (M)"] }
KeyWhat it draws
logoa word set large, bold and underlined at the top (the brand)
linesthe lines, centred below
left / righta bar gauge along that edge with its symbol at the foot: "symbol level/of" (on the Brokk, the battery and the radio signal, 0 to 4 bars)
topa horizontal gauge along the top, its symbol at the start (the oil level, say)
marka symbol after the last line (the hammer's lubrication, say)

Symbols: battery, signal, oil, lubrication, service. Everything is drawn in the dark ink on the lit colour. The page draws the screen itself: no image is needed.

An indicator also takes note (what the guide knows about it) and label, its short name ("LED2"), shown beside it as a control's is. The machine's own lights (its work lamps) are indicators too: an Indicator_Lights mesh lit white with the motor.

The panel's close-up and labels

While the visitor works a panel (they are at its controls' station and no card is open):

10.3 Findings at publish

FindingMeaning
scene_config_missingno configuration file among the sources
scene_config_invalid_tomlthe file is not valid TOML (ignored whole)
scene_config_unknown_objecta table whose name is neither a settings group nor an object with a known prefix
scene_config_unknown_keya key that table type does not accept
scene_config_bad_valuea value of the wrong type
scene_config_stray_valuea loose value outside any table
scene_config_bad_path_stepa path step that is not act, walk, sit, work or stand
scene_config_bad_conditiona when or [conditions] condition that does not follow the condition table's form (the function is ignored)
character_path_unknown_stationa walk names a station the scene does not have
character_path_act_no_clipan act with no animation (none delivered, no Act_ in the scene, none imported)
character_path_no_sit_clipsa sit without the sitting animations: the character stays standing
character_path_no_navmesha path with walk in a scene with no Navmesh: it walks straight, through whatever is in the way
character_path_no_charactera [Character_…] with a path but no character delivered

10.4 Player only

/gen-player reads the file from con-mgr (DEMO); the first time it takes it from Drive and stores it there.

[scene], besides welcome:

KeyWhat it does
titlethe training's name: the player page's title and the report's (/gen-player). Without it, the unit's latest proposal title.

[module.CODE] and [module.CODE.exercise.CODE] (/gen-player only)

The unit's LMS modules, which /gen-player creates in DEMO when they do not exist (flow-mgr docs/player.md; chapter 3). There may be several, in the file's order. The table's name is the module's code: two letters (OB) or the unit code and two letters (ALFOB). Each module may define its own exercises; their order in the file is the LMS sequence. A module without exercises gets the three standard ones: TU "Tutorial", TE "Revisión Teórica" and PR "Práctica".

[module.OB]
name = "Operación del Brokk 170"

[module.OB.exercise.TU]
summary = "Aprende a moverte por la escena y a usar el control remoto."

[module.OB.exercise.DM]
name = "Demolición de muro"
simulation = true
task_stations = ["Pared", "Control remoto"]
KeyWhat it does
name (module)the module's name in the LMS. Without it, a model writes one from the training material; when the file defines several modules, each needs its own.
name (exercise)the exercise's name. Optional for TU, TE and PR, which use the standard one; required for any other code.
summarythe exercise's one-line description, shown by the LMS loading screen and the module menu. Without it, the model writes one from the material.
simulationtrue puts the exercise in the practical stage of the module exam. Default: PR only.
task_stationsthe stations that are the exercise's tasks, by the names a character's walk uses (Locker is Station_02_Locker), in scene order. Each exercise lists its own, so exercises can have different stations. A station no exercise lists is only for characters: no task, no marker, and no object is assigned to it (objects go to the nearest listed station). Without the list, every station is a task. The module exam uses the practice's.

Without [module.*] tables, the unit has one module, named by a model from the material. Its code is the unit's plus the initials of the first two meaningful words (ALF + "Operación del Brokk" = ALFOB). What the file does not give (names, summaries) is written once and kept, because the LMS compares those texts on every publish. A name or summary changed in the file after DEMO already holds it gives lms_demo_conflict; nothing that exists is ever edited. The module's icon is rendered from the unit's Blender file, with its Icon_Camera when the scene has one (see the scene spec).

[tablet] (/gen-player only)

What each of the tablet's apps holds (chapter 2.5b). Each member is a named table, so a unit can complete or change one the global configuration gives. sequence orders each list; enabled = false hides an inherited one. Documents and videos: source is a con-mgr (DEMO) resource's label, the unit's own or the shared library's (a document must be a PDF; a video an MP4 or WebM). Contacts: name, role, portrait (a PNG or JPEG image's label); guide = true is the exercise's guide; any other needs instructions (who they are and how they answer) and may carry voice (a Gemini voice) or gender. live_avatar names their Gemini Live Avatar; avatar names their voice avatar among flow-mgr's presenters (without it: the unit's own presenter for the guide, the bundled presenter for anyone else). The instructions, voice and Live Avatar stay in flow-mgr: they never reach the page.

[tablet.documents.manual]
source = "manual"
title = "Manual de uso"

[tablet.videos.arranque]
source = "video.brokk-arranque"
title = "Arranque"

[tablet.contacts.jefe]
name = "Carlos Ruiz"
role = "Jefe de planta"
voice = "Charon"
instructions = "Respondes sobre los turnos y la seguridad de la planta."

Global configuration and inheritance. con-mgr also keeps a global player-config (shared library). The unit's is laid over it by GW2's rule: a unit's value wins, tables merge, and an array replaces the other whole. The Mentor's profile lives there:

[tablet.contacts.mentor]
name = "Camila Rojas"
role = "Mentor"
live_avatar = "Kira"
guide = true
sequence = 10

A unit renames her with just [tablet.contacts.mentor] and name = "Laura".

10.5 /gen-player findings

FindingMeaning
lms_module_unnamed/gen-player: a module without name when the file defines several, or the model gave none
lms_module_bad_code/gen-player: a module code that is neither two letters nor the unit code plus two
lms_module_duplicate/gen-player: two modules with one code
lms_exercise_unnamed/gen-player: an exercise other than TU, TE or PR without name
lms_demo_conflict/gen-player: DEMO already holds the organization or module with another name or summary; nothing was written
lms_demo_error/gen-player: Support Admin did not answer, or no icon could be made; nothing was written
lms_demo_not_configured/gen-player: flow-mgr has no key for Support Admin's listener
player_music_not_configuredflow-mgr has no con-mgr address or key: no music
player_music_missingcon-mgr's library lacks one of the tracks: that moment keeps the player's own music, or silence
player_music_faileda track could not be copied, or the library could not be read: as above
player_tablet_not_configuredneither the global nor the unit's configuration has [tablet]: the tablet's apps are empty
player_tablet_source_faileda [tablet] source (document, video or portrait) is not in con-mgr, could not be copied, or is not of the expected kind: left out