我使用rajawali库来加载.obj文件。
我的.obj呈现完美,但无法对其应用捏合和缩放功能。
答案 0 :(得分:1)
使用ScaleGestureDetector解决了问题。
以下是示例代码:
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);
}}
答案 1 :(得分:0)
使用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);