> ## Documentation Index
> Fetch the complete documentation index at: https://cs-lua.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# vec

> Векторная математика: расстояние, длина, нормализация, углы

# vec

Векторная математика: расстояние, длина, нормализация, углы.

Чистая математика без обращения к движку или сущностям — векторы теми же
тройками чисел, что и везде в модуле (`p:origin()` возвращает `x, y, z`,
а не таблицу, и `vec.*` принимает их так же).

<h2 id="distance">
  vec.distance
</h2>

Расстояние между двумя точками.

```lua theme={null}
vec.distance(x1, y1, z1, x2, y2, z2)
```

### Аргументы

| # | имя          | тип    |              |
| - | ------------ | ------ | ------------ |
| 1 | `x1, y1, z1` | number | первая точка |
| 2 | `x2, y2, z2` | number | вторая точка |

### Возвращает

| тип      |                     |
| -------- | ------------------- |
| `number` | расстояние в юнитах |

### Пример

```lua theme={null}
local x1, y1, z1 = p:origin()
local x2, y2, z2 = other:origin()
local d = vec.distance(x1, y1, z1, x2, y2, z2)
```

<Note>
  `p:origin()` — не последний аргумент вызова, поэтому Lua обрежет его до
  одного значения, если передать его напрямую вторым в списке аргументов:
  разложи обе точки в переменные, как в примере выше.
</Note>

<h2 id="length">
  vec.length
</h2>

Длина вектора.

```lua theme={null}
vec.length(x, y, z)
```

### Аргументы

| # | имя       | тип    |        |
| - | --------- | ------ | ------ |
| 1 | `x, y, z` | number | вектор |

### Возвращает

| тип      |       |
| -------- | ----- |
| `number` | длина |

<h2 id="normalize">
  vec.normalize
</h2>

Вектор единичной длины в том же направлении.

```lua theme={null}
vec.normalize(x, y, z)
```

### Аргументы

| # | имя       | тип    |        |
| - | --------- | ------ | ------ |
| 1 | `x, y, z` | number | вектор |

### Возвращает

| тип                      |                  |
| ------------------------ | ---------------- |
| `number, number, number` | единичный вектор |

Нулевой вектор нормализуется сам в себя — деления на ноль не будет.

<h2 id="to_angle">
  vec.to\_angle
</h2>

Углы, которые смотрят вдоль вектора.

```lua theme={null}
vec.to_angle(x, y, z)
```

### Аргументы

| # | имя       | тип    |                    |
| - | --------- | ------ | ------------------ |
| 1 | `x, y, z` | number | вектор направления |

### Возвращает

| тип                      |                    |
| ------------------------ | ------------------ |
| `number, number, number` | `pitch, yaw, roll` |

### Пример

```lua theme={null}
local px, py, pz = p:origin()
local pitch, yaw, roll = vec.to_angle(target.x - px, target.y - py, target.z - pz)
p:angles(pitch, yaw, roll)   -- модель игрока разворачивается на точку
```

Обратная операция для [vec.angle\_vector](index.md#angle_vector).

<h2 id="angle_vector">
  vec.angle\_vector
</h2>

Единичный вектор направления взгляда для заданных углов.

```lua theme={null}
vec.angle_vector(pitch, yaw, roll)
```

### Аргументы

| # | имя                | тип    |      |
| - | ------------------ | ------ | ---- |
| 1 | `pitch, yaw, roll` | number | углы |

### Возвращает

| тип                      |                         |
| ------------------------ | ----------------------- |
| `number, number, number` | единичный вектор вперёд |

### Пример

```lua theme={null}
local fx, fy, fz = vec.angle_vector(p:pev("v_angle"))
```

Тот же движковый вызов, что `p:trace()` использует для направления взгляда
игрока (`MAKE_VECTORS`), только без привязки к конкретному игроку — годится
для сущностей и вычисленных углов.

### Смотри также

* [vec.to\_angle](index.md#to_angle)
