Replies: 2 comments 2 replies
-
Si bien ambas soluciones resuelven como renderizar de manera mas simple y legible un modelo. Para el objetivo de la materia y lo que buscamos que el alumno aprenda a bajo nivel, es mejor la solución A. Muestra todo lo que tiene que hacer para poder renderizar el model sin esconderlo atrás de interfeces. |
Beta Was this translation helpful? Give feedback.
-
Comparto que Models no es la clase que necesitamos para realizar muchas cosas y es una clase que sirve para la gente que recién arranca y quiere hacer algo rápido. Este justamente no es nuestro objetivo como materia. |
Beta Was this translation helpful? Give feedback.
-
Introducción
Hacer que las personas que cursan la materia carguen y dibujen sus modelos fue un tema sensible porque estos pueden venir muy variados (texturas, matrices, geometrías).
Esta discusión busca exponer los problemas del diseño planteado por MonoGame (XNA) y explorar alguna solución que tenga un buen balance entre abstracción, simplicidad y flexibilidad.
Qué es el Model
El Model de XNA y sus clases asociadas es una abstracción para los modelos 3D que tiene distintos componentes internos.
Por alguna razón las colecciones son inmutables y de tipos manejados por MonoGame.
Las clases más importantes son:
También tiene una colección de MeshParts.
Tiene información como un índice, nombre, Bone base que contiene a la instancia, lista de ModelMesh a cuales aplica,
matriz relativa y matriz absoluta una vez que es construida. El model puede decidir "aplanar" la jerarquía (calcular las matrices absolutas), aunque no está expuesto públicamente - sólo se usa internamente cuando se va a dibujar un modelo.
Es un conjunto de geometrías afectadas por la misma matriz relativa.
Un ModelMeshPart es el elemento más básico de una geometría, aunque no tiene ownership del VB/IB.
Tiene que asociarse la técnica actual antes de dibujar cualquier geometría y son referencias al recurso de la API gráfica.
Problemas del Model
Ya viene asignado a uno o varios BasicEffects. Quien lo usa tiene que aprender a pisarlo por ModelMeshPart,
pero antes extraer sus texturas si las hay y encontrar una manera de mappearlas a las ModelMeshParts (generalmente un diccionario lo resuelve). Nota: Por ahora no pude importar un modelo y que reconozca más de una textura por ModelMeshPart. No está bien asumir que una mesh va a tener una única textura, aunque si es una limitación del importer tendríamos que cambiarlo.
Es poco opaco a la hora de entender las diferencias entre Model, ModelMesh y ModelMeshPart: ¿Por qué hay tres objetos y por qué tienen esos nombres?
Hay poca documentación al respecto que ayude a entender distintos casos. La persona que lo usa tiene que habituarse a los tipos listados arriba. Si bien contemplan casos flexibles, hacer geometría a mano (véase las primitivas) termina teniendo una interfaz distinta e incompatible.
Esconde las matrices de mundo atrás de una interfaz poco amigable como los huesos.
¿Qué pasa si quiero dibujar un modelo en dos lugares distintos con valores distintos para sus huesos?
Hay que copiar toda la jerarquía e iterarla.
En el primer cuatrimestre del 2023 surgió este problema cuando un grupo quería dibujar varios autos iguales con distintos valores para los huesos en las ruedas.
¿Cómo dibujo un modelo? Hay mil formas, dependiendo de si hay una ModelMesh o varias, y dependiendo de si tiene múltiples matrices o no.
Si bien esto es deseable, en el caso de que venga una geometría sola tenemos que revisar los huesos para saber si tiene transformaciones.
Pero si queremos usar distintas matrices o parámetros por mesh es un poco más complejo.
Si quiero extraer parte de una mesh para dibujarla aparte es difícil porque las colecciones de ModelMesh y ModelMeshParts son inmutables. Tendría que conocer los efectos de cada ModelMeshPart y preparar sus valores.
Si quiero no dibujar una mesh no puedo sacarla de las colecciones, tampoco agregarlas. Sólo puedo crear Model nuevos.
Soluciones
Este problema tiene múltiples soluciones:
A
Hacer alguna utilidad que extraiga las geometrías con sus texturas y matrices, y que lxs estudiantes dibujen esto directamente y lo manejen como quieran.
Requiere que quien lo usa escriba más código pero se tiene más control y nos ahorramos de leer cualquier abstracción que hagamos.
Podemos hacer que el TP cero tenga modelos muy básicos, y que en el TP cuatrimestral tengan que escribir sus propios métodos para dibujar, algo que ya está pasando.
El código se va a parecer más a algo bajo nivel:
Pros:
Una utilidad te extrae todo lo que necesitas (o podemos hacer un processor custom).
Contras:
B
Hacer alguna utilidad que procese el Model y devuelva una abstracción, no asociada a un Effect, pero flexible
para permitir dibujar geometrías de una manera más controlada.
Esta solución no requiere que quien la usa conozca el modelo a dibujar en su totalidad, pero requiere un poco de conocimiento
sobre la abstracción en sí.
El código se vería así:
Pros:
IDrawableData
para devolverelementos en una jerarquía de huesos o exponer data especial.
Contras:
6 votes ·
Beta Was this translation helpful? Give feedback.
All reactions