【发布时间】:2012-11-05 22:19:41
【问题描述】:
我们使用Camera在canvas中做3D变换。我们通常旋转camera得到它的Matrix然后平移它。但是Camera也有translate的方法。使用方法的结果是不同的。
我的问题是:Camera.translate 和 Matrix.preTranslate 或 Matrix.postTranslate 有什么区别?
【问题讨论】:
标签: android camera android-canvas translate
我们使用Camera在canvas中做3D变换。我们通常旋转camera得到它的Matrix然后平移它。但是Camera也有translate的方法。使用方法的结果是不同的。
我的问题是:Camera.translate 和 Matrix.preTranslate 或 Matrix.postTranslate 有什么区别?
【问题讨论】:
标签: android camera android-canvas translate
两者兼有的原因是,矩阵乘法必须按特定顺序完成才能获得正确的结果(您可能已经知道)。
平移/旋转/缩放的顺序在您键入时以反向顺序完成。
所以如果你这样做:
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 图形,这些信息尤其有用,因为那时这些矩阵会让人头疼。
我希望这会有所帮助!
【讨论】:
如果您不触摸画布但将相机旋转 90 度或保持相机静止但将其查看的画布旋转 -90 度,则结果在视觉上是相同的。
【讨论】:
Android.Canvas上关于3D的任何好的文档或教程吗?似乎Magic和surd。