Mallas

Las mallas son un recurso compartido inmutable, que solo se puede crear mediante la conversión de datos. Las mallas se usan para la representación, pero también para proporcionar una representación física para las consultas de trazado de rayos. Para colocar una malla en un espacio 3D, agregue un componente MeshComponent a una entidad.

Tipos de malla

Hay dos tipos distintos de recursos de malla en ARR: mallas triangulares y nubes de puntos. Ambos tipos se representan mediante la misma clase de API Mesh. A excepción de las pequeñas diferencias en el comportamiento de los tipos de malla distintos, la funcionalidad de API expuesta es idéntica.

El servicio de conversión determina automáticamente el tipo de malla adecuado por extensión de archivo de origen. Por ejemplo, un archivo FBX siempre se convierte como una malla triangular, mientras que PLY se trata como una nube de puntos. Para obtener la lista completa de formatos de archivo admitidos, consulte la lista de formatos de archivo de origen.

Hay dos diferencias significativas para el usuario entre las conversiones de malla triangular y de nube de punto:

  • Las mallas de nube de punto no exponen ningún material. La apariencia visual de los puntos se define únicamente por su color por punto,
  • las nubes de punto no exponen un gráfico de escenas. En su lugar, todos los puntos se adjuntan a la entidad del nodo raíz.

Propiedades del recurso de malla

Las propiedades de clase Mesh son:

  • Materiales: una matriz de materiales. Cada material se usa por medio de una submalla diferente. Varias entradas de la matriz pueden hacer referencia al mismo material. Las entradas de esta matriz no se pueden cambiar en tiempo de ejecución, pero las propiedades del material sí pueden. En el caso de las nubes de puntos, esta matriz está vacía.

  • Límites: cuadro de límite alineado con eje de espacio local (AABB) de los vértices de malla.

MeshComponent

La clase MeshComponent se usa para colocar una instancia de un recurso de malla. Cada MeshComponent hace referencia a una sola malla. Puede invalidar los materiales que se usan para representar cada submalla.

Propiedades MeshComponent

  • Mesh: recurso de malla que usa este componente.

  • Materiales: matriz de materiales especificados en el propio componente de malla. La matriz siempre tendrá la misma longitud que la matriz de Materiales en el recurso de malla. Los materiales que no se van a invalidar a partir del valor predeterminado de la malla se establecen en NULL en esta matriz.

  • UsedMaterials: matriz de materiales usados en realidad para cada submesh. Serán idénticos a los datos de la matriz de Materiales, para valores que no son NULL. En caso contrario, contiene el valor de la matriz de Materiales en la instancia de malla. Esta matriz es de solo lectura.

Uso compartido de mallas

Un recurso Mesh se puede compartir entre varias instancias de componentes de malla. Además, el recurso Mesh que se asigna a un componente de malla se puede cambiar mediante programación en cualquier momento. En el siguiente código se muestra cómo clonar una malla:

Entity CloneEntityWithModel(RenderingConnection api, Entity sourceEntity)
{
    MeshComponent meshComp = sourceEntity.FindComponentOfType<MeshComponent>();
    if (meshComp != null)
    {
        Entity newEntity = api.CreateEntity();
        MeshComponent newMeshComp = api.CreateComponent(ObjectType.MeshComponent, newEntity) as MeshComponent;
        newMeshComp.Mesh = meshComp.Mesh; // share the mesh
        return newEntity;
    }
    return null;
}
ApiHandle<Entity> CloneEntityWithModel(ApiHandle<RenderingConnection> api, ApiHandle<Entity> sourceEntity)
{
    if (ApiHandle<MeshComponent> meshComp = sourceEntity->FindComponentOfType<MeshComponent>())
    {
        ApiHandle<Entity> newEntity = *api->CreateEntity();
        ApiHandle<MeshComponent> newMeshComp = api->CreateComponent(ObjectType::MeshComponent, newEntity)->as<RemoteRendering::MeshComponent>();
        newMeshComp->SetMesh(meshComp->GetMesh()); // share the mesh
        return newEntity;
    }
    return nullptr;
}

Documentación de la API

Pasos siguientes