Panduan Memulai untuk Google Cardboard untuk iOS

Panduan ini menunjukkan cara menggunakan Cardboard SDK untuk iOS untuk membuat pengalaman Realitas Virtual (VR) Anda sendiri.

Anda dapat menggunakan Cardboard SDK untuk mengubah smartphone menjadi platform VR. Smartphone dapat menampilkan adegan 3D dengan rendering stereoskopis, melacak dan bereaksi terhadap gerakan kepala, serta berinteraksi dengan aplikasi dengan mendeteksi kapan pengguna menekan tombol penampil.

Untuk memulai, Anda akan menggunakan HelloCardboard, game demo yang menunjukkan fitur inti dari Cardboard SDK. Dalam game, pengguna melihat-lihat dunia virtual untuk menemukan dan mengumpulkan objek. Ini menunjukkan kepada Anda cara:

  • Menyiapkan lingkungan pengembangan
  • Mendownload dan membuat aplikasi demo
  • Pindai kode QR penampil Cardboard untuk menyimpan parameternya
  • Melacak gerakan kepala pengguna
  • Merender gambar stereoskopis dengan mengatur distorsi yang benar untuk setiap mata

Menyiapkan lingkungan pengembangan

Persyaratan hardware:

  • iPhone yang menjalankan iOS versi 12.0 atau yang lebih tinggi
  • Penampil kardus

Persyaratan perangkat lunak:

Mendownload dan membuat aplikasi demo

Cardboard SDK dibuat menggunakan file sumber C++ Buffering Protokol yang telah dikompilasi sebelumnya. Langkah-langkah untuk mem-build file sumber dari awal dapat ditemukan di sini.

  1. Clone SDK Cardboard dan aplikasi demo Hello Cardboard dari GitHub dengan menjalankan perintah ini:

    git clone https://github.com/googlevr/cardboard.git
  2. Instal dependensi Protocol Buffers ke dalam project Xcode dengan menjalankan perintah ini di root repositori:

    pod install
  3. Buka ruang kerja Cardboard (Cardboard.xcworkspace) di Xcode.

  4. Ubah ID paket aplikasi agar Anda dapat menandatangani aplikasi dengan tim.

  5. Buka SDK > Build Phases > Link Binary With Libraries

    1. Hapus libPods-sdk.a dari daftar dengan memilihnya lalu mengklik tombol '-'.
    2. Tambahkan libProtobuf-C++.a ke daftar dengan mengklik tombol '+' lalu memilihnya. Jika muncul pesan yang menyarankan penggunaan XCFramework, klik "Add Anyway".
  6. Klik Run.

Pindai kode QR

Untuk menyimpan parameter perangkat, pindai kode QR pada penampil Cardboard:

Coba demo

Di HelloCardboard, Anda akan mencari dan mengumpulkan bola geodesi dalam ruang 3D.

Untuk menemukan dan mengumpulkan bola dunia:

  1. Gerakkan kepala ke segala arah sampai Anda melihat bola mengambang.

  2. Lihat langsung bola dunia. Hal ini menyebabkannya berubah warna.

  3. Tekan tombol penampil Cardboard untuk "mengumpulkan" bola.

Mengonfigurasi perangkat

Ketika pengguna mengetuk ikon roda gigi untuk beralih penampil Cardboard, metode didTapSwitchButton akan dipanggil di HelloCardboardOverlayView.

- (void)didTapSwitchButton:(id)sender {
  if ([self.delegate respondsToSelector:@selector(didTapBackButton)]) {
    [self.delegate didChangeViewerProfile];
  }
  self.settingsBackgroundView.hidden = YES;
}

Tindakan ini akan memanggil CardboardQrCode_scanQrCodeAndSaveDeviceParams, yang membuka jendela untuk memindai kode QR pengguna. Saat pengguna memindai kode QR, parameter distorsi perangkat akan diperbarui.

- (void)switchViewer {
  CardboardQrCode_scanQrCodeAndSaveDeviceParams();
}

- (void)didChangeViewerProfile {
  [self pauseCardboard];
  [self switchViewer];
  [self resumeCardboard];
}

Pelacakan gerak kepala

Buat pelacak kepala

Pelacak kepala dibuat satu kali dalam metode viewDidLoad dari HelloCardboardViewController:

_cardboardHeadTracker = CardboardHeadTracker_create();

Menjeda dan melanjutkan pelacak kepala

Metode pauseCardboard dan resumeCardboard di class HelloCardboardViewController masing-masing menjeda dan melanjutkan pelacak head. resumeCardboard juga menetapkan tanda _updateParams, yang menyebabkan parameter perangkat diperbarui pada panggilan gambar berikutnya.

- (void)pauseCardboard {
  self.paused = true;
  CardboardHeadTracker_pause(_cardboardHeadTracker);
}

- (void)resumeCardboard {
  // Parameters may have changed.
  _updateParams = YES;

  // Check for device parameters existence in app storage. If they're missing,
  // we must scan a Cardboard QR code and save the obtained parameters.
  uint8_t *buffer;
  int size;
  CardboardQrCode_getSavedDeviceParams(&buffer, &size);
  if (size == 0) {
    [self switchViewer];
  }
  CardboardQrCode_destroy(buffer);

  CardboardHeadTracker_resume(_cardboardHeadTracker);
  self.paused = false;
}

Distorsi lensa

