Entrega 2 - Computacion-Visual-Interactiva/proyecto GitHub Wiki

Introducción

Para esta entrega hubo mejorar significativamente la calidad visual, la funcionalidad y la interacción del proyecto gráfico actual. Los principales aspectos abordados incluyen:

  • Reemplazo del modelo de la mariposa
  • Conversión del modelo OBJ mediante Python
  • Control y movimiento de cámara
  • Generación y renderizado del cielo

Reemplazo del modelo de la mariposa

El modelo inicial de la mariposa presentaba limitaciones visuales significativas que afectaban directamente el realismo de la escena. Algunas irregularidades, como vértices mal calculados que generaban áreas con una textura blanca, afectaban negativamente la presentación visual.

Modelo Inicial

Para resolver este problema se optó por generar un nuevo modelo utilizando la herramienta Meshy.ai. Esta plataforma permitió obtener un modelo mucho más detallado, generando automáticamente los vértices, índices y coordenadas de textura basado en la imagen. El resultado se exportó como un archivo OBJ que, mediante un script personalizado de Python, fue transformado en un archivo de cabecera (.hpp) llamado butterfly_verts.hpp. Esta nueva estructura permitió cargar los datos directamente en el motor gráfico, resultando en una integración más eficiente y una notable mejora visual.

Conversión del modelo OBJ con Python

Se hizo un script de Python que sirvio para simplificar y agilizar el proceso de incorporación del modelo al proyecto. El script desarrollado lee y extrae la información esencial del archivo OBJ como las posiciones de vértices y coordenadas de textura, procesándola para generar automáticamente un archivo .hpp bien estructurado. Este archivo contiene arrays estáticos y constantes que en diligent engine puede utilizar directamente, optimizando significativamente el flujo de trabajo.

Ejemplo de estructura generada:

namespace Butterfly {
    constexpr float ButterflyVerts[] = {
        // coordenadas de vértices (x, y, z), coordenadas de textura (u, v)
        0.5f, 0.3f, 0.0f,   0.0f, 1.0f,
        ...
    };

    constexpr Uint32 ButterflyIndices[] = {
        0, 1, 2, 2, 3, 0, ...
    };

    constexpr Uint32 ButterflyIndexCount = sizeof(ButterflyIndices) / sizeof(Uint32);
}

Control y movimiento de la cámara

En la versión anterior del proyecto, la cámara no tenia movimiento que impedían una exploración del entorno 3D. Para desarollar este feature se implementó una nueva mecánica de cámara utilizando la clase FirstPersonCamera del motor gráfico Diligent. Esta implementación permite desplazarse libremente usando controles estándar como las teclas W, A, S, D para el movimiento y el ratón para controlar la direccion. La matriz de vista-proyección se actualiza en tiempo real, facilitando una interacción más intuitiva y realista:

Implementación técnica:

  • Se utilizó la clase FirstPersonCamera del motor gráfico Diligent.
  • Las actualizaciones de la cámara se integraron directamente en el ciclo de renderizado (método Update).
  • Se actualiza la matriz de vista-proyección en tiempo real para asegurar una respuesta natural a la interacción del usuario.
void Tutorial03_Texturing::Update(double CurrTime, double ElapsedTime)
{
    m_Camera.Update(m_InputController, static_cast<float>(ElapsedTime));

    const auto SurfT = GetSurfacePretransformMatrix(float3{0, 0, 1});
    m_WorldViewProj = m_Camera.GetViewMatrix() * SurfT * m_Camera.GetProjMatrix();
}

Generación y renderizado del cielo

Previamente, la escena carecía de un entorno ambiental adecuado, lo que provocaba que la mariposa apareciera aislada y poco realista. Para proporcionar una vista mas inmersiva, se agregó un cielo usando una imagen panoramica.

Este fondo ambiental fue implementado utilizando una técnica eficiente basada en un triángulo que cubre la totalidad de la pantalla full-screen triangle. Shaders específicos (SkySphere.hlsl) se encargan de mapear correctamente la imagen panorámica sobre el fondo, utilizando una matriz de vista-proyección invertida para mantener el cielo estático en relación con la cámara y ofrecer así una sensación realista de distancia y profundidad:

Aspectos clave del shader:

// Shader de vértices 
float4 VSMain(uint vertexID : SV_VertexID) : SV_POSITION {
    float2 pos = float2((vertexID << 1) & 2, vertexID & 2);
    float4 projectedPos = mul(float4(pos * 2 - 1, 0, 1), CB.InvRotProj);
    return projectedPos;
}

// Shader de píxeles 

float4 PSMain(...) : SV_TARGET {
    float3 direccion = normalize(worldPosition.xyz);
    float2 uv = direccionAUV(direccion);
    return SkyTex.Sample(Sampler, uv);
}

Resultado Final

Resutlado 1 Resutlado 2 Resutlado 3

⚠️ **GitHub.com Fallback** ⚠️