Android - 获取矩阵的当前旋转

5
我需要能够设置矩阵的旋转而不是添加到它。我相信设置旋转的唯一方法是知道矩阵的当前旋转。
注意:matrix.setRotate()无法满足要求,因为矩阵需要保留其信息。
3个回答

9
float[] v = new float[9];
matrix.getValues(v);
// translation is simple
float tx = v[Matrix.MTRANS_X];
float ty = v[Matrix.MTRANS_Y];

// calculate real scale
float scalex = v[Matrix.MSCALE_X];
float skewy = v[Matrix.MSKEW_Y];
float rScale = (float) Math.sqrt(scalex * scalex + skewy * skewy);

// calculate the degree of rotation
float rAngle = Math.round(Math.atan2(v[Matrix.MSKEW_X], v[Matrix.MSCALE_X]) * (180 / Math.PI));

从这里开始http://judepereira.com/blog/calculate-the-real-scale-factor-and-the-angle-of-rotation-from-an-android-matrix/


3
我使用以下代码计算旋转角度: float rAngle = Math.round(Math.atan2(v[Matrix.MSKEW_X], v[Matrix.MSCALE_X]) * (180 / Math.PI)); 需要乘以-1才能得到正确的值。为什么会这样? - DKV
1
我赞同@VV的评论;旋转方向错误,需要取反。 - Bob Liberatore
@项目:-ve 是我方面的错误,矩阵的顺序不同。但是我仍然需要应用 setPivotX(0); setPivotY(0); 来在旋转后获得精确位置,为什么会这样呢? - DKV
当scaleX和scaleY的值不同时,获取旋转度数出现了问题。 - Bhaven Shah

2
你可以调用getValues获取值并进行缓存。稍后当您需要它们时,只需在矩阵上调用setValues即可。

更新

旋转矩阵和变换矩阵之间的关系在这里得到了很好的解释。


getValue 函数返回一个浮点数数组,哪个索引表示旋转? - Paramount
我已将其标记为被接受的答案,因为你给了我一种找到旋转方式。尽管最终我选择了更简单的解决方案。我的解决方案是自己跟踪当前旋转,而不是通过矩阵找到它。我觉得这样做更容易且更有效率。 - Paramount

1

很抱歉,我无法帮助您进行集成(我只在Flash中完成了此操作),但听起来您应该尝试自己进行矩阵计算,最好使用“四元数”,这使得添加旋转非常简单。请参见http://introcs.cs.princeton.edu/java/32class/Quaternion.java.html以获取Java实现示例。您需要创建第二个四元数矩阵,描述您的旋转变化,并将其添加到当前矩阵中(在本例中为plus)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接