我在android中使用opengles 2.0来渲染一个对象并允许用户操纵该对象。用户可以围绕对象开始的固定轴正确旋转对象,但是在应用了初始旋转后,我无法围绕新的任意轴旋转对象。
只要有触摸事件,我就会重置modelMatrix并应用用户已经输入的旋转。可变角度是一个三元素矢量,包含每个轴的角度旋转。
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()方法,并将viewMatrix与viewMatrix相乘。然后将其乘以投影矩阵,结果将输入我的形状类。
这会在旋转时产生弯曲。例如,如果我以90°向上旋转对象(在0.0,1.0,0.0轴上),则尝试将对象向右旋转90°(在应用第一次旋转后从用户角度) ,物体将向下弯曲。我在应用旋转时从我正在使用的轴向量中记录了数据,并且似乎发生的事情(使用x轴向量)是它开始接近0,0,1,这是正确的,然后慢慢地转换为1,0,0,这会导致问题。
这是我当前的方法,但我已经尝试反转初始旋转,然后根据生成的向量应用增量旋转但没有成功。
非常感谢任何帮助。
答案 0 :(得分:0)
我能够在发布后的短时间内解决这个问题(尽管它让我困了好几天)。
我所要做的就是创建一个全局旋转矩阵,存储在对象上执行的所有旋转。我通过触摸事件将x和y中的更改作为全局变量传递。然后将它们馈入临时旋转矩阵,然后乘以全局旋转矩阵。全局旋转矩阵乘以模型矩阵。
Matrix.setIdentityM(tempRotMatrix,0);
Matrix.rotateM(tempRotMatrix,0,newX,0.0f,1.0f,0.0f);
Matrix.rotateM(tempRotMatrix,0,newY,1.0f,0.0f,0.0f);
newX = 0.0f;
newY = 0.0f;
Matrix.setIdentityM(modelMatrix,0);
Matrix.multiplyMM(rotationMatrix,0,tempRotMatrix,0,rotationMatrix,0);
Matrix.multiplyMM(modelMatrix,0,modelMatrix,0,rotationMatrix,0);