在2D向量空间中移动原点

时间:2018-11-07 18:54:35

标签: c# .net vector 2d monogame

我试图了解有关2D空间中Vector的更多信息,以及如何在Gamedevelopment中使用它们。

我创建了一个小项目,用于使用Monogame框架将Vector A的“投影”可视化为C#中的Vector B。

projection example

一切正常,但是现在我想将原点(当前位于左上角)移动到自定义位置。因此,例如,我可以在屏幕中间绘制线条。

我想在没有任何帮助的情况下首先执行此操作,以了解正在发生的事情。

但是我不知道该怎么做,如果这实际上是Vector空间中的最佳实践,或者我应该仅以偏移量“绘制”线条。

我对数学符号和函数的理解不是很好,因此,如果您为我提供数学上的答案,请也解释这些符号。

编辑:

我创建了另一个项目以可视化某个点是否在某个角度内,但是这次我尝试绘制所有与原始矢量(左)相邻的偏移(右)的东西。

projection2 example

如您所见,如果我用偏移量绘制它看起来很好,但是我无法想象在游戏中使用此方法。主要是因为相对于我的鼠标,所有东西都有一个奇怪的偏移量(duh ..),因此您需要实现自己的游标(哪些游戏可以运行,但仍然...)

EDIT2:

让我的问题更加清楚.. 如果你看我的第二个例子。想象一下,作为代理(NPC或Player或其他)的权利的原点,以及将BC(和BC2)作为其视野的原点。 如果我想计算视野范围内的内容,可以按照与示例相同的方式操作,但此“起点”点应为(0,0)(左上角), 落后

我可能缺少一些显而易见的东西,并且对此进行了认真的思考。

1 个答案:

答案 0 :(得分:0)

所以我终于发现了它是如何工作的。

显然,您使用的是不同的spacesframes,而不是移动origin(也称为reference)。

一个空间可以居住在另一个空间内,但是现在让我们保持简单,只有2个空间。
第一个空间是您的“主要”空间(在游戏开发中大多数时候称为world
第二个空格是您的“查看”空格(或camera
(我在此答案中始终使用worldview

我正在世界空间中进行所有Vector计算。因此,在将这些矢量绘制到屏幕上时,它们是相对于世界参照(在屏幕的左上方)在位置绘制的。


要将矢量绘制到其他位置,我需要translate
平移是沿轴移动矢量。

这种“改变”矢量位置/比例/旋转的动作称为Transformation

  

我们可以看到向量空间中的变换只是从一个空间到另一个空间的变化。   quote

此翻译由Translation Matrix完成(报价链接中的更多信息)。


因此,借助这些空间转换的知识,我修复了程序。

所有向量都以与以前相同的方式初始化,但是当我将向量绘制到屏幕上时,我会根据预定义的转换矩阵对其进行翻译。我将此矩阵称为viewMatrix,因为它将向量从world空间转换为view空间。

但是有一件事需要修复。

向量pointA不是在world空间中定义的,而是在view空间中定义的。 因此,这意味着当我的鼠标位于位置(20,20)时,该位置与world悬空中的位置(20,20)不同。

要解决此问题,我需要使用translate invert pointA translation matrix向量。这会将向量转换为world空间内的向量。


就是这样。 我花了两天的时间才能解决这个问题。

这是第二个示例的固定版本。
左:我的world空间
右:我的view空间

注意现在我的鼠标如何在视图空间而不是在世界空间正确对齐 projection2_fixed


在此过程中,我收集了一些资源:
Article - World, View and Projection Transformation Matrices
The True Power of the Matrix (Transformations in Graphics) - Computerphile
RB Whitaker - Basic Matrices
Making a Game Engine: Transformations