【发布时间】:2016-07-08 13:53:45
【问题描述】:
我正在使用 opengles 2.0 在 android 中渲染一个对象并允许用户操作该对象。用户可以围绕对象开始的固定轴正确旋转对象,但是在应用初始旋转后,我无法围绕新的任意轴旋转对象。
一旦有触摸事件,我就会重置模型矩阵并应用用户已经输入的旋转。变量 angle 是一个三元素向量,包含每个轴的角度旋转。
Matrix.setIdentityM(modelMatrix,0);
Matrix.rotateM(modelMatrix,0,angle[0],1.0f,0.0f,0.0f);
Matrix.rotateM(modelMatrix,0,angle[1],0.0f,1.0f,0.0f);
Matrix.rotateM(modelMatrix,0,angle[2],0.0f,0.0f,1.0f);
然后,我应用在触摸事件期间输入的新增量旋转。这似乎有效。
Matrix.rotateM(modelMatrix,0,newYAngle,1.0f,0.0f,0.0f);
Matrix.rotateM(modelMatrix,0,newXAngle,0.0f,1.0f,0.0f);
之后,我尝试计算任意轴以将增量旋转添加到角度变量中。这似乎是问题出现的地方。
Matrix.multiplyMV(newAxisX,0,modelMatrix,0,new float[] {0.0f,1.0f,0.0f,1.0f},0);
Matrix.multiplyMV(newAxisY,0,modelMatrix,0,new float[] {1.0f,0.0f,0.0f,1.0f},0);
float lengthX = (float) Math.sqrt(Math.pow(newAxisX[0]/newAxisX[3],2)+Math.pow(newAxisX[1]/newAxisX[3],2)+Math.pow(newAxisX[2]/newAxisX[3],2));
float lengthY = (float) Math.sqrt(Math.pow(newAxisY[0]/newAxisY[3],2)+Math.pow(newAxisY[1]/newAxisY[3],2)+Math.pow(newAxisY[2]/newAxisY[3],2));
angleChanges[0] = (newXAngle*((newAxisX[0]/newAxisX[3])/lengthX)) + (newYAngle*((newAxisY[0]/newAxisY[3])/lengthY));
angleChanges[1] = (newXAngle*((newAxisX[1]/newAxisX[3])/lengthX)) + (newYAngle*((newAxisY[1]/newAxisY[3])/lengthY));
angleChanges[2] = (newXAngle*((newAxisX[2]/newAxisX[3])/lengthX)) + (newYAngle*((newAxisY[2]/newAxisY[3])/lengthY));
这段代码执行后,调用onDraw()方法,modelMatrix与viewMatrix相乘。然后乘以投影矩阵并将结果输入我的形状类。
这会在旋转时导致弯曲。例如,如果我要将对象向上旋转 90° 并以 y 角(在 0.0,1.0,0.0 轴上),然后尝试将对象向右旋转 90°(在应用第一次旋转后从用户角度) ,物体将向下弯曲。我已经记录了应用旋转时使用的轴矢量的数据,似乎发生的事情(使用 x 轴矢量)是它开始接近 0,0,1,这是正确的,然后慢慢转换为 1,0,0,这会导致问题。
这是我目前的方法,但我尝试反转初始旋转,然后根据从中生成的向量应用增量旋转,但没有成功。
任何帮助将不胜感激。
【问题讨论】:
标签: android opengl-es opengl-es-2.0