android - Camera.translate 和 Matrix.preTranslate 或 Matrix.postTranslate 之间的区别?

标签 android camera android-canvas translate

我们使用 Camera在 Canvas 上做 3D 变换。我们通常旋转相机并得到它的矩阵然后翻译它。但相机也有 translate方法。使用方法的结果是不同的。

我的问题是:Camera.translate 和 Matrix.preTranslate 或 Matrix.postTranslate 有什么区别?

最佳答案

两者兼而有之的原因是矩阵乘法必须按特定顺序进行才能获得正确的结果(正如您可能已经知道的那样)。

平移/旋转/缩放的顺序在您输入时以相反的顺序完成。

所以如果你这样做:

Camera.rotate(15, 0, 0);
Camera.scale(.5f, .5f, .5f);
Camera.translate(70, 70, 70);

您首先平移 70、70、70,然后在所有方向上缩放 50%,然后绕 X 轴旋转 15 度。

所以 Matrix 有一个前后翻译(好吧,前和后一切),因为也许你想先实际旋转它 15 度,然后翻译它,最后缩放它。

这样就可以回答前后翻译。现在 Camera 具有直接旋转和平移的原因是为了那些已经知道它是如何工作的人(比如我!),所以我从不使用 Matrix 或 Camera 来解决这个问题,因为我可以直接在 Canvas 上简单地进行旋转和平移。只要您知道平移、缩放和旋转是以相反顺序完成的,您也可以。

另外,如果你知道我告诉你的,它会给你更多的力量。您可以执行一系列 10 个矩阵,而无需将它们包围在每个矩阵的多个 Matrix 对象中(例如,您想要执行向外摆动并绕中心旋转以模拟离心力的摆动运动)。这需要通过多次旋转和平移(被传递给彼此的多个 Matrix 对象包围)来完成,但是如果您知道每个翻译是如何工作的,您可以简单地执行一系列 .translate()、.rotate()、和.scale()。

如果您曾经做过 3D 图形,此信息特别有用,因为那时这些矩阵会让人头疼。

希望对您有所帮助!

关于android - Camera.translate 和 Matrix.preTranslate 或 Matrix.postTranslate 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13429328/

相关文章:

Android API 19 及更高版本。写入 microSD 卡(外置 SD 卡)

iPhone 5 的弱光增强模式

android - 如何检查所选日期比android中的当前日期多8天

Android开发在VM中,但需要在本地设备上部署和调试

javascript - 按钮移动相机 THREE.js

android - 如何禁用麦克风、摄像头和任何其他工具

android - 如何在 ImageView 上画线而无需重新加载它

android - Android 中使用 Canvas 和 SurfaceView 时的 Thread 或 Runnable

单个自定义 View 中的 Android 两个 Canvas (在 onDraw() 中)

android - 如何在 jetpack compose Preview 中显示 Kotlin 协程流数据?