您的位置:首页 > 其它

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

2014-11-24 09:37 399 查看


原文:http://blog.csdn.net/ggtaas/article/details/26267251




1、  写本地方法

[java] view
plaincopy





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

  

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中:注意黄色背景部分。

[java] view
plaincopy





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.cpp的JNIEXPORTvoid
JNICALL

Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargetsRenderer_renderFrame(JNIEnv*, jobject)方法中:



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

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

AR研发团队招募有梦想的年轻人,有兴趣可以私信我,最好是在深圳。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  高通 AR