当前位置:  开发笔记 > 编程语言 > 正文

如何在C#中一次旋转,缩放和转换矩阵?

如何解决《如何在C#中一次旋转,缩放和转换矩阵?》经验,为你挑选了1个好方法。

好的,这应该是一个简单的矩阵问题,但我对矩阵的理解有些局限.这是场景:我有一个1px乘1px的精灵,我希望按比例缩放x和y(每边不同的数量),然后我想将该精灵旋转一定角度,然后我希望能够精确定位整个事物(从左上角或中心,对我没有任何影响).

到目前为止,我的代码模糊地接近,但是根据我传入的角度,它往往会偏离一些随机数量.

我认为这样做会:

        Point center = new Point( 50, 50 );
        float width = 60;
        float height = 100;
        float angle = 0.5;
        Vector3 axis = new Vector3( center.X, center.Y, 0 );
        axis.Normalize();
        Matrix m = Matrix.Scaling( width, height, 0 ) *
            Matrix.RotationAxis( axis, angle ) *
            Matrix.Translation( center.X, center.Y, 0 );

但它倾向于缩小旋转线的缩小比例,尽管我认为它的定位是正确的.

我也试过这个:

  Matrix m = Matrix.Transformation2D( new Vector2( center.X, center.Y ), 0f,
      new Vector2( width, height ), new Vector2( center.X, center.Y ),
      angle, Vector2.Zero );

线看起来完全正确,具有完全正确的尺寸和形状,但我根本无法正确定位.如果我在上面的调用结束时使用翻译向量,或者如果我使用Sprite.Draw设置位置,则无法正常工作.

这一切都在SlimDX中.我究竟做错了什么?



1> Ben S..:

我刚刚经历了学习矩阵变换的痛苦,但使用的是XNA.

我发现这些 文章 来 是 很了解发生了什么帮助.XNA中的方法调用非常相似,其背后的理论都适用于您,即使使用SlimDX也是如此.

通过浏览你的代码,我认为你应该在开始时转换到原点,然后在结束时再次翻译到最终位置,尽管我在这方面仍然是一个新手.

我要做的顺序是:

翻译成原点

规模

旋转

转换到所需的位置

首先转换为原点的原因是旋转基于原点.因此,要围绕某个点旋转某些东西,请在旋转之前将该点放在原点上.

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有