Metadata Photo Sphere XMP

Namespace panorama yang dijelaskan di sini berisi properti-properti yang menyediakan informasi mengenai pembuatan dan rendering fotosfer, yang kadang-kadang disebut panorama, misalnya yang dibuat dengan fitur Photo Sphere dalam kamera Android 4.2. Metadata ini harus diserialkan dan disematkan di dalam fotosfer seperti dijelaskan oleh Adobe XMP (lihat referensi di akhir laman ini).

URI namespace adalah http://ns.google.com/photos/1.0/panorama/

Properti metadata

Diagram dan tabel di bawah ini menampilkan properti fotosfer. Bagi developer yang menulis metadata ini, pastikan untuk mengikuti konvensi sudut Euler dalam dokumen ini. Bagi developer yang mengedit dan menampilkan fotosfer, pastikan memverifikasi dan memperbarui metadata seperti dijelaskan nanti dalam dokumen ini.

Nama Tipe Diperlukan Nilai default
(asumsi pemirsa)
Keterangan properti Aksi diperlukan jika gambar dimodifikasi
GPano:UsePanoramaViewer Boolean Tidak True Apakah akan menampilkan gambar ini dalam penampil fotosfer daripada menampilkan gambar polos biasa. Ini bisa ditetapkan berdasarkan preferensi pengguna atau oleh perangkat lunak perangkai. Aplikasi yang akan menampilkan atau mengolah gambar bisa memilih untuk mengabaikannya. skala/pangkas:
Tidak ada perubahan. Aplikasi bisa memutuskan untuk mengubahnya ke False jika bidang pandang berada di bawah nilai tertentu.
GPano:CaptureSoftware String Tidak n/a Jika menjepret gambar dilakukan menggunakan aplikasi pada perangkat seluler, misalnya ponsel Android, maka ini menunjukkan nama aplikasi yang digunakan (seperti “Photo Sphere”). Ini harus dikosongkan jika gambar sumber diambil secara manual, misalnya menggunakan DSLR pada tripod. n/a
GPano:StitchingSoftware String Tidak n/a Perangkat lunak yang digunakan untuk membuat fotosfer akhir. Ini kadang-kadang sama dengan nilai pada  GPano:CaptureSoftware. n/a
GPano:ProjectionType Pilihan Teks Terbuka Ya

equirectangular

Tipe proyeksi yang digunakan dalam file gambar. Produk Google saat ini mendukung nilai equirectangular. skala/pangkas: Tidak ada perubahan.
GPano:PoseHeadingDegrees Real Tidak, namun diperlukan untuk tampilan di Google Maps n/a Kepala kompas, diukur dalam derajat, untuk bagian tengah gambar. Nilainya harus >= 0 dan < 360. skala/pangkas: Tidak ada perubahan.
GPano:PosePitchDegrees Real Tidak 0 Pitch, diukur dalam derajat, untuk bagian tengah gambar. Nilainya harus >= -90 dan < 90. skala/pangkas: Tidak ada perubahan.
GPano:PoseRollDegrees Real Tidak 0 Rol gambar, diukur dalam derajat, dengan tinggi horizon 0. Nilai harus > -180 dan <= 180. skala/pangkas: Tidak ada perubahan.
GPano:InitialViewHeadingDegrees Integer Tidak 0 Sudut arah tujuan tampilan awal dalam derajat. skala/pangkas: Tidak ada perubahan.
GPano:InitialViewPitchDegrees Integer Tidak 0 Sudut pitch pada tampilan awal dalam derajat. skala/pangkas: Tidak ada perubahan.
GPano:InitialViewRollDegrees Integer Tidak 0 Sudut rol tampilan awal dalam derajat. skala/pangkas: Tidak ada perubahan.
GPano:InitialHorizontalFOVDegrees Real Tidak n/a Bidang pandang horizontal awal yang harus ditampilkan oleh penampil (dalam derajat). Ini serupa dengan tingkat zoom. n/a
GPano:FirstPhotoDate Tanggal Tidak n/a Tanggal dan waktu pembuatan gambar pertama dalam fotosfer. skala/pangkas: Tidak ada perubahan.
GPano:LastPhotoDate Tanggal Tidak n/a Tanggal dan waktu pembuatan gambar terakhir dalam fotosfer. skala/pangkas: Tidak ada perubahan.
GPano:SourcePhotosCount Integer Tidak n/a Jumlah gambar sumber yang digunakan untuk membuat fotosfer. skala/pangkas: Tidak ada perubahan.
GPano:ExposureLockUsed Boolean Tidak n/a Bila foto sumber direkam satu persatu, apakah setelan eksposur’ kamera dikunci atau tidak. n/a
GPano:CroppedAreaImageWidthPixels Integer Ya n/a Lebar asal gambar dalam piksel (sama dengan lebar gambar’ sesungguhnya untuk gambar yang tidak diedit). skala/pangkas: Properti ini perlu diperbarui untuk mencerminkan ukuran gambar yang baru.
GPano:CroppedAreaImageHeightPixels Integer Ya n/a Tinggi asal gambar dalam piksel (sama dengan tinggi’ gambar sesungguhnya untuk gambar yang tidak diedit). skala/pangkas: Properti ini perlu diperbarui untuk mencerminkan ukuran gambar yang baru.
GPano:FullPanoWidthPixels Integer Ya n/a Lebar gambar asal sebelum dipangkas. Jika hanya sebagian fotosfer yang direkam, ini menetapkan lebar fotosfer penuh. pangkas: Tidak ada perubahan.
skala: Properti ini perlu diskalakan sebagaimana mestinya.
GPano:FullPanoHeightPixels Integer Ya n/a Tinggi gambar asal sebelum dipangkas. Jika hanya sebagian fotosfer yang direkam, ini akan menetapkan tinggi seharusnya fotosfer penuh. pangkas: Tidak ada perubahan.
skala: Properti ini perlu diskalakan sebagaimana mestinya.
GPano:CroppedAreaLeftPixels Integer Ya n/a Kolom dengan tepi kiri gambar dipangkas dari ukuran fotosfer penuh. pangkas: Jika pangkas kiri gambar diubah, nilai ini harus diperbarui.
skala: Properti ini perlu diskalakan sebagaimana mestinya.
GPano:CroppedAreaTopPixels Integer Ya n/a Baris dengan tepi atas gambar dipangkas dari ukuran fotosfer penuh. pangkas: Jika pangkas atas gambar diubah, nilai ini harus diperbarui.
skala: Properti ini perlu diskalakan sebagaimana mestinya.
GPano:InitialCameraDolly Real Tidak 0 Parameter opsional ini memindah posisi kamera maya sepanjang garis pandang, menjauh dari pusat fotosfer. Posisi permukaan belakang dinyatakan dengan nilai -1.0, sedangkan posisi permukaan depan dinyatakan dengan 1.0. Untuk tampilan normal, parameter ini harus disetel ke 0. n/a

