【发布时间】:2016-08-21 19:46:23
【问题描述】:
我有一个基本问题我想用触摸事件平移所有对象(世界)问题是如果视图矩阵旋转我无法计算模型矩阵平移以向正确方向移动,我想在 x 上平移和 z 轴。 我需要数学逻辑。 我有一个相机类,它的draw void是:
public void draw() {
Matrix.setIdentityM(viewMatrix, 0);
setLookAtM(viewMatrix, 0, position.getX(), position.getY(), position.getZ(), lookAt.getX(), lookAt.getY(), lookAt.getZ(), 0f, 1f, 0f);
Matrix.setIdentityM(mCurrentRotation, 0);
Matrix.rotateM(mCurrentRotation, 0, mDeltaX, 0.0f, 1.0f, 0.0f);
Matrix.rotateM(mCurrentRotation, 0, mDeltaY, 1.0f, 0.0f, 0.0f);
mDeltaX = 0.0f;
mDeltaY = 0.0f;
float[] mTemporaryMatrix = new float[16];
Matrix.multiplyMM(mTemporaryMatrix, 0, mCurrentRotation.clone(), 0, mAccumulatedRotation, 0);
System.arraycopy(mTemporaryMatrix, 0, mAccumulatedRotation, 0, 16);
Matrix.multiplyMM(mTemporaryMatrix, 0, viewMatrix, 0, mAccumulatedRotation, 0);
System.arraycopy(mTemporaryMatrix, 0, viewMatrix, 0, 16);
}
一个网格类和它的draw void是:
public void draw(float mDeltaX, float mDeltaY) {
Matrix.setIdentityM(getMatrix().getFloatArray(), 0);
multiplyMM(getMatrix().getFloatArray(), 0, containerMatrix.getFloatArray(), 0, geometry.getMatrix().getFloatArray(), 0);
multiplyMM(modelViewMatrix, 0, this.getScene().getCamera().getViewMatrix(), 0, getMatrix().getFloatArray(), 0);
Matrix.setIdentityM(mCurrentTranslation, 0);
Matrix.translateM(mCurrentTranslation, 0, -mDeltaX, 0, -mDeltaX);
float[] mTemporaryMatrix = new float[16];
Matrix.multiplyMM(mTemporaryMatrix, 0, mCurrentTranslation.clone(), 0, mAccumulatedRotation, 0);
System.arraycopy(mTemporaryMatrix, 0, mAccumulatedRotation, 0, 16);
Matrix.multiplyMM(mTemporaryMatrix, 0, modelViewMatrix, 0, mAccumulatedRotation, 0);
System.arraycopy(mTemporaryMatrix, 0, modelViewMatrix, 0, 16);
this.getScene().getShaderProgram().setUniforms(modelViewMatrix, this.getScene().getCamera().getProjectionMatrix(), material.getTextureid(), material.getMaterialColor(), material.getEmissiveColor(), material.getShinines());
geometry.getDataBuffer().bindData(this.getScene().getShaderProgram());
glDrawArrays(GL_TRIANGLES, 0, geometry.getDataBuffer().getVerticesCount());
}
onTouchEvent 是:
if (event.getAction() == MotionEvent.ACTION_MOVE) {
if (mainRenderer != null) {
if(event.getPointerCount()==1){
float deltaX = (x - mPreviousX) / mDensity / 2f;
float deltaY = (y - mPreviousY) / mDensity / 2f;
mainRenderer.getCamera().mDeltaX += deltaX;
mainRenderer.getCamera().mDeltaY += deltaY;
}
else if(event.getPointerCount()==2){
float deltaX = (x - mPreviousX) / mDensity / 2f;
float deltaY = (y - mPreviousY) / mDensity / 2f;
mainRenderer.getScene().mDeltaX += deltaX;
mainRenderer.getScene().mDeltaY += deltaY;
}
}
}
相机可以很好地旋转,但我无法将对象转换为与视图矩阵相关的方向。
我做了以下代码
Vector3 camPos=new Vector3();
camPos.setFromMatrixColumn(this.getScene().getCamera().getViewMatrix(),3);
Vector3 camUp=new Vector3();
camUp.setFromMatrixColumn(this.getScene().getCamera().getViewMatrix(),1);
Vector3 camForward=new Vector3();
camForward.setFromMatrixColumn(this.getScene().getCamera().getViewMatrix(),2);
Vector3 camRight=new Vector3();
camRight.setFromMatrixColumn(this.getScene().getCamera().getViewMatrix(),0);
translateM(geometry.getMatrix().getFloatArray(), 0, mDeltaX*camRight.getX(), 0, mDeltaY*camUp.getY());
但结果出乎意料,我知道这是不正确的,但我尝试按照您的指示,从视图矩阵中获取位置、向前、向上和向右,然后将事务应用于模型矩阵。
更新 这段代码离正确的结果很近,但并不完美,我从视图矩阵中得到了正确的向上、向前、向右和定位
Vector3 col1=new Vector3();
col1.setFromMatrixColumn(this.getScene().getCamera().getViewMatrix(),3);
Vector3 col2=new Vector3();
col2.setFromMatrixColumn(this.getScene().getCamera().getViewMatrix(),1);
Vector3 col3=new Vector3();
col3.setFromMatrixColumn(this.getScene().getCamera().getViewMatrix(),2);
Vector3 camUp=new Vector3(col1.getY(), col2.getY(), col3.getY());
Vector3 camForward=new Vector3(col1.getZ(), col2.getZ(), col3.getZ());
Vector3 camRight=new Vector3(col1.getX(), col2.getX(), col3.getX());
camRight.setFromMatrixColumn(this.getScene().getCamera().getViewMatrix(),0);
translateM(geometry.getMatrix().getFloatArray(), 0, mDeltaX*camRight.getX(),0,mDeltaY*camForward.getZ());
【问题讨论】:
-
您能否发布一些有关如何尝试旋转相机视图矩阵和平移模型矩阵的代码。
-
最后一次编辑似乎你有行而不是列顺序。那么你需要行而不是列。对此感到抱歉,我认为 Android 矩阵已转置,但您的情况似乎并非如此。