eoe 移动开发者论坛

 找回密码
 加入eoe

QQ登录

只需一步,快速开始

查看: 6292|回复: 23
收起左侧

[Android实例] Android下利用min3D引擎实现增强现实的简单例子

[复制链接]

该用户从未签到

3

主题

18

帖子

68

e币
发表于 2012-12-29 19:22:26 | 显示全部楼层 |阅读模式

没有eoe的账号,级别还太低,出门如何吹牛逼?

您需要 登录 才可以下载或查看,没有帐号?加入eoe

x
本帖最后由 IToBe 于 2012-12-29 19:26 编辑

   前段时间研究了一下Min3D游戏开发引擎,发现这个引擎很好用,例子非常细,使用起来很方便,尤其给的最后一

个例子“ExampleAccelerometer”,很有意思,结合重力感应,这对于最近在做的增强现实项目有一点启发,

于是这里把自己探索的过程和大家分享一下。

      这里对于min3D我就不详细介绍了,以后我会在写篇关于min3D的文章,  大家可以先

http://code.google.com/p/min3d/去了解,在这里为了更好地理解我的意思,建议大家把我提到的那个例子运行一下,体验一下效果.

      我先把做好的效果说明一下,先上图:


背景是手机的摄像头,作为实时的预览,在预览图层的上面利用min3D绘制一个三维图像,而且这是一个md2文件

,当第一次点击屏幕时,3D人物会“跳舞”,再次点击屏幕时,停止动画。另外,我还结合了加速度传感器,这样,当

屏幕向左倾斜时,人物向右移动,向右倾斜时,任务向左移动。
好了,下面该说说原理了。
总的来说,实现步骤有四个:
    1、开启摄像头,并将预览图像作为底层;
2、利用min3D在预览图层上绘制或者导入一个虚拟人物;
3、添加触屏事件,在触屏时播放动画;
4、获得传感器数据,动态设置虚拟人物的位置。


下面该是分解动作了:
一、开启摄像头,并将预览图像作为底层
直接上代码:下面是Screen类,专门用来定义摄像头视图的

[mw_shl_code=java,true]package com.example.animalar;

import java.io.IOException;
import android.content.Context;
import android.hardware.Camera;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
//这个类是用来开启摄像头的
public class Screen extends SurfaceView implements SurfaceHolder.Callback {
       
        public Screen(Context context) {
                super(context);
                // Install a SurfaceHolder.Callback so we get notified when the
                // underlying surface is created and destroyed.
                previewHolder = this.getHolder();
                previewHolder.addCallback(this);
                //************
                previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        }
       


        /**
         * Initialize the hardware camera. holder The holder
         */
        public void surfaceCreated(SurfaceHolder holder) {
                //************
                if(!isPreviewRunning)
                        mCamera = Camera.open();
                else
                        mCamera.stopPreview();

       
        }

        public void surfaceDestroyed(SurfaceHolder holder) {
                // Surface will be destroyed when we return, so stop the preview.
                // Because the CameraDevice object is not a shared resource, it's very
                // important to release it when the activity is paused.
                try {
                        if (mCamera!=null) {
                                //**********
                                mCamera.setPreviewCallback(null);
                                mCamera.stopPreview();  
                                mCamera.release();
                                //**********
                                mCamera=null;
                                isPreviewRunning=false;
                        }
                } catch (Exception e) {

                }
        }

        public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
                if(mCamera!=null&&isPreviewRunning!=true)
                {
                        try{
                                Camera.Parameters p = mCamera.getParameters();  
                                p.setPreviewSize(w, h);
                                mCamera.setPreviewDisplay(holder);
                                //mCamera.setParameters(p);
                                mCamera.setPreviewCallback(null);
                                mCamera.startPreview();
                        }
                        catch (IOException e) {
                                e.printStackTrace();
                        }


                        isPreviewRunning = true;
                }

        }


        private Camera mCamera;
        private SurfaceHolder previewHolder;
        private boolean isPreviewRunning=false;
        //private Camera.PreviewCallback imageCaptureCallback;

}[/mw_shl_code]
这个类是用来开启摄像头的,继承自surfaceview,要注意出现"//********"的地方,这些地方很容易导致错误。
这个只是一个SurfaceView定义,还没有加到图层中去,所以别急  
哦,对了,忘了说布局文件了,看代码吧:

