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

来源:互联网 发布:linux如何删除用户 编辑:程序博客网 时间:2024/05/19 01:32

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


1、  写本地方法

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. // 设置缩放尺寸、旋转角度  
  2.   
  3. privatenative void setScale(float scale);  
  4. private nativevoid setAngle(float angle);  


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

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


3、  Native层调用本地方法。

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


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

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

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

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

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. publicbooleanonTouchEvent(MotionEvent event)  
  2.   
  3.     {  
  4.   
  5.         int pointerCount = event.getPointerCount();  
  6.   
  7.         int action = event.getAction();  
  8.   
  9.         // 单点触控的情况主要控制模型的旋转  
  10.   
  11.         if (pointerCount == 1) {  
  12.   
  13.             switch (action) {  
  14.   
  15.             case MotionEvent.ACTION_DOWN:  
  16.   
  17.                 first_x= event.getX(0);  
  18.   
  19.                 first_y = event.getY(0);  
  20.   
  21.                 System.out.println("ACTION_DOWN pointerCount=" + pointerCount);  
  22.   
  23.                 break;  
  24.   
  25.             case MotionEvent.ACTION_UP:  
  26.   
  27.                 System.out.println("ACTION_UP pointerCount=" + pointerCount);  
  28.   
  29.                 break;  
  30.   
  31.             case MotionEvent.ACTION_MOVE:  
  32.   
  33.                 System.out.println("ACTION_MOVE pointerCount=" + pointerCount);  
  34.   
  35. //              Toast.makeText(ImageTargets.this,"sdsdsd", Toast.LENGTH_LONG).show();  
  36.   
  37.                 float num_x = event.getX()-first_x;  
  38.   
  39.                 float num_y = event.getY()-first_y;  
  40.   
  41.                 float angle = (float) Math.atan(num_x/num_y);  
  42.   
  43.                <span style="background-color: rgb(255, 255, 102);"> setAngle(angle);// 调用本地方法传值</span>  
  44.   
  45.                 Log.i("SCY""------->>>"+num_x+":::"+angle);  
  46.   
  47.                  
  48.   
  49.                 break;  
  50.   
  51.             }  
  52.   
  53.         }  
  54.   
  55.         // 两点触控的情况主要控制模型的缩放  
  56.   
  57.         if (pointerCount == 2) {  
  58.   
  59.             switch (action&MotionEvent.ACTION_MASK) {  
  60.   
  61.             case MotionEvent.ACTION_DOWN:  
  62.   
  63.                 first_x = event.getX(0);  
  64.   
  65.                 first_y = event.getY(0);  
  66.   
  67.                 System.out.println("ACTION_DOWN pointerCount=" + pointerCount);  
  68.   
  69.                 break;  
  70.   
  71.             case MotionEvent.ACTION_POINTER_DOWN:  
  72.   
  73.                    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)));  
  74.   
  75.                 System.out.println("ACTION_UP pointerCount=" + pointerCount);  
  76.   
  77.                 break;  
  78.   
  79.             case MotionEvent.ACTION_MOVE:  
  80.   
  81.                 System.out.println("ACTION_MOVE pointerCount=" + pointerCount);  
  82.   
  83.                 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)));  
  84.   
  85.                 float scale= newDist/oldDist;  
  86.   
  87.                 if (scale>=1.5f) {  
  88.   
  89.                                    scale = 1.5f;  
  90.   
  91.                             }  
  92.   
  93.                 elseif (scale<=0.5f) {  
  94.   
  95.                                    scale = 0.5f;  
  96.   
  97.                             }  
  98.   
  99.                <span style="background-color: rgb(255, 255, 102);"> setScale(scale);//调用本地方法传值</span>  
  100.   
  101.                 Log.i("SCY","--------->>>"+scale);  
  102.   
  103.                 break;  
  104.   
  105.             }  
  106.   
  107.         }  
  108.   
  109.         returnsuper.onTouchEvent(event);  
  110.   
  111. }  
 

5、 Native层OpenGL渲染

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

Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargetsRenderer_renderFrame(JNIEnv*, jobject)方法中:


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

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


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

0 0
原创粉丝点击