Bu kılavuz, kendi sanal gerçeklik (VR) deneyimlerinizi oluşturmak için Android'de Cardboard SDK'sını nasıl kullanacağınızı gösterir.
Cardboard SDK'sını kullanarak akıllı telefonu VR platformuna dönüştürebilirsiniz. Akıllı telefonlar, stereoskopik oluşturma ile 3D sahneler gösterebilir, baş hareketlerini takip edip bunlara tepki verebilir ve kullanıcının görüntüleyici düğmesine bastığını algılayarak uygulamalarla etkileşimde bulunabilir.
Başlamak için Cardboard SDK'nın temel özelliklerini gösteren bir demo oyunu olan HelloCardboard'u kullanacaksınız. Kullanıcılar, oyunda nesneleri bulup toplamak için sanal bir dünyada etraflarına bakarlar. Bu rehberde, aşağıdakileri nasıl yapacağınız açıklanmaktadır:
- Geliştirme ortamınızı kurma
- Demo uygulamasını indirip oluşturma
- Parametrelerini kaydetmek için Cardboard görüntüleyicinin QR kodunu tarayın
- Kullanıcının baş 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:
- Benzersiz şekilde bir
HelloCardboardApp
sınıf yöntemiyle sınırlanmışsa veya - Bu sınıfın bir örneğini oluşturur veya siler.
Geliştirme ortamınızı kurma
Donanım gereksinimleri:
- Android 8.0 "Oreo" (API düzeyi 26) veya daha yeni bir sürümün yüklü olduğu Android cihaz
- Cardboard gözlüğü
Yazılım gereksinimleri:
- Android Studio 2024.1.2 "Koala Feature Drop" veya sonraki sürümler
- Android SDK 15.0 "Vanilla Ice Cream" (API düzeyi 35) 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.
Android Studio'da System Settings (Sistem Ayarları) > Android SDK'yı seçin.
Demo uygulamasını indirip oluşturma
Cardboard SDK, her gölgelendirici için önceden derlenmiş bir Vulkan başlık dosyası kullanılarak oluşturulur. Başlık dosyalarını sıfırdan oluşturma adımlarını burada bulabilirsiniz.
Cardboard SDK'sını ve HelloCardboard demo uygulamasını GitHub'dan klonlamak için aşağıdaki komutu çalıştırın:
git clone https://github.com/googlevr/cardboard.git
Android Studio'da Open an existing Android Studio Project'i (Mevcut bir Android Studio projesini aç) seçin, ardından Cardboard SDK'sının ve HelloCardboard demo uygulamasının klonlandığı dizini seçin.
Kodunuz Android Studio'daki Proje penceresinde görünür.
Cardboard SDK'yı birleştirmek için Gradle sekmesindeki (Görünüm > Araç Pencereleri > Gradle) cardboard/:sdk/Tasks/build klasöründe assemble seçeneğini çift tıklayın.
Run (Çalıştır) > Run... (Çalıştır...) seçeneğini belirleyip
hellocardboard-android
hedefi seçerek HelloCardboard demo uygulamasını telefonunuzda çalıştırın.
QR kodunu tarayın
Cihaz parametrelerini kaydetmek için Cardboard görüntüleyicideki QR kodunu tarayın:
Kullanıcı "ATLA" düğmesine 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üreleri arayıp toplarsınız.
Bir küreyi bulup toplamak için:
Kayan bir şekil görene kadar başınızı herhangi bir yönde hareket ettirin.
Doğrudan küreye bakın. Bu durum, renginin değişmesine neden olur.
Küreyi "toplamak" için Cardboard gözlük düğmesine basın.
Cihazı yapılandırma
Kullanıcı, Cardboard görüntüleyicileri arasında geçiş yapmak için dişli simgesine dokunduğunda nativeSwitchViewer
yöntemi çağrılır. nativeSwitchViewer
görüşmesi
CardboardQrCode_scanQrCodeAndSaveDeviceParams
seçeneğini tıklayın. Bu seçenek, izleyicinin QR kodunu tarayabileceğiniz pencereyi açar. QR kodu tarandıktan sonra izleyicinin lens bozulması ve diğer parametreleri güncellenir.
// Called by JNI method
void HelloCardboardApp::SwitchViewer() {
CardboardQrCode_scanQrCodeAndSaveDeviceParams();
}
Android Studio x86 emülatörünü etkinleştirme
Android Studio x86 emülatörü için derleme yapmak üzere SDK ve Sample'daki build.gradle
dosyalarından aşağıdaki satırı kaldırın:
abiFilters 'armeabi-v7a', 'arm64-v8a'
Bu seçenek 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 başlıklı makaleyi inceleyin.
Baş takibi
Baş takip cihazı oluşturma
Başlık izleyici, HelloCardboardApp
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, 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());
//...
}
Baş takibini duraklatma ve devam ettirme
Kafa izleyiciyi duraklatmak, devam ettirmek ve yok etmek 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;
}
Lens bozulması
Cardboard her yeni QR kodunu taradığında aşağıdaki kod, kaydedilen parametreleri okur ve bunları, oluşturulan içeriğe uygun lens bozulmasını uygulayan lens bozulması nesnesini oluşturmak için kullanı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ğıdaki adımları içerir:
- Doku oluşturma
- Sol ve sağ göz için görünüm ve projeksiyon matrislerini alma
- Oluşturucuyu oluşturma ve bozulma ağını ayarlama
- Her kareyi oluşturma
Doku oluşturma
Tüm içerikler, sol ve sağ göz 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
parametreleri olarak iletilir.
Sol ve sağ göz için görünüm ve projeksiyon matrislerini alma
Öncelikle sol ve sağ göz 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]);
Ardından, her bir göz için bozulma ağlarını alın ve bozulma oluşturucuya iletin:
CardboardLensDistortion_getDistortionMesh(lens_distortion_, kLeft, &left_mesh);
CardboardLensDistortion_getDistortionMesh(lens_distortion_, kRight, &right_mesh);
Oluşturucuyu oluşturma ve doğru bozulma ağını ayarlama
Oluşturucunun yalnızca bir kez başlatılması gerekir. Oluşturucu oluşturulduktan sonra, CardboardLensDistortion_getDistortionMesh
işlevinden döndürülen ağ değerlerine göre sol ve sağ göz için yeni bozulma ağını 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 kare için mevcut kafa yönünü CardboardHeadTracker_getPose
konumundan alın:
CardboardHeadTracker_getPose(head_tracker_, monotonic_time_nano, &out_position[0], &out_orientation[0]);
Görünüm ve projeksiyon matrisleriyle birlikte mevcut baş yönünü kullanarak her bir göz için bir görünüm projeksiyon matrisi oluşturun ve içeriği ekranda oluşturun:
// 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 ekranda 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_);