【问题标题】:Difference between Camera.translate and Matrix.preTranslate or Matrix.postTranslate?Camera.translate 和 Matrix.preTranslate 或 Matrix.postTranslate 之间的区别?
【发布时间】:2012-11-05 22:19:41
【问题描述】:

我们使用Camera在canvas中做3D变换。我们通常旋转camera得到它的Matrix然后平移它。但是Camera也有translate的方法。使用方法的结果是不同的。

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

【问题讨论】:

    标签: android camera android-canvas translate


    【解决方案1】:

    两者兼有的原因是,矩阵乘法必须按特定顺序完成才能获得正确的结果(您可能已经知道)。

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

    所以如果你这样做:

    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 图形,这些信息尤其有用,因为那时这些矩阵会让人头疼。

    我希望这会有所帮助!

    【讨论】:

    • 您是否指导我查看您发现这一事实的文档?
    • 您能否提供支持您答案的链接?
    • 天哪。好久没写这篇了,说起来有点自大。该文档可以在维基百科上找到,具体是:en.wikipedia.org/wiki/…“注意,乘法是按照与英文句子相反的顺序进行的:“A 后跟 B”的矩阵是 BA,而不是 AB。”
    【解决方案2】:

    如果您不触摸画布但将相机旋转 90 度或保持相机静止但将其查看的画布旋转 -90 度,则结果在视觉上是相同的。

    【讨论】:

    • 你知道Android.Canvas上关于3D的任何好的文档或教程吗?似乎Magicsurd
    猜你喜欢
    • 2016-11-07
    • 1970-01-01
    • 2016-04-02
    • 2011-09-09
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2020-05-10
    相关资源
    最近更新 更多