# 矢量

矢量是一个由三个数字组成的、有方向的量。在OW中,矢量更类似于一个三维坐标点。又分为本地矢量和地图矢量。

本地矢量即原点位于玩家位置,玩家面对方向为Z轴正方向的坐标系。如图所示:

1.png

在这张图中,Z轴正方向为玩家面对的方向。X轴正方向为玩家左侧。Y轴正方向为玩家上方。例如:

  • 坐标(1,1,1)位于玩家的左、前、上方向。
  • 图中的F点坐标为(-1,2,-1),位于玩家的右、后、上方向。

注意:本地矢量的XoZ平面与地图矢量的XoZ平面完全平行,不会因为玩家低头或仰头改变。

  • 本地矢量和地图矢量可以通过函数“地图矢量”和“本地矢量”互相转换。
  • 矢量本身与参考系无关,当你使用动作时,一般会有“相对:至地图/至玩家”的选项。当你选择“至地图”时,游戏则会将矢量当做地图矢量来处理。反之亦然。

# 向量

矢量和向量其实是一个东西。在OW中,向量可以用来方便的表示一个矢量到另一个矢量的方向。

即:向量(A, B)=矢量(Xb - Xa, Yb - Ya, Zb - Za)

# 旋转和转换

将本地矢量转换为地图矢量时,可以选择“旋转”或“旋转并转换”。它们的区别是:

  • 旋转
    • 只会对本地矢量进行旋转
    • 例如玩家位于(1, 1, 1),面向X、Z中间时,将(0, 0, 1)转换为地图矢量的结果是(0.70, 0, 0.70)
  • 旋转并转换:
    • 对本地矢量进行旋转,然后平移到玩家所在的位置
    • 例如玩家位于(1, 1, 1),面向X、Z中间时,将(0, 0, 1)转换为地图矢量的结果是(1.70, 1, 1.70)

# 技巧

  • 你可以使用矢量积取得两个矢量的垂直方向
  • 你可以使用标量积判断两个矢量之间的夹角大小
    • a · b > 0方向基本相同,夹角在0°到90°之间
    • a · b = 0正交,相互垂直
    • a · b < 0方向基本相反,夹角在90°到180°之间
  • 你可以使用上、下、左、右、前、后来代替手动写X、Y、Z坐标
  • 你可以使用乘(上, 矢量A)来取得矢量A的Z方向矢量。以此类推,例如当你需要让英雄面向地图的正Z方向,但不需要改变英雄的X、Y方向时,可以使用乘(矢量(1, 1, 0), 面朝方向(事件玩家))方便编写。

# 示例

# 获取玩家面前的坐标

利用本地矢量和地图矢量的转换,我们可以比较方便的获取基于玩家位置的坐标。例如,我们想要获取玩家面前1单位处的坐标,则可以使用:

  • 地图矢量(矢量(0, 0, 1), 事件玩家, 旋转并转换)

# 击退:使用向量

效果:伤害敌人造成击退。假设A击中B时,我们希望让B在A-B向量上移动10单位。

  • 事件:玩家受到伤害
  • 动作:施加推力(事件玩家, 向量(位置(攻击方), 位置(事件玩家)), 10, 至地图, 取消相反运动)

# 击退:手动计算矢量

效果:伤害敌人造成击退。假设A击中B时,我们希望让B在A-B向量上移动10单位。

  • 事件:玩家受到伤害
  • 动作:施加推力(事件玩家, 矢量(减(X方向分量(位置(攻击方)), X方向分量(位置(事件玩家))), 减(Y方向分量(位置(攻击方)), Y方向分量(位置(事件玩家))), 减(Z方向分量(位置(攻击方)), Z方向分量(位置(事件玩家)))), 10, 至地图, 取消相反运动)

# 三角函数计算

我们演示一下三角函数的使用。因为比较复杂,特别是OW中编写就更复杂了,所以实际上不会这样写,仅作为参考:

  • 通过“向量”我们可以得到一个方向,假设是向量A(X,Y,Z)。
  • 余弦:计算向量A与向量(0,Y,Z)的夹角(即向量A与Y-Z平面的夹角),则可以得出Z方向位移=总距离*cos(夹角)
  • 正弦:计算向量A与向量(X,Y,0)的夹角(即向量A与X-Y平面的夹角),则可以得出Z方向位移=总距离*sin(夹角)

正弦和余弦可以这样计算:

  • sin = a × b / |a||b|,可以使用矢量积函数帮助计算
  • cos = a · b / |a||b|,可以使用标量积函数帮助计算