# 矢量
矢量是一个由三个数字组成的、有方向的量。在OW中,矢量更类似于一个三维坐标点。又分为本地矢量和地图矢量。
本地矢量即原点位于玩家位置,玩家面对方向为Z轴正方向的坐标系。如图所示:
在这张图中,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|
,可以使用标量积函数帮助计算