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.
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
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.
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.
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:
Kayan bir şekil görene kadar başınızı herhangi bir yönde hareket ettirin.
Doğrudan küreye bakın. Bu da URL'nin renklerinin değişmesine neden olur.
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_);