在此范例中,您将学习如何创建一个基本的移动设备应用。其功能包括用手指拖放、缩放和旋转3D模型,并将其置于个性化的图片上。用户可以随机拍摄一张照片,然后立即把它作为跟踪目标图片,并把3D模型(本文中使用metaio man、椅子和电视)放置在此图片上。本范例一共使用三种手势操作,包括拖放、缩放和旋转。这些手势可以共同使用,也可以单独启用。用户可随时对画面进行截屏,也可随时重新开启摄像头。
下面为此范例工作流程:
- 摄像头启动后使用GPS跟踪
- 设置坐标系偏移量(如果您使用ORIENTATION_FLOOR,则不需要再设置偏移量)
- 拍张照片并把其作为跟踪参考图片
- 加载空跟踪配置文件
- (使用手势)把3D模型随意摆放在跟踪照片上
- 截屏
- 通过清除跟踪参考图片并开启摄像头来重置应用
材料
此范例所用的材料位于/tutorialContent_crossplatform/TutorialInteractiveFurniture/Assets文件夹中,具体如下:
- metaioman.md2, tv.obj, screen.obj, stuhl.obj分别是metaio man、电视、屏幕和椅子的模型文件
- 模型的贴图文件名和模型一致,扩展名为png或jpg
- sintel.3g2是视频文件
- TrackingData_GPSCompass.xml是GPS跟踪配置文件;而TrackingData_Dummy.xml是空跟踪配置文件
实现方法
使用GPS跟踪时,跟踪坐标系原点位于摄像头。所以如果想要方便的观测到跟踪坐标系中的虚拟模型,您需要设置跟踪坐标系偏移量。在AREL中,此偏移量是在XML配置文件中设置的- // java
- TrackingValues pose = new TrackingValues();
- pose.setTranslation(new Vector3d(0, 0, -140));
- m_metaioSDK.setCosOffset(1, pose);
复制代码- // objective c
- metaio::TrackingValues pose;
- pose.translation = metaio::Vector3d(0, 0, -140);
- m_metaioSDK->setCosOffset(1, pose);
复制代码 注意:如果您使用ORENTATION_FLOOR跟踪模式,则不需要再对跟踪坐标系设置偏移量
此功能可通过调用requestCameraImage()来实现,所拍摄的照片会传递到回调函数onCameraImageSaved()中。在AREL中,此功能暂时无法实现,所以我们使用freezeTracking()来停止摄像头工作- // java
- m_metaioSDK.requestCameraImage(imagepath, mCameraResolution.getX(), mCameraResolution.getY());
复制代码- // objective c
- m_metaioSDK->requestCameraImage([filePath UTF8String], 320, 240);
复制代码- // javascript
- arel.Scene.setFreezeTracking(true);
复制代码 回调函数- // java
- public void onCameraImageSaved(String filepath)
复制代码- // objective c
- - (void) onCameraImageSaved: (NSString*) filepath
复制代码
照片被存到指定文件夹之后,我们就可以用它作为空跟踪的目标参考图片了。要设置图片作为跟踪参考,您可以直接调用setImage(),代码如下:- // java
- m_metaioSDK.setImage(filepath);
复制代码- // objective c
- m_metaioSDK->setImage([filepath UTF8String]);
复制代码
保存移动设备的屏幕截图有两种方法:您可以直接从view中读取内存,并把它存为图像;更简单的方法是,使用SDK提供的API来截取屏幕画面。截屏时只需调用requestScreenshot(),其参数为截图的存储位置,可以设为空。这样,所截取的屏幕画面能在回调函数onScreenshot()中获取。
使用AREL时,用户可以截取屏幕图画并将其发送到服务器上。由于这种做法和我们所要实现的功能有差别,AREL范例的截屏部分暂时空缺- // java
- metaioSDK.requestScreenshot(filepath);
- @Override
- public void onScreenshot(String filepath)
- {
- }
复制代码- // objective c
- m_metaioSDK->requestScreenshot([fullPath UTF8String], glView->defaultFramebuffer, glView->colorRenderbuffer);
- -(void) onScreenshot:(NSString*) filepath
- {
- }
复制代码
您可以通过调用startCamera()来重设整个应用并重新开始。这样一来,所设定的跟踪目标参考会被移除,并且摄像头也会重新启动来进行跟踪或拍照。在AREL中,我们可以通过把setfreezeTracking()设置为false来实现类似的效果。- // java
- metaioSDK.startCamera(0);
复制代码- // objective c
- m_metaioSDK->startCamera(0);
复制代码- // javascript
- arel.Scene.setFreezeTracking(false);
复制代码
手势操作
本范例所使用的手势包括拖放、缩放和旋转。在安卓设备上,任何一种手势都用touch事件来处理,根据不同touch事件来辨认不同的手势是程序开发人员的任务。而在IOS设备上,Apple对不同的手势提供相应的识别器,例如UIPInchGestureRecognizer和 UIRotationGestureRecognizer,这就使程序的实现轻松的过。不管您使用哪个平台,我们都建议您使用SDK中的 GestureHandler来对施加于模型的手势进行处理。使用GestureHandler,您可以把模型分组来实现对其轻松管理。如果不愿再对模型施加手势,您也可以轻松把模型从GestureHandler中移除。您可以根据实际情况开启所需要的手势识别类型,而且手势对模型的识别是自动完成的,省去您编写代码的麻烦。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|
|
|
|
|