Contoh fotosfer penuh

Non-programmer bisa menambahkan contoh metadata di bawah ini ke fotosfer penuh yang ada (360 derajat x 180 derajat) hanya dengan sedikit modifikasi. Hal ini bisa dilakukan dengan produk penyunting gambar, misalnya Adobe Photoshop.

  1. ubah kekerapan 4000 dan 2000 agar sesuai dengan tinggi dan lebar gambar Anda dalam piksel
  2. perbarui PoseHeadingDegrees jika ingin Google Maps bisa menampilkan fotosfer Anda; jika tidak, Anda juga bisa membuang parameter ini
  3. perbarui atau hilangkan parameter opsional (seperti disebutkan di atas)
<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>

Contoh fotosfer sebagian

<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>

Kesempurnaan pada penyuntingan gambar

Agar sempurna, program yang menampilkan fotosfer dalam penampil harus memeriksa apakah fotosfer asalnya telah diskalakan oleh aplikasi tanpa memperbarui metadata. Ini bisa dilakukan dengan langkah berikut:

  1. pastikan tag CroppedAreaImageWidthPixels sama dengan lebar gambar sesungguhnya
  2. pastikan tag CroppedAreaImageHeightPixels sama dengan tinggi gambar sesungguhnya
  3. jika langkah 1 atau 2 gagal, periksa apakah rasio aspek gambar tetap terjaga
  4. jika langkah 3 gagal, jangan tampilkan gambar sebagai fotosfer karena bentuknya telah diubah dengan cara yang tidak kompatibel sehingga akan mengakibatkan distorsi yang buruk
  5. jika langkah 3 berhasil, rasio aspeknya sama dan semua nilai tag terkait berikut ini yang harus diskalakan agar pas dengan ukuran gambar baru:
    CroppedAreaImageWidthPixels, CroppedAreaImageHeightPixels, FullPanoWidthPixels, FullPanoHeightPixels, CroppedAreaLeftPixels, CroppedAreaRightPixels.

Ringkasan Sudut Euler

Orientasi fotosfer dalam bingkai dunia didefinisikan dengan sudut Euler. Sudut Euler bisa didefinisikan dengan banyak cara. Agar benar, program harus secara ketat mengikuti konvensi sudut Euler yang dijelaskan di sini.

Posisi di atas permukaan bumi’ mendefinisikan "bingkai lokal" XYZ, dalam hal ini Z adalah atas dan ortogonal dengan permukaan bumi’, X adalah timur sebenarnya, dan Y adalah utara sebenarnya. Orientasi ini didefinisikan sesuai dengan "bingkai lokal" tetap ini, dan sudut Euler adalah rotasi sekeliling poros XYZ tetap ini.  Karena itu, orientasi pose tidak didefinisikan pada kutub. Ini berarti fotosfer dengan sudut (0, 0, 0) akan berorientasi sedemikian rupa sehingga piksel tengah menghadap ke utara dengan ekuator fotosfer sejajar dengan permukaan bumi’.

Sudut Euler menyediakan pemetaan dari titik-titik dalam "bingkai fotosfer" (yang diputar) ke titik-titik "bingkai lokal" (yang tetap):
 
Matriks rotasi dibangun dari sudut-sudut Euler sebagai berikut (urutan ini perlu dijaga):

R = R_Z(-heading) * R_X(pitch) * R_Y(roll)

dalam hal ini: R_*(t) adalah rotasi ke kanan mengitari sumbu yang dinamai:

    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.

Urutan ini perlu dipertahankan:

R = R_Z(-heading) * R_X(pitch) * R_Y(roll)

karena rotasi tidak bersifat komutatif.

Perhatikan, sudut arah tujuan sama dengan kepala kompas standar.

Referensi

Adobe XMP standard: http://www.adobe.com/devnet/xmp.html