【问题标题】:Moving the origin in a 2D Vector space在二维向量空间中移动原点
【发布时间】:2023-07-04 10:19:01
【问题描述】:

我正在尝试更多地了解 2D 空间中的向量以及如何在游戏开发中使用它们。

我创建了一个小项目,用于使用 Monogame 框架在 C# 中将向量 A“投影”到向量 B 上。

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

我想在没有图书馆帮助的情况下先了解正在发生的事情。

但我不知道如何做到这一点,如果这实际上是向量空间中的最佳实践,或者我应该只是用偏移量“绘制”我的线..

我对数学符号和函数的理解不是很好,所以如果您提供数学答案,请同时解释这些符号。

编辑:

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

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

EDIT2:

让我们让我的问题更清楚一点.. 如果你看我的第二个例子。想象右边的起源是代理(NPC 或玩家或其他),而 BC 段(和 BC2)是它的视野。 如果我想计算它的视觉范围内的内容,我可以像我做示例的方式一样但是这个“原点”点将在 (0,0)(左上角)和那是在代理之后

我可能遗漏了一些明显的东西,并且对此想得太难了..

【问题讨论】:

    标签: c# .net vector 2d monogame


    【解决方案1】:

    所以我终于知道这是怎么回事了..

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

    一个空间可以存在于另一个空间中,但现在让我们保持简单,使用 2 个空间。
    第一个空间是你的“主要”空间(大部分时间在游戏开发中称为world
    第二个空间是您的“视图”空间(或camera
    (我在整个答案中使用worldview

    我在我的世界空间中进行所有向量计算。因此,当将这些矢量绘制到屏幕上时,它们会绘制在相对于世界参考的位置(即屏幕的左上角)。


    要在其他地方绘制我的矢量,我需要 translate 他们。
    平移是沿轴移动向量。

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

    我们可以将向量空间中的变换简单地视为从一个空间到另一个空间的变化。 quote

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


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

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

    但有一件事需要解决。

    向量pointA 不是在world 空间中定义,而是在view 空间中。 所以这意味着当我的鼠标在位置 (20,20) 上时,这个位置与我的 world sapce 中的位置 (20,20) 不同。

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


    就是这样。。 我花了 2 天时间才弄明白。

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

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


    以下是我一路收集的一些资源:
    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

    【讨论】:

      最近更新 更多