این راهنما به شما نشان می دهد که چگونه از Cardboard SDK برای iOS برای ایجاد تجربیات واقعیت مجازی (VR) خود استفاده کنید.
می توانید از Cardboard SDK برای تبدیل گوشی هوشمند به پلتفرم VR استفاده کنید. یک گوشی هوشمند میتواند صحنههای سه بعدی را با رندر استریوسکوپیک نمایش دهد، حرکات سر را ردیابی کند و به آن واکنش نشان دهد، و با تشخیص زمانی که کاربر دکمه بیننده را فشار میدهد، با برنامهها تعامل داشته باشد.
برای شروع، از HelloCardboard، یک بازی آزمایشی که ویژگی های اصلی Cardboard SDK را نشان می دهد، استفاده خواهید کرد. در این بازی، کاربران برای یافتن و جمع آوری اشیاء به دنیای مجازی نگاه می کنند. به شما نشان می دهد که چگونه:
- محیط توسعه خود را تنظیم کنید
- برنامه دمو را دانلود و بسازید
- کد QR یک نمایشگر Cardboard را اسکن کنید تا پارامترهای آن ذخیره شود
- ردیابی حرکات سر کاربر
- با تنظیم اعوجاج صحیح برای هر چشم، تصاویر استریوسکوپی را ارائه دهید
محیط توسعه خود را تنظیم کنید
الزامات سخت افزاری:
- آیفون دارای iOS 12.0 یا بالاتر
- نمایشگر مقوا
نرم افزار مورد نیاز:
- Xcode 12.5 یا بالاتر
- CocoaPods 1.9 یا بالاتر
برنامه دمو را دانلود و بسازید
Cardboard SDK با استفاده از فایل های منبع از پیش کامپایل شده Protocol Buffers C++ ساخته شده است. مراحل ساخت فایل های منبع از ابتدا را می توانید در اینجا بیابید.
با اجرای این دستور، Cardboard SDK و برنامه آزمایشی Hello Cardboard را از GitHub کلون کنید:
git clone https://github.com/googlevr/cardboard.git
با اجرای این دستور در ریشه مخزن، وابستگی Protocol Buffers را در پروژه Xcode نصب کنید:
pod install
فضای کاری Cardboard (
Cardboard.xcworkspace
) را در Xcode باز کنید.شناسه بسته نرم افزاری را تغییر دهید تا بتوانید برنامه را با تیم خود امضا کنید.
به SDK > Build Phases > Link Binary With Libraries بروید
-
libPods-sdk.a
با انتخاب آن و کلیک بر روی دکمه '-' از لیست حذف کنید. -
libProtobuf-C++.a
با کلیک بر روی دکمه '+' و انتخاب آن به لیست اضافه کنید. در صورتی که پیامی مبنی بر استفاده از XCFramework ظاهر شد، بر روی "Add Anyway" کلیک کنید.
-
روی Run کلیک کنید.
کد QR را اسکن کنید
برای ذخیره پارامترهای دستگاه، کد QR را در نمایشگر Cardboard اسکن کنید:
نسخه ی نمایشی را امتحان کنید
در HelloCardboard، کره های ژئودزیکی را در فضای سه بعدی جستجو و جمع آوری خواهید کرد.
برای پیدا کردن و جمع آوری یک کره:
سر خود را به هر جهتی حرکت دهید تا زمانی که یک کره شناور ببینید.
به طور مستقیم به کره نگاه کنید. این باعث تغییر رنگ آن می شود.
دکمه نمایشگر Cardboard را برای "جمع آوری" کره فشار دهید.
دستگاه را پیکربندی کنید
هنگامی که کاربر برای تغییر بینندگان Cardboard روی نماد چرخدنده ضربه میزند، روش didTapSwitchButton
در HelloCardboardOverlayView
فراخوانی میشود.
- (void)didTapSwitchButton:(id)sender {
if ([self.delegate respondsToSelector:@selector(didTapBackButton)]) {
[self.delegate didChangeViewerProfile];
}
self.settingsBackgroundView.hidden = YES;
}
CardboardQrCode_scanQrCodeAndSaveDeviceParams
را فراخوانی می کند که پنجره اسکن کد QR بیننده را باز می کند. هنگامی که کاربر کد QR را اسکن می کند، پارامترهای اعوجاج دستگاه به روز می شوند.
- (void)switchViewer {
CardboardQrCode_scanQrCodeAndSaveDeviceParams();
}
- (void)didChangeViewerProfile {
[self pauseCardboard];
[self switchViewer];
[self resumeCardboard];
}
ردیابی سر
ایجاد ردیاب سر
ردیاب سر یک بار در روش viewDidLoad
HelloCardboardViewController
ایجاد می شود:
_cardboardHeadTracker = CardboardHeadTracker_create();
مکث و از سرگیری ردیاب سر
متدهای pauseCardboard
و resumeCardboard
در کلاس HelloCardboardViewController
به ترتیب ردیاب سر را متوقف و از سر می گیرند. resumeCardboard
همچنین پرچم _updateParams
را تنظیم می کند که باعث می شود پارامترهای دستگاه در تماس قرعه کشی بعدی به روز شوند.
- (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;
}
اعوجاج لنز
هر بار که Cardboard یک کد QR جدید را اسکن میکند، کد زیر پارامترهای ذخیرهشده را میخواند و از آنها برای ایجاد شی اعوجاج لنز استفاده میکند، که اعوجاج لنز مناسب را روی محتوای رندر شده اعمال میکند:
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));
رندرینگ
ارائه محتوا در Cardboard شامل موارد زیر است:
- ایجاد بافت
- دریافت ماتریس های دید و طرح ریزی برای چشم چپ و راست
- ایجاد رندر و تنظیم مش اعوجاج
- رندر کردن هر فریم
بافت ایجاد کنید
محتوا روی یک بافت کشیده می شود که به بخش هایی برای چشم چپ و راست تقسیم می شود. این بخش ها به ترتیب در _leftEyeTexture
و _rightEyeTexture
مقداردهی اولیه می شوند. اپلیکیشن نمونه از یک بافت برای هر دو چشم استفاده می کند، اما امکان ایجاد بافت مجزا برای هر چشم نیز وجود دارد.
// 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");
این بافت ها به عنوان پارامتر به CardboardDistortionRenderer_renderEyeToDisplay
منتقل می شوند.
ماتریس های دید و طرح ریزی را برای چشم چپ و راست دریافت کنید
ابتدا ماتریس های چشم را برای چشم چپ و راست بازیابی کنید:
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]);
در مرحله بعد، مش های اعوجاج را برای هر یک از چشم ها دریافت کنید و آن را به رندر اعوجاج ارسال کنید:
CardboardLensDistortion_getDistortionMesh(_lensDistortion, kLeft, &leftMesh);
CardboardLensDistortion_getDistortionMesh(_lensDistortion, kRight, &rightMesh);
رندر را ایجاد کنید و مش اعوجاج درست را تنظیم کنید
رندر فقط یک بار باید مقداردهی اولیه شود. پس از ایجاد رندر، مش اعوجاج جدید را برای چشم چپ و راست مطابق با مقادیر مش برگردانده شده از تابع CardboardLensDistortion_getDistortionMesh
تنظیم کنید.
_distortionRenderer = CardboardOpenGlEs2DistortionRenderer_create();
CardboardDistortionRenderer_setMesh(_distortionRenderer, &leftMesh, kLeft);
CardboardDistortionRenderer_setMesh(_distortionRenderer, &rightMesh, kRight);
ارائه محتوا
جهت گیری سر فعلی را از CardboardHeadTracker_getPose
بازیابی کنید:
CardboardHeadTracker_getPose(_headTracker, targetTime, position, orientation);
_headView =
GLKMatrix4Multiply(GLKMatrix4MakeTranslation(position[0], position[1], position[2]),
GLKMatrix4MakeWithQuaternion(GLKQuaternionMakeWithArray(orientation)));
از جهت گیری سر فعلی با ماتریس های نما و طرح ریزی برای ایجاد یک ماتریس نمایان استفاده کنید و از آنها برای ارائه محتوای جهان برای هر یک از چشم ها استفاده کنید:
// 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]));
از CardboardDistortionRenderer_renderEyeToDisplay
برای اعمال تصحیح اعوجاج روی محتوا و رندر محتوا روی صفحه استفاده کنید.
CardboardDistortionRenderer_renderEyeToDisplay(_distortionRenderer, renderTarget, /*x=*/0,
/*y=*/0, _width, _height, &_leftEyeTexture,
&_rightEyeTexture);