Android NDK için Google Cardboard hızlı başlangıç kılavuzu

Bu kılavuzda, kendi Sanal Gerçeklik (VR) deneyimlerinizi oluşturmak amacıyla Android için Cardboard SDK'sının nasıl kullanılacağı gösterilmektedir.

Bir akıllı telefonu sanal gerçeklik platformuna dönüştürmek için Cardboard SDK'sını kullanabilirsiniz. Akıllı telefonlar, stereoskopik görüntüleme içeren 3D sahneler gösterebilir, kafa hareketlerini takip edip bunlara tepki verebilir ve kullanıcının görüntüleyici düğmesine ne zaman bastığını algılayarak uygulamalarla etkileşim kurabilir.

Başlamak için, Cardboard SDK'sının temel özelliklerini gösteren bir demo oyun olan HelloCardboard'u kullanacaksınız. Oyunda kullanıcılar, nesneleri bulmak ve toplamak için sanal bir dünyayı tarar. Bu kılavuzda aşağıdakileri nasıl yapacağınız gösterilmektedir:

  • Geliştirme ortamınızı ayarlama
  • Demo uygulamayı indirme ve oluşturma
  • Parametreleri kaydetmek için bir Cardboard gözlüğünün QR kodunu tarayın
  • Kullanıcının kafa hareketlerini takip edin
  • Her bir göz için doğru görüntü projeksiyon matrisini ayarlayarak stereoskopik görüntüler oluşturun

HelloCardboard, Android NDK'yı kullanır. Her yerel yöntem:

  • Benzersiz bir HelloCardboardApp sınıf yöntemiyle sınırlı veya
  • Söz konusu sınıfın bir örneğini oluşturur veya siler

Geliştirme ortamınızı ayarlama

Donanım gereksinimleri:

  • Android 8.0 "Oreo" (API düzeyi 26) veya sonraki sürümleri çalıştıran Android cihazlar
  • Cardboard gözlüğü

Yazılım gereksinimleri:

  • Android Studio 2022.1.1 "Electric Eel" veya sonraki sürümler
  • Android SDK 13.0 "Tiramisu" (API düzeyi 33) veya sonraki sürümler
  • Android NDK çerçevesinin en son sürümü

    Yüklü SDK'ları incelemek veya güncellemek için Tercihler > Görünüm ve Davranış'a gidin

    Sistem Ayarları > Android Studio'daki Android SDK'sı.

Demo uygulamayı indirme ve oluşturma

Cardboard SDK'sı, her gölgelendirici için önceden derlenmiş bir Vulkan başlık dosyası kullanılarak oluşturulur. Sıfırdan başlık oluşturma adımlarını burada bulabilirsiniz.

  1. GitHub'dan Cardboard SDK'sını ve HelloCardboard demo uygulamasını klonlamak için aşağıdaki komutu çalıştırın:

    git clone https://github.com/googlevr/cardboard.git
  2. Android Studio'da Mevcut bir Android Studio projesini aç'ı seçin, ardından Cardboard SDK'sı ve HelloCardboard demo uygulamasının klonlandığı dizini seçin.

    Kodunuz, Android Studio'daki Proje penceresinde görünür.

  3. Cardboard SDK'sını monte etmek için Gradle sekmesindeki (Görünüm > Araç Pencereleri > Gradle) cardboard/:sdk/Tasks/build klasöründe bulunan birleştir seçeneğini çift tıklayın.

  4. Telefonunuzda Çalıştır > Çalıştır...'ı seçerek HelloCardboard demo uygulamasını çalıştırın ve hellocardboard-android hedefini seçin.

QR kodunu tarayın

Cihaz parametrelerini kaydetmek için Cardboard gözlüğünde QR kodunu tarayın:

Kullanıcı "ATLA"ya basarsa ve daha önce kaydedilmiş parametre yoksa Cardboard, Google Cardboard v1 (Google I/O 2014'te kullanıma sunuldu) parametrelerini kaydeder.

Demoyu deneyin

HelloCardboard'da, 3D uzayda jeodezik küreler arayıp toplayabilirsiniz.

Bir küreyi bulmak ve toplamak için:

  1. Kayan bir şekil görene kadar başınızı herhangi bir yönde hareket ettirin.

  2. Doğrudan küreye bakın. Bu da URL'nin renklerinin değişmesine neden olur.

  3. Küreyi "toplama" için Cardboard gözlüğü düğmesine basın.

Cihazı yapılandırma

Kullanıcı, Cardboard gözlüklerini değiştirmek için dişli simgesine dokunduğunda nativeSwitchViewer yöntemi çağrılır. nativeSwitchViewer, CardboardQrCode_scanQrCodeAndSaveDeviceParams numaralı telefonu arar. Bu işlem, izleyicinin QR kodunu taramak için pencereyi açar. QR kodu tarandıktan sonra izleyicinin mercek distorsiyonu ve diğer parametreler güncellenir.

// Called by JNI method
void HelloCardboardApp::SwitchViewer() {
  CardboardQrCode_scanQrCodeAndSaveDeviceParams();
}

Android Studio x86 emülatörünü etkinleştir

Android Studio x86 emülatörüne yönelik derlemek için SDK ve Örnek'teki build.gradle dosyalarından aşağıdaki satırı kaldırın:

abiFilters 'armeabi-v7a', 'arm64-v8a'

Bu, tüm ABI'leri etkinleştirir ve oluşturulan .aar dosyasının boyutunu önemli ölçüde artırır. Daha fazla bilgi için Android ABI'leri bölümüne bakın.

Kafa hareketi izleme

Takip izleme aracı oluşturun

Ana izleyici, HelloCardboardApp oluşturucuda bir kez oluşturulur:

HelloCardboardApp::HelloCardboardApp(JavaVM* vm, jobject obj, jobject asset_mgr_obj) {
  Cardboard_initializeAndroid(vm, obj); // Must be called in constructor
  head_tracker_ = CardboardHeadTracker_create();
}

VrActivity oluşturulduğunda, nativeOnCreate yöntemi çağırılarak HelloCardboardApp sınıfının bir örneği oluşturulur:

public void onCreate(Bundle savedInstance) {
  super.onCreate(savedInstance);
  nativeApp = nativeOnCreate(getAssets());
  //...
}

Takip cihazını duraklatma ve devam ettirme

Ana izleyiciyi duraklatmak, devam ettirmek ve kaldırmak için sırasıyla CardboardHeadTracker_pause(head_tracker_), CardboardHeadTracker_resume(head_tracker_) ve CardboardHeadTracker_destroy(head_tracker_) çağrılmalıdır. "HelloCardboard" uygulamasında bunları nativeOnPause, nativeOnResume ve nativeOnDestroy olarak adlandırıyoruz:

// Code to pause head tracker in hello_cardboard_app.cc

void HelloCardboardApp::OnPause() { CardboardHeadTracker_pause(head_tracker_); }

// Call nativeOnPause in VrActivity
@Override
protected void onPause() {
  super.onPause();
  nativeOnPause(nativeApp);
  //...
}

// Code to resume head tracker in hello_cardboard_app.cc
void HelloCardboardApp::onResume() {
  CardboardHeadTracker_resume(head_tracker_);
  //...
}

// Call nativeOnResume in VrActivity
@Override
protected void onResume() {
  super.onResume();
  //...
  nativeOnResume(nativeApp);
}

// Code to destroy head tracker in hello_cardboard_app.cc
HelloCardboardApp::~HelloCardboardApp() {
  CardboardHeadTracker_destroy(head_tracker_);
  //...
}

// Call nativeOnDestroy in VrActivity
@Override
protected void onDestroy() {
  super.onDestroy();
  nativeOnDestroy(nativeApp);
  nativeApp = 0;
}

Mercek bozulması

Cardboard yeni bir QR kodunu her taradığında, aşağıdaki kod kayıtlı parametreleri okur ve bunları kullanarak lens bozulması nesnesini oluşturur. Böylece, oluşturulan içeriğe uygun lens bozulması uygulanır:

CardboardQrCode_getSavedDeviceParams(&buffer, &size);

CardboardLensDistortion_destroy(lens_distortion_);
lens_distortion_ = CardboardLensDistortion_create(
    buffer, size, screen_width_, screen_height_);

CardboardQrCode_destroy(buffer);

Oluşturma

Cardboard'da içerik oluşturma aşağıdakileri içerir:

  • Doku oluşturma
  • Sol ve sağ gözler için görünüm ve projeksiyon matrisleri alma
  • Oluşturucu oluşturma ve distorsiyon ağını ayarlama
  • Her kare oluşturuluyor

Doku oluşturma

Tüm içerik, sol ve sağ gözler için bölümlere ayrılmış bir doku üzerine çizilir. Bu bölümler sırasıyla _leftEyeTexture ve _rightEyeTexture içinde başlatılır.

void HelloCardboardApp::GlSetup() {
  LOGD("GL SETUP");

  if (framebuffer_ != 0) {
    GlTeardown();
  }

  // Create render texture.
  glGenTextures(1, &texture_);
  glBindTexture(GL_TEXTURE_2D, texture_);
  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, screen_width_, screen_height_, 0,
               GL_RGB, GL_UNSIGNED_BYTE, 0);

  left_eye_texture_description_.texture = texture_;
  left_eye_texture_description_.left_u = 0;
  left_eye_texture_description_.right_u = 0.5;
  left_eye_texture_description_.top_v = 1;
  left_eye_texture_description_.bottom_v = 0;

  right_eye_texture_description_.texture = texture_;
  right_eye_texture_description_.left_u = 0.5;
  right_eye_texture_description_.right_u = 1;
  right_eye_texture_description_.top_v = 1;
  right_eye_texture_description_.bottom_v = 0;

  //...
  CHECKGLERROR("GlSetup");
}

