Vuforia AR SDK对模型进行控制(平移、旋转、缩放)

1、  写本地方法

// 设置缩放尺寸、旋转角度

privatenative void setScale(float scale);
private nativevoid setAngle(float angle);


2、  使用javah命令生成头文件。

生成之后会在工程目录下看到头文件,需要刷新:


3、  Native层调用本地方法。

经过javah命令之后,会生成对应native层的本地方法,例如:


将方法拷贝到ImageTargets.cpp文件中,实现该方法:

这就完成JNI通信部分。注意变量要自己设定。

4、  使用触屏事件,将数据传递到native层中,即ImageTargets.cpp中的两个方法。

触屏当然要在Java层实现啦,在ImageTargets.java中:注意黄色背景部分。

publicbooleanonTouchEvent(MotionEvent event)

    {

        int pointerCount = event.getPointerCount();

        int action = event.getAction();

        // 单点触控的情况主要控制模型的旋转

        if (pointerCount == 1) {

            switch (action) {

            case MotionEvent.ACTION_DOWN:

                first_x= event.getX(0);

                first_y = event.getY(0);

                System.out.println("ACTION_DOWN pointerCount=" + pointerCount);

                break;

            case MotionEvent.ACTION_UP:

                System.out.println("ACTION_UP pointerCount=" + pointerCount);

                break;

            case MotionEvent.ACTION_MOVE:

                System.out.println("ACTION_MOVE pointerCount=" + pointerCount);

//              Toast.makeText(ImageTargets.this,"sdsdsd", Toast.LENGTH_LONG).show();

                float num_x = event.getX()-first_x;

                float num_y = event.getY()-first_y;

                float angle = (float) Math.atan(num_x/num_y);

               <span style="background-color: rgb(255, 255, 102);"> setAngle(angle);// 调用本地方法传值</span>

                Log.i("SCY", "------->>>"+num_x+":::"+angle);

               

                break;

            }

        }

        // 两点触控的情况主要控制模型的缩放

        if (pointerCount == 2) {

            switch (action&MotionEvent.ACTION_MASK) {

            case MotionEvent.ACTION_DOWN:

                first_x = event.getX(0);

                first_y = event.getY(0);

                System.out.println("ACTION_DOWN pointerCount=" + pointerCount);

                break;

            case MotionEvent.ACTION_POINTER_DOWN:

                   oldDist = (float) Math.sqrt((event.getX(0) -event.getX(1)) * (event.getX(0) - event.getX(1)) + (event.getY(0) -event.getY(1)) * (event.getY(0) - event.getY(1)));

                System.out.println("ACTION_UP pointerCount=" + pointerCount);

                break;

            case MotionEvent.ACTION_MOVE:

                System.out.println("ACTION_MOVE pointerCount=" + pointerCount);

                float newDist = (float) Math.sqrt((event.getX(0) -event.getX(1)) * (event.getX(0) - event.getX(1)) + (event.getY(0) -event.getY(1)) * (event.getY(0) - event.getY(1)));

                float scale= newDist/oldDist;

                if (scale>=1.5f) {

                                   scale = 1.5f;

                            }

                elseif (scale<=0.5f) {

                                   scale = 0.5f;

                            }

               <span style="background-color: rgb(255, 255, 102);"> setScale(scale);//调用本地方法传值</span>

                Log.i("SCY","--------->>>"+scale);

                break;

            }

        }

        returnsuper.onTouchEvent(event);

}
 

5、 Native层OpenGL渲染

Native层获取从java层传递的值之后,需要使用OpenGL命令对模型进行控制,这个就在ImageTargets.cppJNIEXPORTvoid JNICALL

Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargetsRenderer_renderFrame(JNIEnv*, jobject)方法中:


这三句分别控制模型的平移、旋转和缩放,传递的值在这里才起作用。

到这里,所有的都完成了。剩下的就是使用NDK编译生成so文件,再运行就可以了。


AR研发团队招募有梦想的年轻人,有兴趣可以私信我,最好是在深圳。

评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值