如何在C#中一次旋转、缩放和变换矩阵?好的,这应该是一个简单的矩阵问题,但是我对矩阵的理解有些局限。场景如下:我有一个1pxx1px的精灵,我想按比例缩放x和y(每边的数量不同),然后我想将该精灵旋转一个角度,然后我希望能够精确定位整个事情(从左上角或中间,对我来说没有任何区别)。到目前为止,我的代码已经模糊地接近了,但它往往会被一些随机数量抵消,具体取决于我传入的角度。我认为这样做可以:Pointcenter=newPoint(50,50);浮动宽度=60;浮动高度=100;浮动角度=0.5;Vector3轴=newVector3(center.X,center.Y,0);轴.Normalize();矩阵m=Matrix.Scaling(width,height,0)*Matrix.RotationAxis(axis,angle)*Matrix.Translation(center.X,center.Y,0);但它倾向于缩小旋转线,尽管我认为它的位置正确。我也试过这个:Matrixm=Matrix.Transformation2D(newVector2(center.X,center.Y),0f,newVector2(width,height),newVector2(center.X,center.Y),angle,Vector2。零);线条看起来完全正确,大小和形状完全正确,但我根本无法正确定位。如果我在上面的调用结束时使用平移矢量,或者如果我使用Sprite.Draw设置位置,它就不起作用。这一切都在SlimDX中。我究竟做错了什么?我刚刚经历了学习矩阵变换的痛苦,但使用的是XNA。我发现这些文章对理解发生的事情非常有帮助。XNA中的方法调用非常相似,它背后的理论应该对您都适用,即使使用SlimDX也是如此。通过查看你的代码,我认为你应该在开始时翻译到原点,然后再翻译到最后的最终位置,尽管我在这方面还是个新手。我这样做的顺序是:首先转换为原点的原因是旋转是基于原点的。因此,要围绕一个点旋转某物,请在旋转之前将该点置于原点。好的,现在可以了。这是我的工作代码,以防其他人需要它:PointsourceLoc=newPoint(50,50);浮动长度=60;浮动厚度=2;浮动角度=0.5;矩阵m=Matrix.Scaling(length,thickness,0)*Matrix.RotationZ(angle)*Matrix.Translation(sourceLoc.X,sourceLoc.Y,0);精灵.Transform=m;sprite.Draw(this.tx,Vector3.Zero,Vector3.Zero,Color.Red);这将绘制一条您选择的长度的斜线,其厚度等于您选择的厚度(假设您的纹理是1×1像素的白色图像)。源位置是线条从您指定的任何角度(以弧度为单位)发出的位置。因此,如果您从0开始并以类似0.1的幅度递增,直到您达到2PI,然后重置为0,您将拥有一条围绕中心旋转的线,就像时钟指针或雷达扫描一样。这就是我想要的——感谢所有贡献者!您是否绕着正确的轴旋转?我是矩阵的新手,但在我看来,由于精灵存在于x,y空间中,因此旋转轴应该是Z轴——即(0,0,1)。您需要做的是一次完成每个转换。比例首先绘制它。这就是您期望的位置。然后旋转并翻译。这将有助于发现错误的假设。您还可以绘制临时线以帮助定位坐标。例如,如果您拉伸和旋转,并期望终点为0,0。用0,0处的一个端点绘制另一条线将作为双重检查以查看是否确实如此。对于您的具体问题,问题可能出在轮换上。缩放和旋转后,线条现在偏离中心,导致翻译时出现问题。一般的解决方案是将线移回原点以进行任何涉及更改形状或方向的操作。然后您可以过渡到您的最终目的地,因为您位于一个已知的好位置。对评论的回应如果转换是一个问题,并且您正在转换坐标系,那么您将需要编写转换函数以在旧系统和新系统之间进行转换。例如,如果旋转45度。您可以平移0,1以在旋转之前向上移动1英寸。旋转后,您必须大致平移-.70707,其中.070707相对于原始坐标系向上移动1英寸。以上是C#学习教程:如何在C#中一次旋转、缩放、变换矩阵?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
