Pergunta

I am using rajawali library for loading .obj file.

My .obj rendering perfectly fine but not able to apply pinch and zoom functionality to it.

Foi útil?

Solução

Have solved using ScaleGestureDetector.

Following is the sample code:

public class MainActivity extends RajawaliExampleActivity implements OnTouchListener, OnObjectPick {// ,
                                                                                                    // BackfromTemple
                                                                                                    // {
private RajawaliLoadModelRenderer mRenderer;
private float mPreviousX;
// private float mPreviousY;
private final float TOUCH_SCALE_FACTOR = 180.0f / 320;
private ScaleGestureDetector mScaleDetector;
private boolean isRotationStarted;
private boolean firsttime = false;
private Camera cam;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mRenderer = new RajawaliLoadModelRenderer(this);
    mRenderer.setSurfaceView(mSurfaceView);
    super.setRenderer(mRenderer);
    mSurfaceView.setOnTouchListener(this);
    initLoader();
    mScaleDetector = new ScaleGestureDetector(getBaseContext(), mRenderer);

    firsttime = false;
    cam = mRenderer.getCamera();
    mSurfaceView.setPreserveEGLContextOnPause(true);
}


void showProgressDialog(final Context c, final String msg) {
    runOnUiThread(new Runnable() {

        @Override
        public void run() {
            pd = new ProgressDialog(c);
            pd.setMessage(msg);
            pd.setCancelable(false);
            pd.setIndeterminate(true);
            if (!pd.isShowing()) {
                pd.show();
            }
        }
    });

}

protected void hideProgressDialog() {
    runOnUiThread(new Runnable() {

        @Override
        public void run() {
            if (pd != null && pd.isShowing()) {
                pd.dismiss();
            }
        }
    });

}

@Override
protected void onRestart() {
    super.onRestart();

    firsttime = true;
    isRotationStarted = false;

    mRenderer.mPickedObject = null;
    runOnUiThread(new Runnable() {

        @Override
        public void run() {
            if (SuperActivity.pd != null && SuperActivity.pd.isShowing()) {
                SuperActivity.pd.dismiss();
            }
        }
    });
}

@Override
public boolean onTouchEvent(MotionEvent e) {
    mScaleDetector.onTouchEvent(e);
    float x = e.getX();
    float y = e.getY();

    if (e.getAction() == MotionEvent.ACTION_MOVE) {
        float dx = x - mPreviousX;
        // float dy = y - mPreviousY;
        if (Math.abs(dx) > 2.5) {
            isRotationStarted = true;
            mRenderer.mObjectGroup.getRotation().y -= dx * TOUCH_SCALE_FACTOR;
        }
        // else if (Math.abs(dy) > 2.5) {
        // isRotationStarted = true;
        // mRenderer.mObjectGroup.getRotation().x -= dy *
        // TOUCH_SCALE_FACTOR;
        // }
    }

    mPreviousX = x;
    return false;
}

@Override
public boolean onTouch(View v, MotionEvent event) {
    mScaleDetector.onTouchEvent(event);
    float x = event.getX();
    // float y = event.getY();

    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        mRenderer.getObjectAt(event.getX(), event.getY());
        // if (mRenderer.isObjectPicked) {
        // showProgressDialog();
        // }
    } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
        // if (mRenderer.isObjectPicked) {
        float dx = x - mPreviousX;
        // float dy = y - mPreviousY;
        if (Math.abs(dx) > 2.5 && mRenderer.mObjectGroup != null) {
            isRotationStarted = true;
            mRenderer.mObjectGroup.getRotation().y -= dx * TOUCH_SCALE_FACTOR;
        }
        // else if (Math.abs(dy) > 2.5 && mRenderer.mObjectGroup != null) {
        // isRotationStarted = true;
        // mRenderer.mObjectGroup.getRotation().x -= dy *
        // TOUCH_SCALE_FACTOR;
        // }
        // }
    } else if (event.getAction() == MotionEvent.ACTION_CANCEL || event.getAction() == MotionEvent.ACTION_UP) {

        isRotationStarted = false;

        mRenderer.mPickedObject = null;

        // runOnUiThread(new Runnable() {
        // @Override
        // public void run() {
        // if (!mRenderer.isObjectPicked) {
        // hideProgressDialog();
        // isRotationStarted = false;
        // mRenderer.isObjectPicked = false;
        // mRenderer.mPickedObject = null;
        // }
        // }
        // });
    }

    mPreviousX = x;
    // mPreviousY = y;

    return true;
}

@Override
public void objSelected(BaseObject3D object) {

    final Intent i = new Intent(this, newactivity.class);
    String objName = object.getName();


    isRotationStarted = false;

    mRenderer.mPickedObject = null;
    startActivity(i);
}}

Outras dicas

Easy way to achieve it by using ArcballCamera

ArcballCamera arcball = new ArcballCamera(mContext, ((Activity)mContext).findViewById(R.id.linear_layout));
        arcball.setTarget(object3D); //your 3D Object
        arcball.setPosition(0,0,4); //optional
        //arcball.setScreenMappingRatio(-1); // Not yet merged at master branch as of now

getCurrentScene().replaceAndSwitchCamera(getCurrentCamera(), arcball);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top