2016-08-22 46 views
1

我是OpenGl Devloper中的新成員,我想在OpenGl android中呈現3D模型,因此我選擇了min3d框架庫。如何平移放大縮小min3d中的功能Android

我想平移放大縮小功能,爲我min3d

像模型,像照相機放大縮小,我有3dmodel小姐,我想縮小她的臉上沒有規模的任何解決方案目的?

+0

?通常你使用視圖矩陣,你應用lookAt過程接受眼睛的位置,中心朝着你看向上的方向。通過一點數學運算,您可以輕鬆應用縮放,平移和旋轉功能。 –

+0

我想觸摸事件,所以我使用觸摸事件在這個我寫這個代碼GLU.gluLookAt(Shared.renderer()。gl(), scene.camera()。position.x,scene.camera()。 position.y,scene.camera()。position.z, scene.camera()。target.x + 1,scene.camera()。target.y + 1,scene.camera()。target.z + 1 , scene.camera()。upAxis.x,scene.camera()。upAxis.y,scene.camera()。upAxis.z);你可以給代碼..? –

回答

1

您需要更改相機位置。我建議你定義一些額外的參數centerdistance,因爲你想平移。

當您有縮放手勢時,只需將縮放比例應用到距離distance *= scale(或distance = originalDistance*scale,具體取決於實施)。

在平底鍋上,您只需將center移動距離center.x += (newXOnScreen-oldXOnScreen)*speedFactorcenter.y += (newYOnScreen-oldYOnScreen)*speedFactor即可。速度因素在這裏可能是恆定的(隨着它的變化而變化),但最好也可以將它乘以縮放比例,如果它非常接近,則中心移動得更少。

既然你有這2個參數,你需要將它們應用到相機。假設你的模型位置爲(0,0,0)

scene.camera.position = {center.x, center.y, center.z-distance} 
scene.camera.target = {center.x, center.y, center.z} 
scene.camera.up = {0, 1, 0} 
+0

你好,如何獲得newYonscreen和newXonScreen?以及如何獲得origanldistance。觸摸事件 –

+0

您通常會跟蹤您獲取手指位置的拖動事件(newXOnScreen,newYOnScreen),您將這些事件保存到(oldXOnScreen,oldYOnScreen),因此在下一個事件時,您可以減去2以獲得向量多少手指實際上移動並將其應用於平移。原始距離是用戶開始變焦前使用的距離。這是您在開始時選擇應用的任何值,因此您可以在模型上獲得最佳視圖。 –

+0

Number3d number3d = new Number3d(event.getX(0),event.getY(0),scene.camera()。position.z-0.5f); scene.camera()。position = number3d; scene.camera()。target = number3d; scene.camera()。upAxis.y = 1; :我正在寫這個代碼,我的模型不顯示 –

0

以下代碼片段適用於我。這不是完整的代碼,但我剛剛添加了在min3d框架中執行三維對象的縮放和拖動的部分。我放在一起通過下面的在線教程中的代碼here和修改根據應用

//import statements 
    public class threedviewActivity extends RendererActivity { 
     private Object3dContainer Object3D; 
     private ScaleGestureDetector mScaleDetector; 
     private float mScaleFactor = 1.f,mLastTouchX,mLastTouchY,mPosX,mPosY; 
     private int mActivePointerId = INVALID_POINTER_ID,flag; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       mScaleDetector = new ScaleGestureDetector(threedviewActivity.this, new ScaleListener()); 

     } 

     @Override 
     public boolean onTouchEvent(MotionEvent ev) { 
       // Let the ScaleGestureDetector inspect all events. 
       mScaleDetector.onTouchEvent(ev); 
       final int action = MotionEventCompat.getActionMasked(ev); 

       switch (action) { 
        case MotionEvent.ACTION_DOWN: { 
         final int pointerIndex = MotionEventCompat.getActionIndex(ev); 
         final float x = MotionEventCompat.getX(ev, pointerIndex); 
         final float y = MotionEventCompat.getY(ev, pointerIndex); 

         mLastTouchX = x; 
         mLastTouchY = y; 

         mActivePointerId = MotionEventCompat.getPointerId(ev, 0); 
         updateScene(); 
         break; 
        } 

        case MotionEvent.ACTION_MOVE: { 
         // Find the index of the active pointer and fetch its position 
         final int pointerIndex = MotionEventCompat.findPointerIndex(ev, mActivePointerId); 
         final float x = MotionEventCompat.getX(ev, pointerIndex); 
         final float y = MotionEventCompat.getY(ev, pointerIndex); 

         final float dx = x - mLastTouchX; 
         final float dy = y - mLastTouchY; 

         mPosX += dx; 
         mPosY += dy; 

         // Remember this touch position for the next move event 
         mLastTouchX = x; 
         mLastTouchY = y; 
         flag = 1; 
         updateScene(); 
         break; 
        } 

        case MotionEvent.ACTION_UP: { 
         mActivePointerId = INVALID_POINTER_ID; 
         break; 
        } 

        case MotionEvent.ACTION_CANCEL: { 
         mActivePointerId = INVALID_POINTER_ID; 
         break; 
        } 

        case MotionEvent.ACTION_POINTER_UP: { 

         final int pointerIndex = MotionEventCompat.getActionIndex(ev); 
         final int pointerId = MotionEventCompat.getPointerId(ev, pointerIndex); 

         if (pointerId == mActivePointerId) { 
           // This was our active pointer going up. Choose a new 
          // active pointer and adjust accordingly. 
          final int newPointerIndex = pointerIndex == 0 ? 1 : 0; 
          mLastTouchX = MotionEventCompat.getX(ev, newPointerIndex); 
          mLastTouchY = MotionEventCompat.getY(ev, newPointerIndex); 
          mActivePointerId = MotionEventCompat.getPointerId(ev, newPointerIndex); 
         } 
         break; 
        } 
      } 
      return true; 
     } 

     @Override 
     public void initScene() 
     { 
       //this is where you initialize your 3d object. Check below for links for tutorials on that. 
     } 

     private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { 
       @Override 
       public boolean onScale(ScaleGestureDetector detector) { 
        mScaleFactor *= detector.getScaleFactor(); 

        // Don't let the object get too small or too large. 
        mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f)); 
        Object3D.scale().x = Object3D.scale().y = Object3D.scale().z = mScaleFactor*1.5f; 
        flag = 0; 
        updateScene(); 
        return true; 

       } 
     } 

     @Override 
     public void updateScene() 
     { 
       if(flag == 1) 
       { 
        Object3D.position().x = mPosX/100; 
        Object3D.position().y = -mPosY/100; 
       } 
     } 

    } 

對於initalizing min3D,跟着你必須的lookAt矩陣接入教程herehere

相關問題