Explicación detallada del formato del modelo PLY [3D]

Este artículo describe el formato de archivo de polígono PLY, que se utiliza para almacenar objetos gráficos descritos como colecciones de polígonos. El objetivo del formato de archivo PLY es proporcionar un formato que sea simple y fácil de implementar pero lo suficientemente general para una amplia variedad de modelos. PLY tiene dos subformatos: una representación ASCII para facilitar la entrada y un formato binario para almacenamiento compacto y guardado y carga rápidos. Esperamos que este formato facilite el intercambio de objetos gráficos entre programas y entre grupos de personas.

inserte la descripción de la imagen aquí
Si necesita convertir modelos 3D en gltf, fbx, obj, dae y otros formatos al formato PLY, puede usar esta herramienta de conversión de formato de modelo 3D en línea.

1. Resumen del formato PLY

Cualquiera que haya trabajado en gráficos por computadora durante un tiempo conoce la vertiginosa variedad de objetos que tienen los formatos de almacenamiento de gráficos. Parece que cada programador, cada nuevo proyecto de programación crea un nuevo formato de archivo.

La forma de salir de este atolladero es crear un formato de archivo único lo suficientemente flexible como para anticipar las necesidades futuras, lo suficientemente simple como para no alejar a los usuarios potenciales. Una vez que se define dicho formato, surge un conjunto de utilidades que se pueden escribir en torno a este formato. Cada nueva utilidad agregada a la suite aprovecha el trabajo de otros.

El formato PLY describe los objetos como vértices, caras y otros elementos, junto con atributos como el color y la dirección normal que se pueden adjuntar a estos elementos. Un archivo PLY contiene la siguiente descripción de exactamente un objeto.

Las fuentes de dichos objetos incluyen: objetos digitalizados a mano, objetos poligonales de programas de modelado, datos de extensión, triangulación de cubos en marcha (isosuperficie de datos de volumen), datos de terreno, modelos de radiosidad, etc.

Los atributos que se pueden almacenar con el objeto incluyen: color, superficie normal, coordenadas de textura, transparencia, confianza de los datos de extensión y diferentes atributos para las caras frontal y posterior de los polígonos.

El formato PLY no pretende ser un lenguaje de descripción de escena general, un lenguaje de sombreado o un formato de modelado que lo abarque todo. Esto significa que no incluye matrices de transformación, creación de instancias de objetos, jerarquías de modelado ni subpartes de objetos.

Una definición de objeto PLY típica es solo una lista de vértices y caras de (x, y, z) triples, con los vértices descritos por sus índices en las listas. La mayoría de los archivos PLY contienen esta información básica. Los vértices y las caras son dos ejemplos de "elementos", y la mayor parte de un archivo PLY son sus elementos de lista. Cada elemento en un archivo dado tiene un número fijo de "atributos"
especificados para cada elemento.

La información típica en un archivo PLY consta de solo dos elementos, el triplete (x, y, z) para el vértice y el índice de vértice para cada cara. Las aplicaciones pueden crear nuevos atributos adjuntos a los elementos del objeto. Por ejemplo, los atributos para rojo, verde y azul suelen estar asociados con elementos de vértice. Los programas antiguos no deben interrumpirse cuando se agregan nuevos atributos, y aquellos que no pueden explicarse pueden descartarse.

Además, es posible crear un nuevo tipo de elemento y definir atributos asociados con ese elemento. Ejemplos de nuevos elementos son bordes, celdas (lista de punteros a caras) y materiales (coeficientes y colores ambientales, difusos y especulares). Los programas que no los entienden también pueden transferir o descartar elementos nuevos.

2. Estructura de archivos PLY

Esta es la estructura de un archivo PLY típico:

  • Encabezamiento
  • lista de vértices
  • lista de caras
  • lista de otros elementos

Un encabezado es una serie de líneas de texto terminadas en retorno de carro que describen el resto del archivo. El encabezado contiene una descripción de cada
tipo de elemento, incluido el nombre del elemento (p. ej., borde), cuántos elementos de este tipo se encuentran en el objeto y una lista de los diversos atributos asociados con el elemento. El encabezado también indica si el archivo es binario o ASCII. Después del encabezado hay una lista de elementos para cada tipo de elemento, en el orden descrito en el encabezado.

La siguiente es una descripción ASCII completa de un modelo de cubo. Los encabezados binarios para el mismo objeto
simplemente usan binary_little_endian o binary_big_endian para la palabra ascii. Los
comentarios entre paréntesis no son parte del archivo, son comentarios para este ejemplo. Los comentarios en un archivo son líneas ordinarias identificadas con palabras clave que comienzan con comentario.

ply
format ascii 1.0           { ascii/binary, format version number }
comment made by anonymous  { comments keyword specified, like all lines }
comment this file is a cube
element vertex 8           { define "vertex" element, 8 of them in file }
property float32 x         { vertex contains float "x" coordinate }
property float32 y         { y coordinate is also a vertex property }
property float32 z         { z coordinate, too }
element face 6             { there are 6 "face" elements in the file }
property list uint8 int32 vertex_index { "vertex_indices" is a list of ints }
end_header                 { delimits the end of the header }
0 0 0                      { start of vertex list }
0 0 1
0 1 1
0 1 0
1 0 0
1 0 1
1 1 1
1 1 0
4 0 1 2 3                  { start of face list }
4 7 6 5 4
4 0 4 5 1
4 1 5 6 2
4 2 6 7 3
4 3 7 4 0

Este ejemplo demuestra los componentes básicos de un encabezado. Los encabezados de sección son una cadena ASCII que comienza con una palabra clave y termina con un retorno de carro, e incluso el principio y el final de los encabezados (ply y end_header) siguen este patrón.

