Red de conocimientos turísticos - Conocimiento turístico - Cómo buscar modelos de inclinación en formato OSGB a gran escala directamente en Internet (2): convertir OSGB

Cómo buscar modelos de inclinación en formato OSGB a gran escala directamente en Internet (2): convertir OSGB

Bienvenido a seguir la cuadrícula tridimensional de Gong Hao y obtener los últimos artículos lo antes posible.

Los resultados del análisis se publicaron en el artículo anterior (Cómo explorar directamente modelos de inclinación de formato OSGB de gran tamaño en la Web (1): Análisis de OSGB), lo que nos permite tener una comprensión clara de la estructura interna. de archivos de modelo de inclinación OSGB. En este artículo, convertimos los resultados del análisis en objetos three.js e implementamos la visualización de un único modelo.

¿Por qué convertirlo en un objeto three.js?

A juzgar por los resultados del análisis, es más fácil expresar las relaciones de nodo de los objetos Osg usando objetos three.js. Los resultados de la conversión se pueden mostrar directamente usando three.js a través de la solución de integración de nuestro equipo. three.js. Los resultados se pueden utilizar fácilmente en proyectos desarrollados por Cesium y se pueden utilizar de forma independiente con capacidades GIS.

El tipo Osg a convertir.

El atributo de tipo del objeto Osg obtenido mediante análisis indica el tipo del objeto. Solo queremos convertir el objeto Osg del archivo de modelo de fotografía oblicua y no creamos una herramienta de conversión general, por lo que primero clasificamos los tipos y solo convertimos los tipos de los datos de prueba utilizados actualmente (datos de prueba superiores a 100 g).

PD: La versión utilizada internamente por nuestro equipo, después de más de un año de aplicación y mejora, admite más tipos de conversiones, llena muchas lagunas y admite cuatro formatos como osgb, osgt, osg y osgjs. para garantizar la velocidad de carga y la solidez. Bienvenido a consultar~

Clase de nodo

osg::Node

osg::Geode

osg::Group

osg::LOD

osg::PaggedLOD

osg::Matrix Transform

Clase de geometría

Geometría

osg::OsgArray

Categoría de material

osg::StateSet

osg::Material

osg::StateAttribute

osg::Texture

osg::Texture2D

osg::Image

La clase de nodo considera principalmente osg::MatrixTransform, porque La información principal de este nodo son los parámetros de transformación, que afectarán la posición, rotación y escala del modelo.

A continuación, nos centraremos en convertir geometría y materiales. No hay muchos parámetros para LOD y PagedLOD, todos están relacionados con la programación. Los presentaremos juntos en el próximo artículo.

Transformar objetos geométricos

Los datos geométricos se almacenan en Osg::Geometry, incluido el atributo de índice PrimitiveSetList, el atributo de coordenadas de posición VertexArray y el atributo de coordenadas de textura TexCoordArray. Convirtamos eso a tres. BufferGeometry

varbufferGeometry=newTHREE. buffermetry();

Conversión de atributo de vértice

El valor del atributo de vértice es una matriz bidimensional. Podemos llamar directamente al método plano para convertirlo en una matriz unidimensional.

var posiciones = nueva matriz flotante 32 (geometría OSG. matriz de vértices. plano());

varuvs = nueva matriz flotante 32 (geometría OSG. texcoordarray. plano());

geometría del búfer . establecer atributo(' posición ', newTHREE. BufferAttribute(posición, 3));

geometría del búfer establecer atributo(' uv ', nuevoTRES. BufferAttribute(uvs, 2));

Conversión exponencial

Hay dos tipos de índice, especificados por valor. Aquí solo se procesa el caso en el que el tipo de índice es 4 (es decir, la unidad de dibujo mínima es un cuadrilátero), y la unidad de dibujo mínima predeterminada para el resto es un triángulo.

varprimitiveSet=osgGeometry.

PrimitiveSetList[0]

varindices = primitiveSet.data

if(primitiveSet.value==4) {

let new indexes =[];

for(leti = 0;i<index.length;i+=4) {

leti 0 = índices[I],

I 1 = índices[i +1] ,

i2 = índice [i+2],

i3 = índice [I+3]

newIndices.push(

i0, i1, i3,

i1, i2, i3

);

}

índices = nuevosÍndices

}

bufferGeometry.setIndex(index);

Convertir objeto material

El material más importante del modelo de fotografía oblicua es la textura. Como introducción al principio, solo tomamos la textura y no procesamos otros parámetros del material. Por supuesto, todavía hay algunas situaciones que deben manejarse en las aplicaciones de ingeniería para garantizar su disponibilidad, confiabilidad y robustez.

El objeto material se almacena en el atributo StateSet de Osg::Geometry, el tipo de atributo es Osg::StateSet y la textura que queremos se almacena en el atributo TextureAttributeList de Osg::StateSet, que es normalmente una imagen.

El modelo inclinado ya contiene información de luces y sombras, por lo que cambiamos el material a THREE.MeshBasicMaterial.

varmaterial=newTRES. MeshBasicMaterial({

Lado: tres. Doble cara

});

Procesamiento del mapa

El mapa suele estar en jpg o formato png, aquí solo nos ocupamos de estos dos formatos. Cabe señalar que el tipo de datos de imagen es Uint8Array, por lo que primero debemos convertirlo a Blob, luego crear la URL a través de url.createObjectURL y finalmente cargarla con THREE.TextureLoader.

varosgStateSet=osgGeometry. StateSet

varosgImage=osgStateSet. lista de atributos de textura [0]. valor del atributo de estado.

varfileName=osgImage. nombre;

constitsjpge = nombre de archivo . search(/\.jpe?g($|\?)/I)>0

constitspng = nombre de archivo . ($|\?)/I)>0

Si (!isPNG & amp& amp!isJPEG) devuelve;

varmimeType=isPNG? ' imagen/png ':' imagen/JPEG ';

varimageUri=newBlob([osgImage.Data], { tipo:tipo mime });

imageUri = URL createobjecturl(. imageUri)

vartexture=newTHREE. Cargador de texturas(). load(imageUri, ()= & gt{

texture.needsUpdate=true

})

Crear cuadrícula

Finalmente, Crear una malla modelo utilizando la geometría y los materiales convertidos. Lo que hay que tener en cuenta aquí es que el modelo de fotografía oblicua es z-arriba, mientras que la representación de three.js es y-arriba. La cuadrícula debe girarse Y-90° alrededor del eje X para obtener un efecto de representación normal. .

varmesh=newTRES. Malla (geometría, material);

malla rotación x = - matemática. π/2

Resultado de la conversión

Efecto de visualización

Bueno, no se ve bien ~ Después de todo, esta es la capa menos clara de un solo mosaico. Mira, es demasiado simple.

En el próximo artículo, presentaremos principalmente cómo implementar PagedLOD para cargar modelos de fotografía oblicua a gran escala, así que estad atentos.

Bienvenido a seguir la cuadrícula tridimensional de Gong Hao y recibir los últimos artículos lo antes posible.