Last server records
Pro Nub

Измерение дистанции

Posted by Kpoluk 13 Mar 2016 in 16:16
Данная статья описывает работу плагина, позволяющего измерять дистанцию между двумя точками в CS 1.6. Плагин присутствует на наших серверах и включён в сборку LAN сервера (нажмите здесь, чтобы скачать её). Все расстояния далее измеряются в юнитах (units).

Меню для измерения расстояния вызывается командой /dist (или /distance, /measure):


Чтобы понять, как работает это меню, проведём несколько показательных замеров.

Первые два пункта позволяют задать точки для замера, при этом для каждой отображаются её координаты X, Y и Z. Если в пункте 4. Method выбрано Aim at Point, то для выбора точки достаточно посмотреть на неё и нажать 1 или 2, а если выбрано Stand on Point, то в качестве точки будет выбираться позиция, на которой Вы стоите (если же Вы в этом момент в воздухе, будет выбрана точка у Вас под ногами). Результат замера будет показан ниже: Height это высота между точками, а Distance это расстояние между ними. Работу остальных пунктов объясним на примерах.

Зайдём на карту kz_longjumps3 и найдём там LJ блок номиналом в 240 юнитов. Поставим первую точку на боковой стенке блока, а вторую примерно напротив, пункт 7. Extra beams пока что поставим в Off:


Выбранные точки соединяет красная линия, её длина указана в Distance и равна 240.841 юнитам. Если поставить пункт 5. Detailed info в On, то помимо Distance мы увидим также смещения между точками dX, dY, dZ по каждой оси, а также смещение dXY по горизонтали (Estimated LJ обсудим чуть ниже). Здесь можно заметить, что расстояние между блоками как раз равно смещению dX:


Этот же результат можно получить и не прибегая к помощи Detailed info. Поставим пункт 3. Autoset the other Point в On и ещё раз выберем первую точку. Вторая точка будет найдена автоматически (для этого из первой точки плагин проводит нормаль до пересечения с какой-либо поверхностью), и в Distance Вы сразу увидите ровно 240.000:


Если теперь поставить пункт 6. Epsilon в On, то дистанция уменьшится до 239.938 юнитов. Дело в том, что движок CS 1.6 не даёт модельке игрока приблизиться к любой поверхности карты ближе, чем на 0.03125 юнита. Это очень небольшое расстояние, которое мы и называем Epsilon. Таким образом, с точки зрения модельки расстояние между блоками меньше на 2 * 0.03125 = 0.0625 юнита, то есть равно 240 - 0.0625 = 239.9375 юнита. Именно это расстояние с округлением и отображается теперь в Distance.

А теперь разберёмся с Estimated LJ. Для начала нужно понять, что моделька игрока представляет собой бокс (box), то есть параллелепипед высотой 72 юнита, в основании которого лежит квадрат со стороной 32 юнита. Грани этого бокса всегда параллельны осям X, Y, Z карты. То есть если мы стоя на месте начинаем вращаться с помощью мышки, то наш бокс при этом остаётся неподвижным. Таким бразом, чтобы перелететь блок 240, нам достаточно, чтобы центр бокса преодолел расстояние в 208 юнитов, а оставшиеся 32 юнита мы добираем за счёт ширины бокса:


Но что если делать прыжок по диагонали? Выставим в меню 4. Method: Aim at Point, 5. Detailed info: On, 6. Epsilon: Off, 7. Extra beams: On и поставим первую точку на самом уголке блока 240, а вторую на противоположном уголке соседнего блока 242:


Помимо красной линии мы видим два квадрата (их размеры соответствуют ширине нашего бокса) и жёлтую линию, соединяющую их центры. Эти квадраты плагин выбирает таким образом, что расстояние между их центрами (длина жёлтой линии) минимально. Чтобы нам было удобнее оценивать свои возможности, плагин прибавляет к этому расстоянию 32 юнита и записывает результат как Estimated LJ. Если судить по Distance: 250.684, то может показаться, что для прыжка с одного уголка на другой нужно cуметь cделать больше чем 250 lj, однако Estimated LJ: 244.733 подсказывает нам, что этот прыжок намного проще, чем кажется.

На этом всё, удачных замеров!