Los caracteres ply deben ser los primeros cuatro caracteres del archivo, ya que son el número mágico del archivo. Después del comienzo del encabezado está el formato de la palabra clave y la especificación del formato ASCII o binario, seguido de un número de versión. Lo siguiente es una descripción de los elementos individuales en el polígono, y dentro de la descripción de cada elemento hay propiedades canónicas. Una descripción de elemento genérico tiene la siguiente forma:

element <element-name> <number-in-file>
property <data-type> <property-name-1>
property <data-type> <property-name-2>
property <data-type> <property-name-3>
...

Los atributos enumerados después de la línea del elemento definen el tipo de datos del atributo y el orden en que aparece el atributo dentro de cada elemento. Las propiedades pueden tener tres tipos de datos: escalar, cadena y lista. La siguiente es una lista de los tipos de datos escalares que puede tener una propiedad:

nombre tipo número de bytes
tu8 personaje 1
uint8 personaje sin firmar 1
int16 entero corto 2
uint16 entero corto sin signo 2
int32 entero 4
uint32 entero sin signo 4
flotar32 flotador de precisión simple 4
flotar64 flotador de doble precisión 8

Estos recuentos de bytes son significativos y no deben variar entre implementaciones para mantener estos archivos portátiles. Existe una forma especial de definición de propiedad que utiliza el tipo de datos de lista:

  property list <numerical-type> <numerical-type> <property-name>

Un ejemplo del archivo del conjunto de datos del cubo anterior:

  property list uint8 int32 vertex_index

Esto significa que el atributo vertex_index primero contiene un carácter sin firmar que identifica cuántos índices contiene el atributo, seguido de una lista de certificados incluidos. Cada entero en esta lista de longitud variable es un índice de vértice.

3. Otro ejemplo de archivo PLY

Aquí hay otra definición de cubo:

ply
format ascii 1.0
comment author: anonymous
comment object: another cube
element vertex 8
property float32 x
property float32 y
property float32 z
property red uint8                     { start of vertex color }
property green uint8
property blue uint8
element face 7
property list uint8 int32 vertex_index { number of vertices for each face }
element edge 5                         { five edges in object }
property int32 vertex1                 { index to first vertex of edge }
property int32 vertex2                 { index to second vertex }
property uint8 red                     { start of edge color }
property uint8 green
property uint8 blue
end_header
0 0 0 255 0 0                          { start of vertex list }
0 0 1 255 0 0
0 1 1 255 0 0
0 1 0 255 0 0
1 0 0 0 0 255
1 0 1 0 0 255
1 1 1 0 0 255
1 1 0 0 0 255
3 0 1 2                           { start of face list, begin with a triangle }
3 0 2 3                           { another triangle }
4 7 6 5 4                         { now some quadrilaterals }
4 0 4 5 1
4 1 5 6 2
4 2 6 7 3
4 3 7 4 0
0 1 255 255 255                   { start of edge list, begin with white edge }
1 2 255 255 255
2 3 255 255 255
3 0 255 255 255
2 0 0 0 0                         { end with a single black line }

Este archivo especifica valores de rojo, verde y azul para cada vértice. Para ilustrar la naturaleza de longitud variable de vertex_index, las dos primeras caras del objeto son triángulos en lugar de cuadrados. Esto significa que el objeto tiene 7 caras.

Este objeto también contiene una lista de bordes. Cada borde contiene dos punteros a los vértices del borde. Cada borde también tiene un color. Los cinco lados definidos arriba resaltan los dos triángulos en el archivo. Los primeros 4 lados son blancos y rodean los dos triángulos. El borde final es negro y es el borde que separa los triángulos.

4. PLY elementos personalizados

El ejemplo anterior muestra el uso de tres elementos: vértices, caras y aristas. El formato PLY también permite a los usuarios definir sus propios elementos.

El formato para definir nuevos elementos es exactamente el mismo que para definir vértices, aristas y caras. Aquí está el encabezado que define las propiedades del material:

element material 6
property ambient_red uint8               { ambient color }
property ambient_green uint8
property ambient_blue uint8
property ambient_coeff float32
property diffuse_red uint8               { diffuse color }
property diffuse_green uint8
property diffuse_blue uint8
property diffuse_coeff float32
property specular_red uint8              { specular color }
property specular_green uint8
property specular_blue uint8
property specular_coeff float32
property specular_power float32          { Phong power }

Estas líneas aparecerán directamente después de la especificación de vértices, caras y aristas en el encabezado. Si queremos que cada vértice tenga un material, podemos agregar esta línea al final de las propiedades del vértice:

property material_index int32

Este entero es el índice de la lista de materiales contenidos en el archivo. Puede ser tentador para el autor de una nueva aplicación inventar varios elementos para almacenarlos en un archivo PLY. Este enfoque debe ejercerse con moderación. Un mejor enfoque es tratar de adaptar elementos comunes (vértices, caras, aristas, materiales) a nuevos usos, para que otros elementos del programa que los entiendan puedan ayudar a manipular estos elementos.

Por ejemplo, para una aplicación que describe moléculas como conjuntos de esferas y cilindros, sería tentador agregar a PLY la definición de elementos de esfera y cilindro que contienen moléculas. Sin embargo, podemos continuar con estos viejos procedimientos si usamos elementos de vértice y borde para este propósito (agregando una propiedad de radio a cada elemento). Obviamente, no debe crear elementos especiales para triángulos y cuadriláteros, use el elemento cara en su lugar.


Enlace al texto original: Enlace al texto original — BimAnt

Supongo que te gusta

Origin blog.csdn.net/shebao3333/article/details/132244899
Recomendado
Clasificación