【问题标题】:Vector movement with respect to rotation相对于旋转的矢量运动
【发布时间】:2012-03-21 15:39:45
【问题描述】:

假设我有一个向量 (x,y),它通过旋转与原点对齐(例如,向上 30 度)。

如果我想将该向量相对于方向移动一个单位(因此,一个单位向前向上 30 度),我该怎么做?

我正在制作一个简单的第三人称游戏,我希望能够旋转角色并使其向前移动,而不管旋转如何,我有点不知道如何做到这一点。

编辑:

在回答完这个问题后,我继续研究如何获得向后,向左和向右移动,所以我想如果有人需要帮助,我会把它贴在这里以供参考。

鉴于 Gunther2 的代码, 要获得向后运动,只需从当前位置减去位移:

position -= displacement;

要获得左运动,请将位移变量更改为

displacement.x = (float)Math.Sin(angle + PI/2); 
displacement.y = (float)Math.Cos(angle + PI/2);

如果 Sin/Cos 接受度数而不是弧度,则将 PI/2 替换为 90。

然后减去位移:

position -= displacement;

要获得正确的运动,只需按照相同的步骤添加新的位移:

position += displacement;

【问题讨论】:

    标签: vector rotation trigonometry


    【解决方案1】:

    首先你需要一个表示角度的向量:

    Vector2 displacement;
    displacement.x = (float)Math.Sin(angle);
    displacement.y = (float)Math.Cos(angle);
    

    然后,由于该向量 (x,y) 的长度始终为 1,因此您将其乘以您行进的距离。如果你想走 1 的距离,那么 X 和 Y 已经是它们需要的大小了。

    displacement *= speed;  // Assuming your Vector2 *= operator supports a scalar
    

    将位移添加到当前位置:

    position += displacement;
    

    【讨论】:

    • 完美!我实际上使用的是 Vector3,但我修改了代码以适应它 - 我在那里非常困惑一段时间,因为 Unity 中的 Mathf.Sin 和 Cos 函数(这是我正在使用的)采用弧度值而不是一级(这有点像他们为旋转提供的东西)。但是在我克服了那个障碍之后,它的效果很好!非常感谢!
    • 这些是我最喜欢的问题类型。很高兴我能帮上忙:]
    猜你喜欢
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多