OpenGL下與OpenGl ES下的glRotatef()的不同

來源:互聯網
上載者:User

      Cube這個項目做了將近一個月了吧,最後一個重要的功能模組就是手勢識別,這個做好了將為"2010 Google Android 應用開發中國大學生挑戰賽"增加一個勝的砝碼。手勢識別很簡單,只需重載方法就行了。麻煩的是Opengl ES中的glRotatef(float angle , float x , float y , float z)。這個函數和Opengl中的glRotatef(float angle , float x , float y , float z)這個函數不同。

      我查了一下Opengl下的glRotatef()。angle表示轉過的角度,旋轉方向滿足右手螺旋定則;後面三個參數合起來的(x , y , z)向量,表示轉軸。在螢幕中,上 下為y軸,上為正向;左右為x軸,右為正向;裡外為z軸,外為正向。因為Opengl ES這方面的資料目前比較稀缺,又因為ES是Opengl的一個簡化版本,所以我就想,ES下的glRotatef()也是這個用法吧。

      但是,我大大的錯了!

      ES中的glRotatef()和Opengl下的glRotatef()用法是不同的。

      我的開發機器是MailStone,至少在mailstone中,下為y軸正向,這一點不同。還有一點,角度的旋轉方向不滿足右手螺旋定則。其具有以下特性:在x正方向滿足右手定則,在y軸負方向滿足右手定則。因為是在手機二維螢幕上測試,所以z軸沒測試。

      其測試代碼如下:

public class MyGesture extends Activity<br />{<br />private GestureDetector mGestureDetector ;<br />private OnTouchListener mGestureListener ;<br />private boolean mIsScrolling = false ;<br />private LinearLayout aLayout ;</p><p>@Override<br />public void onCreate( Bundle savedInstanceState )<br />{<br />super.onCreate( savedInstanceState ) ;<br />setContentView( R.layout.main ) ;<br />aLayout = ( LinearLayout ) findViewById( R.id.aLinerLayout ) ;<br />mGestureDetector = new GestureDetector( new SimpleOnGestureListener()<br />{<br />@Override<br />public boolean onScroll( MotionEvent e1 , MotionEvent e2 , float distanceX , float distanceY )<br />{<br />mIsScrolling = true ;<br />if( Math.abs( e2.getY() - e1.getY() ) < 0.1 )<br />{<br />if( e2.getX() - e1.getX() > 0 )<br />{<br />Log.i( "direction" , "right" ) ;<br />}<br />else if( e2.getX() - e1.getX() < 0 )<br />{<br />Log.i( "direction" , "left" ) ;<br />}<br />}<br />else if( Math.abs( e2.getX() - e1.getX() ) < 0.1 )<br />{<br />if( e2.getY() - e1.getY() > 0 )<br />{<br />Log.i( "direction" , "down" ) ;<br />Log.i( "sdfsdf" , String.valueOf( e2.getY() - e1.getY() ) ) ;</p><p>}<br />else if( e2.getY() - e1.getY() < 0 )<br />{<br />Log.i( "direction" , "up" ) ;<br />Log.i( "sdfsdf" , String.valueOf( e2.getY() - e1.getY() ) ) ;<br />}<br />}<br />else if( ( e2.getX() - e1.getX() > 0 ) && ( e2.getY() - e1.getY() < 0 ) )<br />{<br />Log.i( "direction" , "right-up" ) ;<br />}<br />else if( ( e2.getX() - e1.getX() < 0 ) && ( e2.getY() - e1.getY() < 0 ) )<br />{<br />Log.i( "direction" , "left-up" ) ;<br />}<br />else if( ( e2.getX() - e1.getX() < 0 ) && ( e2.getY() - e1.getY() > 0 ) )<br />{<br />Log.i( "direction" , "left-down" ) ;<br />}<br />else if( ( e2.getX() - e1.getX() > 0 ) && ( e2.getY() - e1.getY() > 0 ) )<br />{<br />Log.i( "direction" , "right-down" ) ;<br />}<br />return true ;<br />}</p><p>@Override<br />public boolean onDown( MotionEvent e )<br />{<br />Log.d( "123" , "GestureDetector --> onDown" ) ;<br />return true ;<br />}<br />} ) ;</p><p>mGestureListener = new View.OnTouchListener()<br />{<br />public boolean onTouch( View v , MotionEvent event )<br />{</p><p>if( mGestureDetector.onTouchEvent( event ) )<br />{<br />return true ;<br />}</p><p>if( event.getAction() == MotionEvent.ACTION_UP )<br />{<br />if( mIsScrolling )<br />{<br />Log.d( "end" , "OnTouchListener --> onTouch ACTION_UP" ) ;<br />mIsScrolling = false ;<br />}</p><p>}<br />return false ;<br />}<br />} ;<br />aLayout.setOnTouchListener( mGestureListener ) ;<br />}<br />}<br />

可以看到,當手指在螢幕上向右滑動時,兩個MotionEvent之間的x座標之差為正;當手指在螢幕上 向下滑動時,兩個MotionEvent之間的y座標之差為正。這個可以通過LogCat看到。

參考:http://hi.baidu.com/zqw19891001/blog/item/79a6a4ef3bcc0d1ffcfa3c25.html/cmtid/d8aa78cb78903b12bf09e620

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.