【问题标题】:How do Vectors and Matrices work into computer graphics, such as Matrix Rotations?向量和矩阵如何应用于计算机图形,例如矩阵旋转?
【发布时间】:2011-12-03 20:46:58
【问题描述】:

我一直在努力思考我的线性和向量代数知识如何与计算机图形学相适应。尤其是 C# 语言

我的意思是: 积分 矢量图 矩阵 矩阵乘法 - 旋转、倾斜等。

这是我的目标:创建一个简单的框,并通过矩阵乘法对其应用旋转、平移和倾斜。之后,开始摆弄相机。我希望自己做这一切,只使用实际接收数据并绘制数据的函数。我希望在两者之间创建所有合乎逻辑的东西。

这是我到目前为止所得到的: 我的自定义 Vector3 类,其中包含 - 一个 X、Y 和 Z 变量(浮点数) - 几个静态矩阵(作为 2x2 2d 浮点数组?)包含零和平移矩阵(用于 2x2 和 3x3) -方法 1. Rotate(float inAngle) - 创建一个旋转矩阵并将 xyz 乘以它。 2. Translate(inx,iny,inz) - 将ins添加到成员变量中 3.等等……

完成后,我将向量转换回 C# Vector3 类并将其传递给绘图类,例如绘制线条的 DrawPrimitiveShapes。

盒子类是这样的: 4个Vector3,UpperLeftX,UpperRightX,LowerLeftX,LowerRightX

一个 Draw 类,它使用 4 个点然后为每个点渲染线条

我的困惑在于:

如何旋转这个盒子?通过使用 4 个 vector3 的盒子,我是否走在正确的轨道上? 我只是将所有四个vector3旋转一个角度并完成它吗?如果中间有所有这些纹理数据,纹理如何旋转?

【问题讨论】:

  • 我并不完全熟悉线性代数和你想要做的任何事情,但听起来你的操作水平比 XNA 要求的要低得多(我假设你正在使用 XNA因为你这样标记它?)。 XNA 有一个预先构建的 Matrix 类,其中包含大量有用的静态方法来创建一个矩阵来随心所欲地转换您的对象。您可以使用 Vector3.Transform 根据您构建的矩阵移动您的顶点。有很多关于使用矩阵进行 3d 对象操作的教程。对不起,如果我误解了你打算在这里做什么。
  • 感谢 A 型的评论。你似乎明白我正在努力做的事情。知道我可以使用哪种更好的语言来轻松地将矢量和线条绘制到屏幕上吗?我希望保持 2D,但我注意到大多数人使用 Vector3 甚至用于 2D,将 z 值保留为 0。
  • XNA 在绘制简单的矢量和线条方面确实有点糟糕,老实说。它适用于绘制完整的模型网格。我看过我的教授的物理演示,其中使用 Python 在坐标平面上绘制了一些矢量图。看看这是否对你有帮助:msdn.microsoft.com/en-us/library/…
  • 再次感谢。我一直在了解这些知识和史蒂夫的帖子。我目前创建了我自己的 Vector3 类(这有点傻,因为它只是在完成翻译后转换回 Vector3)和一个 Cube 类,它根据位置、长度、宽度和高度创建 8 个顶点。我使用基本效果将 36 个 VertexPositionNormalTexture 放入数组中,然后绘制它。这是真正的hacky,但它现在有效并且正在完成工作。如果我可以在某处发布代码以帮助其他人,我会的。

标签: c# xna drawing shape vector-graphics


【解决方案1】:

我学习的方法是使用内置 Xna 方法的上层,并使用“反射器”查看这些方法的内部以了解它们是如何工作的。

要旋转盒子,四个顶点中的每一个都需要从它们所在的位置变换到:围绕特定轴的度数。

在 Xna 2d 中,轴始终是 Z 轴,并且该轴始终穿过世界原点,即 xna 中屏幕的左上角。

所以要在 xna 中旋转你的四个矩形顶点,你可以这样做:

foreach(Vector2 vert in vertices)
{
   vert = Vector2.Transform(vert, Matrix.CreateRotationZ(someRadians));
}

这会让顶点旋转(环绕)屏幕的左上角。

为了让盒子在原地旋转,您首先将盒子移动到屏幕的左上角,稍微旋转一下,然后再将其移回。所有这些都发生在一个帧中,所以用户看到的只是旋转到位的矩形。在代码中有很多方法可以做到这一点,但这是我最喜欢的:

// assumes you know the center of the rectangle's x & y as a Vector2 'center'    
foreach(Vector2 vert in vertices)
    {
       vert = Vector2.Transform(vert - center, Matrix.CreateRotationZ(someRadians)) + center;
    }

现在,如果您要反映“Matrix.CreateRotationZ”方法或“Vector2.Transform”方法,您会看到 MS 用来完成这项工作的代码行。通过研究它们,您可以更有效地学习背后的数学原理,而无需进行如此多的反复试验。

【讨论】:

  • 非常感谢史蒂夫的深入回复。我想我差不多明白我将如何做到这一点。我给你的最后一个问题:你使用什么类/方法来以图形方式显示框? (Spritebatch?DrawPrimitiveLines?)
  • 我几乎没有在 2d 中工作过,我不确定哪个会更好。不过对于这个论坛来说可能是一个很好的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-07
  • 2012-03-05
  • 1970-01-01
相关资源
最近更新 更多