高通 AR SDK對模型進行控制(平移、旋轉、縮放)

原文: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研發團隊招募有夢想的年輕人,有興趣可以私信我,最好是在深圳。

發佈了11 篇原創文章 · 獲贊 1 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章