[mw_shl_code=html,true]<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" >
      
        <FrameLayout android:id="@+id/abc1"
                android:layout_height="wrap_content"
                android:layout_width="wrap_content"
        />
         <FrameLayout android:id="@+id/abc2"
                android:layout_height="wrap_content"
                android:layout_width="wrap_content"
        />

</FrameLayout> [/mw_shl_code]总共有三个FrameLayout,分别是总体布局、摄像头预览图层和min3D绘制图层。
绘制图形的部分就体现出min3D的优势了,很短的函数就能把完整的md2文件导入进去,这里再次建议大家看一看
min3D的代码,有助于下面的理解。
二、利用min3D在预览图层上绘制或者导入一个虚拟人物

[mw_shl_code=java,true]public void initScene() {
                scene.backgroundColor().setAll(0x00000000);       
                scene.lights().add(new Light()); // 添加光源       
                IParser parser = Parser.createParser(Parser.Type.MD2, getResources(),
                                "com.example.animalar:raw/ogro", false);
                parser.parse();
                ogre = parser.getParsedAnimationObject();
                ogre.scale().x = ogre.scale().y = ogre.scale().z = .07f;
                ogre.rotation().z = -90;
                ogre.rotation().x = -90;
                ogre.position().z = -4f;
                ogre.position().y = -2f;
                scene.addChild(ogre);
                mSensorManager.registerListener(this, mAccelerometer,
                                SensorManager.SENSOR_DELAY_UI);
        }[/mw_shl_code]

绘制图形的部分就体现出min3D的优势了,很短的函数就能把完整的md2文件导入进去,这里再次建议大家看一看
min3D的代码,有助于下面的理解。

三、添加触屏事件,在触屏时播放动画;

[mw_shl_code=java,true]public boolean onTouchEvent(MotionEvent e) {
                if (e.getAction() == MotionEvent.ACTION_DOWN) {
                        if (twice == false) {
                                ogre.setFps(30);
                                ogre.play();
                                twice = true;
                        } else {
                                ogre.pause();
                                twice = false;
                        }
                }
                return true;
        }[/mw_shl_code]注意boolean twice这个变量,当twice=false,判定为第一次触摸屏幕,播放动画。当twice=true时,判定为再次触摸屏幕,此时停止播放动画


四、获得传感器数据,动态设置虚拟人物的位置。

[mw_shl_code=java,true]public void onSensorChanged(SensorEvent event) {
                if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER)
                        return;
                //float Acc_Z = (float) event.values[2];

                mAccVals.x = (float) (-event.values[1] * FILTERING_FACTOR + mAccVals.x
                                * (1.0 - FILTERING_FACTOR));
                mAccVals.y = (float) (event.values[0] * FILTERING_FACTOR + mAccVals.y
                                * (1.0 - FILTERING_FACTOR));
                // mAccVals.x=-event.values[1];
                scene.camera().position.x = mAccVals.x * .5f;
                scene.camera().position.y = mAccVals.y * .2f;
                scene.camera().target.x = scene.camera().position.x;

        }

        public void onAccuracyChanged(Sensor sensor, int accuracy) {
                // TODO Auto-generated method stub
        }[/mw_shl_code]
关于Android下传感器的使用方法这里就不在赘述了,网上的教程挺多的。其实这里的代码是min3D引擎中的ExampleAccelerometer例子的源代码
。大家看看我的注释吧。
好了,分解动作也完成了,需要代码的盆友可以去我的资源栏下载,我已经上传了。



该用户从未签到

0

主题

2

帖子

15

