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

    Referencia Real


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

    Resultado con Curvas Bézier Resultado con Curvas Bézier 3d

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

    Resultado 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)

    Calculo resutlado de malla


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.