Setiap kali Cardboard memindai kode QR baru, kode berikut membaca parameter yang disimpan dan menggunakannya untuk membuat objek distorsi lensa, yang menerapkan distorsi lensa yang tepat ke konten yang dirender:

CardboardQrCode_getSavedDeviceParams(&encodedDeviceParams, &size);

// Create CardboardLensDistortion.
CardboardLensDistortion_destroy(_cardboardLensDistortion);
_cardboardLensDistortion =
    CardboardLensDistortion_create(encodedDeviceParams, size, width, height);

// Initialize HelloCardboardRenderer.
_renderer.reset(new cardboard::hello_cardboard::HelloCardboardRenderer(
      _cardboardLensDistortion, _cardboardHeadTracker, width, height));

Rendering

Merender konten di Cardboard melibatkan hal berikut:

  • Membuat tekstur
  • Mendapatkan matriks tampilan dan proyeksi untuk mata kiri dan kanan
  • Membuat perender dan menyetel mesh distorsi
  • Merender setiap frame

Membuat tekstur

Konten digambar pada tekstur, yang dibagi menjadi beberapa bagian untuk mata kiri dan kanan. Bagian ini masing-masing diinisialisasi di _leftEyeTexture dan _rightEyeTexture. Aplikasi contoh menggunakan tekstur tunggal untuk kedua mata, tetapi juga dapat membuat tekstur terpisah untuk setiap mata.

// Generate texture to render left and right eyes.
glGenTextures(1, &_eyeTexture);
glBindTexture(GL_TEXTURE_2D, _eyeTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, _width, _height, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);

_leftEyeTexture.texture = _eyeTexture;
_leftEyeTexture.left_u = 0;
_leftEyeTexture.right_u = 0.5;
_leftEyeTexture.top_v = 1;
_leftEyeTexture.bottom_v = 0;

_rightEyeTexture.texture = _eyeTexture;
_rightEyeTexture.left_u = 0.5;
_rightEyeTexture.right_u = 1;
_rightEyeTexture.top_v = 1;
_rightEyeTexture.bottom_v = 0;
CheckGLError("Create Eye textures");

Tekstur ini diteruskan sebagai parameter ke CardboardDistortionRenderer_renderEyeToDisplay.

Mendapatkan matriks tampilan dan proyeksi untuk mata kiri dan kanan

Pertama, ambil matriks mata untuk mata kiri dan kanan:

CardboardLensDistortion_getEyeFromHeadMatrix(_lensDistortion, kLeft, _eyeMatrices[kLeft]);
CardboardLensDistortion_getEyeFromHeadMatrix(_lensDistortion, kRight, _eyeMatrices[kRight]);
CardboardLensDistortion_getProjectionMatrix(_lensDistortion, kLeft, kZNear, kZFar,
                                            _projMatrices[kLeft]);
CardboardLensDistortion_getProjectionMatrix(_lensDistortion, kRight, kZNear, kZFar,
                                            _projMatrices[kRight]);

Selanjutnya, dapatkan mesh distorsi untuk setiap mata dan teruskan ke perender distorsi:

CardboardLensDistortion_getDistortionMesh(_lensDistortion, kLeft, &leftMesh);
CardboardLensDistortion_getDistortionMesh(_lensDistortion, kRight, &rightMesh);

Membuat perender dan menyetel mesh distorsi yang benar

Perender hanya perlu diinisialisasi sekali. Setelah perender dibuat, setel mesh distorsi baru untuk mata kiri dan kanan sesuai dengan nilai mesh yang ditampilkan dari fungsi CardboardLensDistortion_getDistortionMesh.

_distortionRenderer = CardboardOpenGlEs2DistortionRenderer_create();
CardboardDistortionRenderer_setMesh(_distortionRenderer, &leftMesh, kLeft);
CardboardDistortionRenderer_setMesh(_distortionRenderer, &rightMesh, kRight);

Merender konten

Ambil orientasi kepala saat ini dari CardboardHeadTracker_getPose:

CardboardHeadTracker_getPose(_headTracker, targetTime, position, orientation);
_headView =
    GLKMatrix4Multiply(GLKMatrix4MakeTranslation(position[0], position[1], position[2]),
                       GLKMatrix4MakeWithQuaternion(GLKQuaternionMakeWithArray(orientation)));

Gunakan orientasi kepala saat ini dengan matriks tampilan dan proyeksi untuk menyusun matriks proyeksi tampilan, dan gunakan untuk merender konten dunia untuk setiap mata:

// Draw left eye.
glViewport(0, 0, _width / 2.0, _height);
glScissor(0, 0, _width / 2.0, _height);
DrawWorld(_leftEyeViewPose, GLKMatrix4MakeWithArray(_projMatrices[kLeft]));

// Draw right eye.
glViewport(_width / 2.0, 0, _width / 2.0, _height);
glScissor(_width / 2.0, 0, _width / 2.0, _height);
DrawWorld(_rightEyeViewPose, GLKMatrix4MakeWithArray(_projMatrices[kRight]));

Gunakan CardboardDistortionRenderer_renderEyeToDisplay untuk menerapkan koreksi distorsi pada konten, dan merender konten ke layar.

CardboardDistortionRenderer_renderEyeToDisplay(_distortionRenderer, renderTarget, /*x=*/0,
                                               /*y=*/0, _width, _height, &_leftEyeTexture,
                                               &_rightEyeTexture);