gpt4 book ai didi

Android OpenGL ES 使用触摸事件旋转 3D 对象

转载 作者:行者123 更新时间:2023-11-30 01:23:40 24 4
gpt4 key购买 nike

这是一个 Android 应用程序。我想在 OpenGLES 2.0 中使用 Matrix 旋转带有触摸事件的球体。但是角度不对。旋转似乎不稳定。我想水平触摸时只旋转x,垂直触摸时只旋转y。但实际上,当我水平触摸时它会旋转 x 和 y,当我垂直触摸时也是如此……旋转 anglex 和 angley 的计算或矩阵设置有问题吗?这是触摸事件:

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

switch (e.getAction()) {
case MotionEvent.ACTION_MOVE:

float dx = x - mPreviousX;
float dy = y - mPreviousY;

mRenderer.setAngleX(mRenderer.getAngleX() + (dx * TOUCH_SCALE_FACTOR));
mRenderer.setAngleY(mRenderer.getAngleY() - (dy * TOUCH_SCALE_FACTOR));
requestRender();
}
mPreviousX = x;
mPreviousY = y;
return true;
}

这是矩阵设置:

public void onDrawFrame(GL10 unused) {
// Draw background color
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
//set up the matrix
float [] mTempMatrix = new float[16];
Matrix.setIdentityM(mModelMatrix, 0); // initialize to model matrix
Matrix.setIdentityM(mTranslateMatrix,0);
Matrix.translateM(mTranslateMatrix, 0, 0.0f, 0.0f, 0.0f);
mTempMatrix = mModelMatrix.clone();
Matrix.multiplyMM(mModelMatrix,0,mTempMatrix,0,mTranslateMatrix,0);

Matrix.setIdentityM(mRotationMatrix,0);
Matrix.rotateM(mRotationMatrix, 0, mAngleX, 0,1,0);
Matrix.rotateM(mRotationMatrix, 0, mAngleY, 1,0,0);
mTempMatrix = mModelMatrix.clone();
Matrix.multiplyMM(mModelMatrix,0,mTempMatrix,0,mRotationMatrix,0);

Matrix.setIdentityM(mScaleMatrix,0);
Matrix.scaleM(mScaleMatrix,0, 1f, 1f, 1f);
mTempMatrix = mModelMatrix.clone();
Matrix.multiplyMM(mModelMatrix,0,mTempMatrix,0,mScaleMatrix,0);
Matrix.setLookAtM(mViewMatrix, 0,
mLocation.x,mLocation.y,mLocation.z,
mTarget.x,mTarget.y,mTarget.z,
mUp.x,mUp.y,mUp.z);//camera
mTempMatrix = mViewMatrix.clone();

Matrix.multiplyMM(mViewMatrix, 0, mTempMatrix,0,mModelMatrix,0);
Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);

mSphere.draw(mMVPMatrix);
}

最佳答案

在我看来,既然你使用了

mRenderer.setAngleX(mRenderer.getAngleX() + (dx * TOUCH_SCALE_FACTOR));

即使 dx 为 0,任何先前的角度(通过 mRenderer.getAngleX() )都将在下一次迭代中重新应用。让 dx 单独修改 mAngleX(当然对 mAngleY 做同样的事情):

mRenderer.mAngleX += dx * TOUCH_SCALE_FACTOR;

关于Android OpenGL ES 使用触摸事件旋转 3D 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36740592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com