【问题标题】:Android opengl: Arbitrary axis rotation fails to apply rotationAndroid opengl:任意轴旋转无法应用旋转
【发布时间】: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


    【解决方案1】:

    我能够在发布后的短时间内解决这个问题(尽管它已经困扰了我好几天)。

    我所要做的就是创建一个全局旋转矩阵来存储对对象执行的所有旋转。我将 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-17
      • 2012-08-05
      • 2021-07-24
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      相关资源
      最近更新 更多