как сделать, чтобы вектор направлялся в ближайшего игрока, не зависимо, куда смотрит стрелок

astr34

Активный участник
Регистрация
16 Июл 2023
Сообщения
18
Если известна цель и место запуска, то для получения вектора до цели нужно отнять от координат цели координаты стрелка и разделить разницу {dx, dy, dz} на диагональ sqrt(dx²+dy²+dz²).
 

Mee8YT

Эксперт
Регистрация
3 Май 2023
Сообщения
298
которое наводит взгляд игрока на цель?
да
Сообщение объединено:

которое наводит взгляд игрока на цель?
условно есть 2 игрока, МЫ (и1) и ВРАГ (и2), и какой-то левый игрок (п3)
условно мы должны попасть в игрока2

мы можем создать массив с расстояниями игроков до нас, а потом выбрать самое маленькое расстояние, и выбрать игрока с таким расстоянием до нас, мы можем получить его корды и все дела, НО, по хорошему ещё-бы игрока1 направить чётко на врага
 

astr34

Активный участник
Регистрация
16 Июл 2023
Сообщения
18
да
Сообщение объединено:


условно есть 2 игрока, МЫ (и1) и ВРАГ (и2), и какой-то левый игрок (п3)
условно мы должны попасть в игрока2

мы можем создать массив с расстояниями игроков до нас, а потом выбрать самое маленькое расстояние, и выбрать игрока с таким расстоянием до нас, мы можем получить его корды и все дела, НО, по хорошему ещё-бы игрока1 направить чётко на врага
Для получения новых координат взгляда можно выразить обратно sin(pitch) и sin(yaw) из формул вектора взгляда, а потом по табличке обратно получить градусные значения.

Формулы вектора взгляда:
X = -sin(yaw)*cos(pitch)
Y = -sin(pitch)
Z = cos(yaw)*cos(pitch)

pitch = arcsin(-1*Y)

т.к синус может соответствовать двум точкам на окружности, определить точку yaw можно по знаку cos(yaw), а т.к cos(pitch) всегда положителен, то можно смотреть знак сразу у координаты Z вектора:

если Z >= 0:
yaw = arcsin(-1*X/cos(pitch))
иначе:
yaw = 180 - arcsin(-1*X/cos(pitch))

Получать arcsin можно следующим образом: т.к значения функции sin (и аргумент функции arcsin) находятся в пределах [-1; 1], а индексом массива могут быть только целые числа начиная с 1, то нужно домножать (аргумент arcsin) на какое-то число (от которого будет зависеть точность), прибавлять половину диапазона и ещё 1, а затем округлять до целого. Занести числа в табличку можно пробежавшись по углам (от -90 до 90) (вычисляя их синус) и присвоив каждому индексу угол ближайшего из значений, между которыми находится значение индекса.
 

Mee8YT

Эксперт
Регистрация
3 Май 2023
Сообщения
298
Получать arcsin можно следующим образом: т.к значения функции sin (и аргумент функции arcsin) находятся в пределах [-1; 1], а индексом массива могут быть только целые числа начиная с 1, то нужно домножать (аргумент arcsin) на какое-то число (от которого будет зависеть точность), прибавлять половину диапазона и ещё 1, а затем округлять до целого. Занести числа в табличку можно пробежавшись по углам (от -90 до 90) (вычисляя их синус) и присвоив каждому индексу угол ближайшего из значений, между которыми находится значение индекса.
можно тут подробнее?
 

astr34

Активный участник
Регистрация
16 Июл 2023
Сообщения
18
можно тут подробнее?
Создаем массив длиной допустим 201, в котором будут храниться значения arcsin, где 1 индекс соответствует -1; 101 - 0; 201 - 1. Получить индекс по аргументу (x) функции arcsin можно так: округлить(x*100+101).
Заполняем массив arcsin:
Код:
this = -90
next = -89.9
x = -1
i = 1
пока next <= 90:
    this_sin = sin(this)
    next_sin = sin(next)
    если this_sin <= x <= next_sin:
        // при маленьком шаге угла можно присваивать любой
        если (x-this_sin) >= (next_sin-x):
            arcsin[i]=next
        иначе:
            arcsin[i]=this
        x+=0.01
        i+=1
    this+=0.1
    next+=0.1
 

