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

Bu kılavuzda, Cardboard SDK'sının nasıl kullanılacağı gösterilmektedir kendi Sanal Gerçeklik (VR) deneyimlerinizi oluşturmasını sağlar.

Akıllı telefonları sanal gerçeklik platformuna dönüştürmek için Cardboard SDK'sını kullanabilirsiniz. Akıllı telefon stereoskopik oluşturma ile 3D sahneleri görüntüleyebilir, kafa hareketlerini izleyebilir ve kafa hareketlerine tepki verebilir, ve kullanıcının görüntüleyici düğmesine ne zaman bastığını algılayarak uygulamalarla etkileşimde bulunmalarını sağlayın.

Başlamak için temel özellikleri gösteren bir demo oyun olan HelloCardboard'u kullanacaksınız. özellikleri hakkında daha fazla bilgi edinin. Kullanıcılar oyunda sanal bir dünyada dolaşarak nesneleri toplamanızı sağlar. Bu kılavuzda şunları nasıl yapacağınız gösterilmektedir:

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

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

  • HelloCardboardApp sınıfı bir yöntemle benzersiz olarak sınırlıdır veya
  • İlgili sınıfın bir örneğini oluşturur veya siler

Geliştirme ortamınızı ayarlama

Donanım gereksinimleri:

ziyaret edin.

Yazılım gereksinimleri:

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

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

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

Demo uygulamayı indirme ve oluşturma

Cardboard SDK, önceden derlenmiş bir Vulkan dosyası kullanılarak oluşturulmuştur başlık dosyasına sahip olursunuz. Sıfırdan başlık dosyalarını oluşturmak için gereken adımları bulabilirsiniz burada bulabilirsiniz.

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

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

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

  3. Cardboard SDK'sını derlemek için uygulamanın içindeki derle seçeneğini çift tıklayın. Gradle sekmesindeki cardboard/:sdk/Tasks/build klasörü (Görünüm > Araç Windows > Gradle).

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

QR kodunu tarayın

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

Kullanıcı "ATLA"ya basarsa daha önce kaydedilmiş parametre olmadığından Cardboard, Google Cardboard v1 (Google I/O 2014'te kullanıma sunuldu) parametreleri.

Demoyu deneyin

HelloCardboard'da 3D uzayda jeodezik küreler arayıp toplayacaksınız.

Bir küre 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, renk değişikliğine neden olur.

  3. "Toplama" için Cardboard gözlüğü düğmesine basın yer alır.

Cihazı yapılandırma

Kullanıcı Cardboard gözlüğünü değiştirmek için dişli simgesine dokunduğunda nativeSwitchViewer yöntemi çağrılır. nativeSwitchViewer arama CardboardQrCode_scanQrCodeAndSaveDeviceParams, taranacak pencereyi açar İzleyicinin QR kodu. İzleyicinin lens bozulması ve diğer parametreler bir kez güncellenir QR kodu taranır.

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

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

Android Studio x86 emülatörü için geliştirme yapmak üzere SDK'da build.gradle dosya ve Örnek:

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

Bu, tüm ABI'leri etkinleştirir ve oluşturulan ABI'lerin boyutunu önemli ölçüde artırır. .aar dosyası yükleyin. Android ABI'lerini göster konulu videomuzu izleyin.

Baş takibi

Baş takip cihazı oluştur

Ana izleyici, HelloCardboardApp öğesinin oluşturucusunda 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 HelloCardboardApp sınıfının bir örneği oluşturulur nativeOnCreate yöntemini çağırarak:

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

Baş takip cihazını duraklat ve devam ettir

Baş takip cihazını duraklatmak, devam ettirmek ve kaldırmak için: CardboardHeadTracker_pause(head_tracker_), CardboardHeadTracker_resume(head_tracker_), Sırasıyla ve CardboardHeadTracker_destroy(head_tracker_) çağrılmalıdır. "HelloCardboard" bu uygulamaya nativeOnPause, nativeOnResume ve nativeOnDestroy:

// 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;
}

Lens bozulması

Cardboard her yeni QR kodu taradığında aşağıdaki kod kayıtlı parametreleri okur bunları, uygun lens bozulmasını uygulayan lens distorsiyonu nesnesini oluşturmak için kullanır. ekleyin:

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 süreci şu şekildedir:

  • Doku oluşturma
  • Sol ve sağ gözler için görüntüleme ve projeksiyon matrislerini elde etme
  • Oluşturucuyu 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 dillerinde başlatıldı.

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üntüleme ve projeksiyon matrislerini öğrenin

İlk olarak, sol ve sağ gözlere ilişkin 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 distorsiyon oluşturucuya iletin:

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

Oluşturucuyu oluşturma ve doğru distorsiyon ağını ayarlama

Oluşturucunun yalnızca bir kez başlatılması gerekir. Oluşturucu oluşturulduktan sonra, yeni CardboardLensDistortion_getDistortionMesh işlevi.

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

İçeriği oluşturma

Her kare için CardboardHeadTracker_getPose kaynağından geçerli baş yönünü alın:

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

Görünüm oluşturmak için görünüm ve projeksiyon matrisleriyle mevcut baş yönünü kullanın görüntüler ve içeriği ekranda oluşturur:

// 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();
}

Bozulmayı uygulamak için CardboardDistortionRenderer_renderEyeToDisplay öğesini kullanın düzeltme ve içeriği ekrana görüntüleme.

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