e币
发表于 2013-8-31 01:17:49 | 显示全部楼层
最近也在开发ar的东西呢,跪求楼主源码一阅。邮箱:645548494@qq.com.
日后可以多多交流~
匿名  发表于 2014-4-3 21:35:13
你好,楼主能够把源码发给我一份吗?现在正在学习这方面的东西,谢谢,183232982@qq.com

该用户从未签到

0

主题

8

帖子

21

e币
发表于 2014-3-22 14:41:40 | 显示全部楼层
本帖最后由 liuxiaoran 于 2014-3-22 14:48 编辑

楼主大神,我现在也在搞android ar,求原码学习啊,邮箱2388509907@qq.com。谢谢楼主啊

该用户从未签到

26

主题

1228

帖子

1275

e币
QQ认证
发表于 2012-12-30 16:25:11 | 显示全部楼层
多谢分享

该用户从未签到

0

主题

1

帖子

13

e币
发表于 2013-1-4 10:59:13 | 显示全部楼层
好了,分解动作也完成了,需要代码的盆友可以去我的资源栏下载,我已经上传了。

请问一下这个我的资源栏在哪边,想下载代码看一下,找半天没找到地方下载,谢谢

点评

你给个邮箱,我发给你吧  详情 回复 发表于 2013-1-13 21:30

该用户从未签到

3

主题

18

帖子

68

e币
 楼主| 发表于 2013-1-13 21:30:41 | 显示全部楼层
zrmeng 发表于 2013-1-4 10:59
好了,分解动作也完成了,需要代码的盆友可以去我的资源栏下载,我已经上传了。

请问一下这个我的资源栏在 ...

你给个邮箱,我发给你吧

该用户从未签到

0

主题

2

帖子

36

e币
发表于 2013-3-29 00:42:40 | 显示全部楼层
楼主,求源码  928329833@qq.com

该用户从未签到

0

主题

2264

帖子

1916

e币
发表于 2013-3-29 08:24:54 | 显示全部楼层
好東西阿一定要推一下@@學習中

该用户从未签到

0

主题

2

帖子

18

e币
发表于 2013-4-6 13:24:21 | 显示全部楼层
min3D引擎是不是免费的?
匿名  发表于 2013-5-3 10:41:57
楼主求源码,我现在也在研究ar技术,求源码jansin_love@163.com 谢楼主了...

该用户从未签到

0

主题

4

帖子

21

e币
发表于 2013-5-13 23:47:10 | 显示全部楼层
楼主,没看到代码,求~~ 421097329@qq.com 灰常感谢

该用户从未签到

0

主题

2264

帖子

1916

e币
发表于 2013-5-14 08:21:09 | 显示全部楼层
這個五已經想好久囉~~我可以好好得來學這個好東東
匿名  发表于 2013-6-25 10:01:45
请问在哪边下载?急求呀

该用户从未签到

0

主题

40

帖子

25

e币
发表于 2013-6-25 14:24:27 | 显示全部楼层
跪求源码

该用户从未签到

0

主题

37

帖子

2389

e币
发表于 2013-7-21 22:19:33 | 显示全部楼层
楼主好人 求源码 6781219@qq.com

该用户从未签到

0

主题

84

帖子

36

e币
发表于 2013-7-26 12:03:26 | 显示全部楼层

签到天数: 4 天

连续签到: 1 天

[LV.2]偶尔看看I

3

主题

102

帖子

612

e币
发表于 2013-8-1 17:55:13 | 显示全部楼层
同求 251069193@qq.com  
*滑动验证:
您需要登录后才可以回帖 登录 | 加入eoe

本版积分规则

推荐阅读
赞助商们

QQ|联系我们|小黑屋|手机版|eoe 移动开发者论坛 ( 京ICP备11018032 京公网安11010802020210  

GMT+8, 2017-3-26 13:27 , Processed in 0.593239 second(s), 32 queries , Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表
关闭

扫一扫 关注eoe官方微信