我们使用Camera在canvas中做3D变换。我们通常旋转camera得到它的Matrix然后平移它。但是Camera也有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 图形,则此信息特别有用,因为那时这些矩阵会让人头疼。
我希望这有帮助!
如果您不触摸画布但将相机旋转 90 度或保持相机静止但将其查看的画布旋转-90 度,则结果在视觉上是相同的。