El espacio de nombres para fotos panorámicas que aquí se describe contiene propiedades que proporcionan información acerca de cómo crear y presentar fotos esféricas, también llamadas panorámicas, como las que creas con la función Photo Sphere en la cámara de Android 4.2. Los metadatos se deben serializar e integrar a la foto esférica como se describe en el estándar de Adobe XMP (consulta referencias al final de esta página).
El URI del espacio de nombres es http://ns.google.com/photos/1.0/panorama/
Propiedades de los metadatos
El diagrama y la tabla que se muestran a continuación contienen las propiedades de las fotos esféricas. Los desarrolladores que escriben estos metadatos deben asegurarse de seguir las Convenciones de ángulos de Euler que se indican más adelante en este documento. Los desarrolladores que editan y visualizan fotos esféricas deben asegurarse de verificar y actualizar los metadatos en consecuencia tal como se describe más adelante en este documento.
Nombre | Tipo | Obligatorio | Valor predeterminado (visor asumido) |
Descripción de propiedades | Acción requerida si se modifica la imagen |
---|---|---|---|---|---|
GPano:UsePanoramaViewer | Valor booleano | No | True | Determina si se debe mostrar esta imagen en un visor de fotos esféricas en lugar de mostrarla como una imagen plana normal. Esto se puede especificar en función de las preferencias del usuario o mediante el software de cosido de imágenes. La aplicación que exhibe o incorpora la imagen puede decidir ignorar esto. | ajustar a escala/recortar: sin cambios. Una aplicación puede decidir cambiar esto a “False” si el campo de visión es inferior a un valor determinado. |
GPano:CaptureSoftware | Cadena | No | N/D | Si la captura se realizó con una aplicación en un dispositivo móvil, como un teléfono Android, el nombre de la aplicación que se usó (como “Photo Sphere”). Se debe dejar en blanco si las imágenes de origen se capturaron manualmente, como ocurre al usar una cámara DSLR en un trípode. | N/D |
GPano:StitchingSoftware | Cadena | No | N/D | El software que se usó para crear la foto esférica final. Algunas veces, puede ser el mismo valor que el de GPano:CaptureSoftware. | N/D |
GPano:ProjectionType | Elección libre de texto | Sí |
equirrectangular |
Tipo de proyección usado en el archivo de imagen. Los productos de Google actualmente admiten el valor equirrectangular. | ajustar a escala/recortar: Sin cambios |
GPano:PoseHeadingDegrees | Real | No, pero es obligatorio para mostrar en Google Maps | N/D | Orientación según la brújula, medida en grados, para el centro de la imagen. El valor debe ser >= 0 y < 360. | ajustar a escala/recortar: Sin cambios |
GPano:PosePitchDegrees | Real | No | 0 | Inclinación, medida en grados, para el centro de la imagen. El valor debe ser >= -90 y <= 90. | ajustar a escala/recortar: Sin cambios |
GPano:PoseRollDegrees | Real | No | 0 | Balanceo de la imagen, medido en grados, donde el nivel con el horizonte es 0. El valor debe ser > -180 y <= 180. | ajustar a escala/recortar: Sin cambios |
GPano:InitialViewHeadingDegrees | Entero | No | 0 | El ángulo de orientación de la vista inicial en grados. | ajustar a escala/recortar: Sin cambios |
GPano:InitialViewPitchDegrees | Entero | No | 0 | El ángulo de inclinación de la vista inicial en grados. | ajustar a escala/recortar: Sin cambios |
GPano:InitialViewRollDegrees | Entero | No | 0 | El ángulo de balanceo de la vista inicial en grados. | ajustar a escala/recortar: Sin cambios |
GPano:InitialHorizontalFOVDegrees | Real | No | N/D | El campo visual horizontal inicial que el visor debe mostrar (en grados). Es similar al nivel de zoom. | N/D |
GPano:FirstPhotoDate | Fecha | No | N/D | Fecha y hora para la primera imagen creada en Photo Sphere. | ajustar a escala/recortar: Sin cambios |
GPano:LastPhotoDate | Fecha | No | N/D | Fecha y hora para la última imagen creada en Photo Sphere. | ajustar a escala/recortar: Sin cambios |
GPano:SourcePhotosCount | Entero | No | N/D | Cantidad de imágenes de origen usadas para crear la foto esférica. | ajustar a escala/recortar: Sin cambios |
GPano:ExposureLockUsed | Valor booleano | No | N/D | Indica si cuando se tomaron las fotos de origen individuales estaba bloqueada la configuración de exposición de la cámara. | N/D |
GPano:CroppedAreaImageWidthPixels | Entero | Sí | N/D | Ancho original de la imagen en píxeles (equivalente al ancho real de la imagen para imágenes sin editar). | ajustar a escala/recortar: Esta propiedad se debe actualizar para reflejar el nuevo tamaño de la imagen. |
GPano:CroppedAreaImageHeightPixels | Entero | Sí | N/D | Altura original de la imagen en píxeles (equivalente a la altura real de la imagen para imágenes sin editar). | ajustar a escala/recortar: Esta propiedad se debe actualizar para reflejar el nuevo tamaño de la imagen. |
GPano:FullPanoWidthPixels | Entero | Sí | N/D | Ancho completo original a partir del cual se recortó la imagen. Si solo se capturó una foto esférica parcial, esta propiedad especifica el ancho que hubiera tenido la foto esférica completa. | recortar: Sin cambios ajustar a escala: Esta propiedad se debe ajustar a escala de forma adecuada. |
GPano:FullPanoHeightPixels | Entero | Sí | N/D | Altura completa original a partir de la cual se recortó la imagen. Si solo se capturó una foto esférica parcial, esta propiedad especifica la altura que hubiera tenido la foto esférica completa. | recortar: Sin cambios ajustar a escala: Esta propiedad se debe ajustar a escala de forma adecuada. |
GPano:CroppedAreaLeftPixels | Entero | Sí | N/D | Columna en la que el borde izquierdo de la imagen se recortó a partir de la foto esférica de tamaño completo. | recortar: Si se modifica el recorte izquierdo de la imagen, se debe actualizar este valor. ajustar a escala: Esta propiedad se debe ajustar a escala de forma adecuada. |
GPano:CroppedAreaTopPixels | Entero | Sí | N/D | Fila en la que el borde superior de la imagen se recortó a partir de la foto esférica de tamaño completo. | recortar: Si se modifica el recorte superior de la imagen, se debe actualizar este valor. ajustar a escala: Esta propiedad se debe ajustar a escala de forma adecuada. |
GPano:InitialCameraDolly | Real | No | 0 | Este parámetro opcional mueve la posición de la cámara virtual a lo largo de la línea de visión, lejos del centro de la foto esférica. Una posición superficial trasera se representa con el valor -1.0, mientras que la posición superficial delantera se representa con el valor 1.0. Para la visualización normal, este parámetro debe fijarse en 0. | N/D |
Ejemplo de una foto esférica completa
Aquellas personas que no sean programadores pueden agregar el ejemplo de metadatos que se proporciona a continuación a sus fotos esféricas completas ya existentes (360 grados x 180 grados) solo con pequeñas modificaciones. Esto se puede realizar en productos de edición de imágenes, como Adobe Photoshop.
- cambia las ocurrencias de 4000 y 2000 para que coincidan con el ancho y la altura correspondientes de tu imagen en píxeles
- actualiza PoseHeadingDegrees si quieres que Google Maps muestre tu foto esférica; no obstante, también puedes eliminar este parámetro
- actualiza o elimina parámetros opcionales (como se indicó anteriormente)
<rdf:Description rdf:about="" xmlns:GPano="http://ns.google.com/photos/1.0/panorama/"> <GPano:UsePanoramaViewer>True</GPano:UsePanoramaViewer> <GPano:CaptureSoftware>Photo Sphere</GPano:CaptureSoftware> <GPano:StitchingSoftware>Photo Sphere</GPano:StitchingSoftware> <GPano:ProjectionType>equirectangular</GPano:ProjectionType> <GPano:PoseHeadingDegrees>350.0</GPano:PoseHeadingDegrees> <GPano:InitialViewHeadingDegrees>90.0</GPano:InitialViewHeadingDegrees> <GPano:InitialViewPitchDegrees>0.0</GPano:InitialViewPitchDegrees> <GPano:InitialViewRollDegrees>0.0</GPano:InitialViewRollDegrees> <GPano:InitialHorizontalFOVDegrees>75.0</GPano:InitialHorizontalFOVDegrees> <GPano:CroppedAreaLeftPixels>0</GPano:CroppedAreaLeftPixels> <GPano:CroppedAreaTopPixels>0</GPano:CroppedAreaTopPixels> <GPano:CroppedAreaImageWidthPixels>4000</GPano:CroppedAreaImageWidthPixels> <GPano:CroppedAreaImageHeightPixels>2000</GPano:CroppedAreaImageHeightPixels> <GPano:FullPanoWidthPixels>4000</GPano:FullPanoWidthPixels> <GPano:FullPanoHeightPixels>2000</GPano:FullPanoHeightPixels> <GPano:FirstPhotoDate>2012-11-07T21:03:13.465Z</GPano:FirstPhotoDate> <GPano:LastPhotoDate>2012-11-07T21:04:10.897Z</GPano:LastPhotoDate> <GPano:SourcePhotosCount>50</GPano:SourcePhotosCount> <GPano:ExposureLockUsed>False</GPano:ExposureLockUsed> </rdf:Description>
Ejemplo de una foto esférica parcial
<rdf:Description rdf:about="" xmlns:GPano="http://ns.google.com/photos/1.0/panorama/"> <GPano:UsePanoramaViewer>True</GPano:UsePanoramaViewer> <GPano:CaptureSoftware>Photo Sphere</GPano:CaptureSoftware> <GPano:StitchingSoftware>Photo Sphere</GPano:StitchingSoftware> <GPano:ProjectionType>equirectangular</GPano:ProjectionType> <GPano:PoseHeadingDegrees>350.0</GPano:PoseHeadingDegrees> <GPano:InitialViewHeadingDegrees>90.0</GPano:InitialViewHeadingDegrees> <GPano:InitialViewPitchDegrees>0.0</GPano:InitialViewPitchDegrees> <GPano:InitialViewRollDegrees>0.0</GPano:InitialViewRollDegrees> <GPano:InitialHorizontalFOVDegrees>75.0</GPano:InitialHorizontalFOVDegrees> <GPano:CroppedAreaLeftPixels>90</GPano:CroppedAreaLeftPixels> <GPano:CroppedAreaTopPixels>128</GPano:CroppedAreaTopPixels> <GPano:CroppedAreaImageWidthPixels>2300</GPano:CroppedAreaImageWidthPixels> <GPano:CroppedAreaImageHeightPixels>1042</GPano:CroppedAreaImageHeightPixels> <GPano:FullPanoWidthPixels>4000</GPano:FullPanoWidthPixels> <GPano:FullPanoHeightPixels>2000</GPano:FullPanoHeightPixels> <GPano:FirstPhotoDate>2012-11-07T21:03:13.465Z</GPano:FirstPhotoDate> <GPano:LastPhotoDate>2012-11-07T21:04:10.897Z</GPano:LastPhotoDate> <GPano:SourcePhotosCount>50</GPano:SourcePhotosCount> <GPano:ExposureLockUsed>False</GPano:ExposureLockUsed> </rdf:Description>
Solidez para la edición de imágenes
Para ser sólidos, los programas que muestran fotos esféricas en un visor deben comprobar si una aplicación ajustó la foto esférica original a escala sin actualizar los metadatos. Esto se puede realizar en los siguientes pasos:
- asegúrate de que la etiqueta CroppedAreaImageWidthPixels sea equivalente al ancho real de la imagen
- asegúrate de que la etiqueta CroppedAreaImageHeightPixels sea equivalente a la altura real de la imagen
- si el paso 1 o 2 falla, comprueba si se conservó la relación de aspecto de la imagen
- si el paso 3 falla, no muestres la imagen como una foto esférica ya que se transformó de una forma incompatible que generará distorsiones graves
- si el paso 3 es exitoso, la relación de aspecto es equivalente y todos los valores asociados de la etiqueta que se indican a continuación se ajustarán a escala para adaptarse al nuevo tamaño de la imagen:
CroppedAreaImageWidthPixels, CroppedAreaImageHeightPixels, FullPanoWidthPixels, FullPanoHeightPixels, CroppedAreaLeftPixels, CroppedAreaRightPixels.
Información general sobre ángulos de Euler
La orientación de la foto esférica en el marco del mundo está definida por ángulos de Euler. Los ángulos de Euler pueden definirse de diversas maneras. Para hacerlo correctamente, un programa debe seguir estrictamente las convenciones de los ángulos de Euler que se describen aquí.
La posición sobre la superficie de la tierra define un "marco local" fijo XYZ, en el que Z es hacia arriba y en sentido ortogonal con respecto a la superficie de la tierra, X es el extremo este e Y es el extremo norte. La orientación se define con respecto a este "marco local" fijo, y los ángulos de Euler son rotaciones alrededor de esos ejes XYZ fijos. Por lo tanto, la orientación de la pose es indefinida en los polos. Esto significa que una foto esférica con ángulos (0, 0, 0) se orientará de modo que el píxel central se enfrente al norte con el Ecuador de la foto esférica paralelo a la superficie de la tierra.
Los ángulos de Euler proporcionan una representación desde puntos en el "marco de la
foto esférica" (girada) hasta puntos en el "marco local" (fijo):
Se puede construir una matriz de rotación a partir de ángulos de Euler de la siguiente
manera (es importante preservar este orden):
R = R_Z(-heading) * R_X(pitch) * R_Y(roll)
donde: R_*(t) es una rotación hacia la derecha alrededor del eje especificado:
R_Z(angle) = [ cos(angle), -sin(angle), 0
sin(angle), cos(angle), 0
0, 0, 1 ]
R_X(angle) = [ 1, 0, 0,
0, cos(angle), -sin(angle),
0, sin(angle), cos(angle) ]
R_Y(angle) = [ cos(angle), 0, sin(angle),
0, 1, 0,
-sin(angle), 0, cos(angle) ]
and where: Z = Up, X = East, Y = North.
Es importante preservar el orden siguiente
R = R_Z(-heading) * R_X(pitch) * R_Y(roll)
,ya que las rotaciones no son conmutativas.
Ten en cuenta que al ángulo de orientación es el mismo que la orientación estándar según la brújula.
Referencias
Adobe XMP standard: http://www.adobe.com/devnet/xmp.html