vector
Трёхмерный вектор: позиции, направления, скорости в мире игры. Поля x, y, z (числа с плавающей точкой).
Общее для vector, angle, vector2, color#
- Методы вызываются через двоеточие (
v:length()) или через тип (vector.length(v)). - Аргументы методов проверяются: неверный тип даёт ошибку
bad argument '<арг>' to '<метод>' (<Тип> expected, got <type>). tostring(v)даётVector(1.000000, 2.000000, 3.000000);v:strval()— только содержимое:1.000000, 2.000000, 3.000000.==сравнивает покомпонентно; значение другого типа даётfalse.vector.typesafe(false)отключает проверку аргументов для всего типа,vector.typesafe(true)— включает обратно.
vector(x?: number, y?: number, z?: number)#
Создаёт вектор. Незаданные компоненты равны 0. vector(v) — копия вектора v. То же самое — vector.new(...).
| Параметр | Тип | Описание |
|---|---|---|
x, y, z |
number |
компоненты, по умолчанию 0 |
Возвращает: vector.
local a = vector(1, 2, 3)
local b = vector(a) -- копия
b.z = 10
print(a, " ", b)
Операторы#
| Выражение | Результат |
|---|---|
a + b, a - b |
покомпонентно |
a * n, n * a |
масштаб на число |
a * b |
покомпонентное умножение |
a / n, a / b |
деление на число или покомпонентно |
-a |
вектор с обратным знаком |
#a |
длина (как a:length()) |
local me = entity.local_pawn()
if me then
local ahead = me:eye_position() + me:eye_angles():forward() * 100
print(ahead)
end
v:unpack()#
Возвращает: number, number, number — x, y, z.
local x, y, z = vector(1, 2, 3):unpack()
print(x + y + z) --> 6
v:init(...)#
Переинициализирует вектор на месте. Аргументы — как у конструктора; без аргументов — нулевой вектор.
| Параметр | Тип | Описание |
|---|---|---|
... |
number |
компоненты |
Возвращает: ничего.
local v = vector(5, 5, 5)
v:init(1, 0, 0)
print(v) --> Vector(1.000000, 0.000000, 0.000000)
src:copy(dst: vector)#
Копирует компоненты src в dst.
| Параметр | Тип | Описание |
|---|---|---|
dst |
vector |
куда копировать |
Возвращает: ничего.
local saved = vector()
local me = entity.local_pawn()
if me then me:origin():copy(saved) end
v:length(), v:lengthsqr()#
Длина вектора и её квадрат. Квадрат быстрее: удобно для сравнения расстояний.
Возвращает: number.
local v = vector(3, 4, 0)
print(v:length(), " ", v:lengthsqr()) --> 5 25
v:length2d(), v:length2dsqr()#
Длина по осям X и Y (без высоты) и её квадрат.
Возвращает: number.
local me = entity.local_pawn()
if me then print("Скорость по земле: ", math.floor(me:velocity():length2d())) end
a:dist(b: vector), a:distsqr(b: vector)#
Расстояние между точками и его квадрат.
| Параметр | Тип | Описание |
|---|---|---|
b |
vector |
вторая точка |
Возвращает: number.
-- Ближайший противник
local me = entity.local_pawn()
if me then
local best, best_d = nil, math.huge
for _, pawn in ipairs(entity.pawns(true)) do
local d = me:origin():distsqr(pawn:origin())
if d < best_d then best, best_d = pawn, d end
end
print(best and best:name() or "никого")
end
a:dist2d(b: vector), a:dist2dsqr(b: vector)#
Расстояние по осям X и Y (без высоты) и его квадрат.
| Параметр | Тип | Описание |
|---|---|---|
b |
vector |
вторая точка |
Возвращает: number.
print(vector(0, 0, 0):dist2d(vector(3, 4, 100))) --> 5
a:dot(b: vector)#
Скалярное произведение.
| Параметр | Тип | Описание |
|---|---|---|
b |
vector |
второй вектор |
Возвращает: number.
-- Смотрит ли игрок примерно в сторону врага (угол меньше ~25°)
local me = entity.local_pawn()
local enemy = entity.pawns(true)[1]
if me and enemy then
local fwd = me:eye_angles():forward()
local to = me:eye_position():to(enemy:eye_position())
print(fwd:dot(to) > 0.9)
end
a:cross(b: vector)#
Векторное произведение.
| Параметр | Тип | Описание |
|---|---|---|
b |
vector |
второй вектор |
Возвращает: vector.
print(vector(1, 0, 0):cross(vector(0, 1, 0))) -- (0, 0, 1)
a:lerp(b: vector, t: number)#
Линейная интерполяция между a и b.
| Параметр | Тип | Описание |
|---|---|---|
b |
vector |
вторая точка |
t |
number |
доля: 0 — a, 1 — b |
Возвращает: vector.
local mid = vector(0, 0, 0):lerp(vector(10, 20, 30), 0.5)
print(mid) -- (5, 10, 15)
a:to(b: vector)#
Единичный вектор направления от a к b.
| Параметр | Тип | Описание |
|---|---|---|
b |
vector |
точка назначения |
Возвращает: vector.
local dir = vector(0, 0, 0):to(vector(10, 0, 0))
print(dir) -- (1, 0, 0)
v:normalize(), v:normalized()#
normalize делает вектор единичным на месте и возвращает прежнюю длину (0 — вектор был нулевым). normalized возвращает единичную копию, не меняя исходный.
Возвращает: normalize — number; normalized — vector.
local v = vector(3, 4, 0)
local len = v:normalize()
print(len, " ", v) -- 5 и вектор (0.6, 0.8, 0)
v:normalize_safe(fallback: vector), v:normalized_safe(fallback: vector)#
Как normalize и normalized, но при нулевой длине результатом становится fallback.
| Параметр | Тип | Описание |
|---|---|---|
fallback |
vector |
значение при нулевой длине |
Возвращает: normalize_safe — number; normalized_safe — vector.
local dir = vector(0, 0, 0):normalized_safe(vector(1, 0, 0))
print(dir) -- (1, 0, 0)
v:scale(s: number), v:scaled(s: number)#
scale умножает вектор на число на месте, scaled возвращает умноженную копию.
| Параметр | Тип | Описание |
|---|---|---|
s |
number |
множитель |
Возвращает: scale — ничего; scaled — vector.
local v = vector(1, 2, 3)
print(v:scaled(2), " ", v) -- копия и неизменённый исходный
v:scale(10)
print(v)
v:negate()#
Меняет знак всех компонент на месте.
Возвращает: ничего.
local v = vector(1, -2, 3)
v:negate()
print(v) -- (-1, 2, -3)
fwd:angles(pseudo_up?: vector)#
Углы, задающие направление fwd. С pseudo_up считается ещё и крен.
| Параметр | Тип | Описание |
|---|---|---|
pseudo_up |
vector |
приблизительный вектор «вверх» |
Возвращает: angle.
-- Углы, чтобы посмотреть из глаз на врага
local me = entity.local_pawn()
local enemy = entity.pawns(true)[1]
if me and enemy then
local ang = (enemy:eye_position() - me:eye_position()):angles()
print(ang)
end
fwd:vectors()#
Векторы «вправо» и «вверх» для направления fwd.
Возвращает: vector, vector — right, up.
local right, up = vector(1, 0, 0):vectors()
print(right, " ", up)
p:closest_line_point(a: vector, b: vector)#
Ближайшая к p точка отрезка a–b.
| Параметр | Тип | Описание |
|---|---|---|
a |
vector |
начало отрезка |
b |
vector |
конец отрезка |
Возвращает: vector.
local p = vector(5, 5, 0):closest_line_point(vector(0, 0, 0), vector(10, 0, 0))
print(p) -- (5, 0, 0)
p:inverse_lerp(a: vector, b: vector)#
Параметр t проекции точки p на прямую a → b (не обрезается до 0–1).
| Параметр | Тип | Описание |
|---|---|---|
a |
vector |
начало |
b |
vector |
конец |
Возвращает: number, vector — t и вектор b - a. Если a и b почти совпадают — 0, b - a.
local t = vector(2.5, 3, 0):inverse_lerp(vector(0, 0, 0), vector(10, 0, 0))
print(t) --> 0.25
p:ray_dist(start: vector, dir: vector)#
Расстояние от точки p до луча из start в направлении dir (dir должен быть единичным).
| Параметр | Тип | Описание |
|---|---|---|
start |
vector |
начало луча |
dir |
vector |
единичное направление |
Возвращает: number.
-- Насколько враг далёк от линии прицела
local me = entity.local_pawn()
local enemy = entity.pawns(true)[1]
if me and enemy then
local d = enemy:eye_position():ray_dist(me:eye_position(), me:eye_angles():forward())
print("До линии прицела: ", math.floor(d))
end