Entrega 1 - Computacion-Visual-Interactiva/proyecto GitHub Wiki
Inspiración: Morpho rhodopteron
La mariposa Morpho rhodopteron es una especie endémica de Colombia, que habita en Magdalena y Cesar principalmente, viviendo en los bosques húmedos de la Sierra Nevada. Es una especie translucida y brillante, poco frecuente de observar, que se encuentra en peligro de extinción. Sus alas son redondeadas, con bordes irregulares y antenas largas. La siguiente foto esta siendo utilizada como inspiración para este proyecto.
Referencia visual
-
Ejemplo real de Morpho rhodopteron
Estrategias de modelado exploradas
Se exploraron varias estrategias para representar adecuadamente las alas y la estructura general:
1. Curvas Bézier mediante la fórmula de Brize
Se intentó modelar las curvas naturales de las alas usando una adaptación de la fórmula de Brize similar al método usado para simular pasto en GPU Gems Capítulo 7. Aunque válida teóricamente, esta solución presentó problemas visuales significativos.
-
Resultado con Curvas Bézier
2. Modelado con geometría básica (cubos y cuadrados)
Esta aproximación resultó rápida, pero produjo formas demasiado rígidas, alejadas de la fluidez natural requerida.
-
Resultado con geometría básica
3. Modelado vértice por vértice con rejilla
La solución final exitosa implicó diseñar manualmente vértice por vértice, usando una cuadrícula como referencia visual. Cada punto fue calculado cuidadosamente y transcrito directamente al código del motor gráfico.
-
Resultado exitoso (malla final)
Implementación técnica
Vertex Buffer (Malla creada manualmente)
El siguiente código muestra cómo se introdujeron los vértices directamente al Diligent Engine:
void Tutorial03_Texturing::CreateVertexBuffer()
{
struct Vertex { float3 pos; float2 uv; };
constexpr Vertex ButterflyVerts[] = {
// Ala superior izquierda
{float3{6.45f, 3.6f, 0}, float2{0,1}}, // Centro (raíz)
{float3{6.45f, 5.4f, 0}, float2{0,1}},
{float3{9.20f, 5.35f, 0}, float2{0,1}},
// ... resto de vértices (103 en total)
{float3{9.74f, 6.4f, 0}, float2{0,1}} // Último vértice
};
BufferDesc vbDesc;
vbDesc.Name = "Butterfly VB";
vbDesc.BindFlags = BIND_VERTEX_BUFFER;
vbDesc.Usage = USAGE_IMMUTABLE;
vbDesc.Size = sizeof(ButterflyVerts);
BufferData vbData{ButterflyVerts, vbDesc.Size};
m_pDevice->CreateBuffer(vbDesc, &vbData, &m_ButterflyVertexBuffer);
}
Index Buffer
Los índices fueron definidos manualmente para formar triángulos adecuados para el renderizado:
void Tutorial03_Texturing::CreateIndexBuffer()
{
constexpr Uint32 Indices[] = {
// Ala superior izquierda
1,0,2, 2,0,3,
3,0,4, 4,0,5,
// ... índices adicionales
102,82,83
};
BufferDesc ibDesc;
ibDesc.Name = "Butterfly IB";
ibDesc.BindFlags = BIND_INDEX_BUFFER;
ibDesc.Usage = USAGE_IMMUTABLE;
ibDesc.Size = sizeof(Indices);
BufferData ibData{Indices, ibDesc.Size};
m_pDevice->CreateBuffer(ibDesc, &ibData, &m_ButterflyIndexBuffer);
}
Lecciones aprendidas
- Utilizar rejillas como referencia visual simplifica la precisión del modelado manual.
- Ajustar configuraciones del pipeline desactivando el culling lo cual facilita el uso simétrico de geometría.
Problemas encontrados
- Desarollar el mapa de texturas consistente cuando se tenga que determinar para las alas ya que como estas hechas de triangulos que no son iguales o equitativos la froma de ponerle el mapa de textura requiere un trabajo extra
- Separar cada objeto y no solo hacer uno grande el cual es el estado actual del objeto.
- Ver como hace el objeto 3D con vectores manteniendo el realismo
- Incorporar el movimiento de cada parte
Próximos pasos
- Realizar una simetría exacta de la geometría existente.
- Implementar texturas detalladas para reflejar la belleza natural de la especie real.
- Desarrollar animaciones básicas de aleteo para mayor realismo.
- Evaluar y optimizar el rendimiento del motor gráfico.
- Completar la documentación detallada en el README del proyecto.