---
title: "矢量和向量"
image: "https://wiki.wrightkit.dev/og.png"
---

> Documentation Index
> Fetch the complete documentation index at: https://wiki.wrightkit.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# 矢量和向量

## 矢量

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

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

![1.png](https://p.pstatp.com/origin/pgc-image/f56f5722028940a185a8373bd6d82dec)

在这张图中，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|`，可以使用标量积函数帮助计算

Source: https://wiki.wrightkit.dev/zh/manual/vector/index.mdx