Bu dokular CardboardDistortionRenderer_renderEyeToDisplay öğesine parametre olarak aktarılır.

Sol ve sağ göz için görünüm ve projeksiyon matrislerini alma

İlk olarak, sol ve sağ gözler için göz matrislerini alın:

CardboardLensDistortion_getEyeFromHeadMatrix(
    lens_distortion_, kLeft, eye_matrices_[0]);
CardboardLensDistortion_getEyeFromHeadMatrix(
    lens_distortion_, kRight, eye_matrices_[1]);
CardboardLensDistortion_getProjectionMatrix(
    lens_distortion_, kLeft, kZNear, kZFar, projection_matrices_[0]);
CardboardLensDistortion_getProjectionMatrix(
    lens_distortion_, kRight, kZNear, kZFar, projection_matrices_[1]);

Daha sonra, her bir göz için distorsiyon örgülerini alın ve bunu distorsiyon oluşturucuya iletin:

CardboardLensDistortion_getDistortionMesh(lens_distortion_, kLeft, &left_mesh);
CardboardLensDistortion_getDistortionMesh(lens_distortion_, kRight, &right_mesh);

Oluşturucuyu oluşturun ve doğru distorsiyon ağını ayarlayın

Oluşturucunun yalnızca bir kez başlatılması gerekir. Oluşturucu oluşturulduktan sonra, sol ve sağ gözler için yeni distorsiyon ağını CardboardLensDistortion_getDistortionMesh işlevinden döndürülen örgü değerlerine göre ayarlayın.

distortion_renderer_ = CardboardOpenGlEs2DistortionRenderer_create();
CardboardDistortionRenderer_setMesh(distortion_renderer_, &left_mesh, kLeft);
CardboardDistortionRenderer_setMesh(distortion_renderer_, &right_mesh, kRight);

İçeriği oluşturma

Her çerçeve için CardboardHeadTracker_getPose öğesinden geçerli baş yönünü alın:

CardboardHeadTracker_getPose(head_tracker_, monotonic_time_nano, &out_position[0], &out_orientation[0]);

Her bir göz için bir görünüm projeksiyon matrisi oluşturmak ve içeriği ekranda oluşturmak üzere mevcut baş yönünü görünüm ve projeksiyon matrisleriyle kullanın:

// Draw eyes views
for (int eye = 0; eye < 2; ++eye) {
  glViewport(eye == kLeft ? 0 : screen_width_ / 2, 0, screen_width_ / 2,
             screen_height_);

  Matrix4x4 eye_matrix = GetMatrixFromGlArray(eye_matrices_[eye]);
  Matrix4x4 eye_view = eye_matrix * head_view_;

  Matrix4x4 projection_matrix =
      GetMatrixFromGlArray(projection_matrices_[eye]);
  Matrix4x4 modelview_target = eye_view * model_target_;
  modelview_projection_target_ = projection_matrix * modelview_target;
  modelview_projection_room_ = projection_matrix * eye_view;

  // Draw room and target. Replace this to render your own content.
  DrawWorld();
}

Bozulma düzeltmesini içeriğe uygulamak ve içeriği ekrana oluşturmak için CardboardDistortionRenderer_renderEyeToDisplay kullanın.

// Render
CardboardDistortionRenderer_renderEyeToDisplay(
    distortion_renderer_, /* target_display = */ 0, /* x = */ 0, /* y = */ 0,
    screen_width_, screen_height_, &left_eye_texture_description_,
    &right_eye_texture_description_);