andrey67

Новичок
Регистрация
8 Июн 2023
Сообщения
21
Код:
this = -90
next = -89.9
x = -1
i = 1
пока next <= 90:
    this_sin = sin(this)
    next_sin = sin(next)
    если this_sin <= x <= next_sin:
        // при маленьком шаге угла можно присваивать любой
        если (x-this_sin) >= (next_sin-x):
            arcsin[i]=next
        иначе:
            arcsin[i]=this
        x+=0.01
        i+=1
    this+=0.1
    next+=0.1
как я понял, это надо вызывать до вычислений вектора? а так +- я понял как это работает
 

astr34

Активный участник
Регистрация
16 Июл 2023
Сообщения
18
как я понял, это надо вызывать до вычислений вектора? а так +- я понял как это работает
Это код для заполнения таблицы arcsin. Ее нужно заполнить один раз, после можно получать значения из нее по индексу округлить(аргумент_arcsin*100+101).
 

Meds67u

Новичок
Регистрация
19 Окт 2023
Сообщения
2
Создаем массив длиной допустим 201, в котором будут храниться значения arcsin, где 1 индекс соответствует -1; 101 - 0; 201 - 1. Получить индекс по аргументу (x) функции arcsin можно так: округлить(x*100+101).
Заполняем массив arcsin:
Код:
this = -90
next = -89.9
x = -1
i = 1
пока next <= 90:
    this_sin = sin(this)
    next_sin = sin(next)
    если this_sin <= x <= next_sin:
        // при маленьком шаге угла можно присваивать любой
        если (x-this_sin) >= (next_sin-x):
            arcsin[i]=next
        иначе:
            arcsin[i]=this
        x+=0.01
        i+=1
    this+=0.1
    next+=0.1
Нупы ,я уже давно сделал арк синус ,арк тангенс ,арк косинус , арк котангенс , и arcsinh , arccosh , arctanh . А вы тут свои таблицы юзаете . Пример есть в мире /ad unusual , делал для xxTIKOPROxx_work,правда там старая версия , щас уже лучшая точность
 
Последнее редактирование:

Mee8YT

Эксперт
Регистрация
3 Май 2023
Сообщения
298
@Meds67u раз мы нубы, научи, а не выпендривайся)
старшие вроде как должны показывать пример младшим, ведь я десятилетка по словам клоуна, да, медс?)
насок сделал выгружаемые плоты в своё время очень хорошо, но он не выпендривался, или флок сделал выгружаемые плоты, тот не рыпался, насколько я помню
почему ты не выпендриваешься своей лишней хромосомой?
если ты что-то умеешь на уровне ВАУ, и что почти никто не делал - научи людей которые способны вообще понять чё ты нести будешь

мы с клоуна всегда посмеёмся, и с радостью посмотрим как ты реализовал недостающие функции кода ;)
ну а если тебе не хочется показывать всем свои труды... ну тише будь в этом мире, всё равно в твой цирк никто в серьёз не зайдёт
 

Mee8YT

Эксперт
Регистрация
3 Май 2023
Сообщения
298
и ещё, нубик, напиши отдельно ;)
1708513315515.png
 

Mee8YT

Эксперт
Регистрация
3 Май 2023
Сообщения
298
Сос

Сосо мишка , мой любимый чирук ,снизь цены на аукцион
только после снижения тебя с трона кринжа :love:

для тех кто думает что 5к много
щас и так голда дешёвая, аук мой можно купить за голосования, тем более что на мл голда никак не используется
и сам сососо
 

Meds67u

Новичок
Регистрация
19 Окт 2023
Сообщения
2
только после снижения тебя с трона кринжа :love:

для тех кто думает что 5к много
щас и так голда дешёвая, аук мой можно купить за голосования, тем более что на мл голда никак не используется
и сам сососо
Маленький Чирук захотел поесть бекона ,но не смог его купить и кинул меня в игнор
 
Сверху