Формулы (многим пригодятся) - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Пользователи Календарь Все разделы прочитаны
Вернуться   Форум администраторов игровых серверов > MMO > Aion > Серверная часть

Важная информация

Серверная часть Обсуждения вопросов по установке и настройке эмулятора Aion-Emu, для совершенно новой и необыкновенно красивой игры - Aion.

Ответ
Опции темы
Непрочитано 26.06.2011, 21:49   #1
Изгнанные

Автор темы (Топик Стартер) Формулы (многим пригодятся)

Собственно так как Айоном я в данный момент не занимаюсь - делюсь некоторыми из своих вкусностей (у кого мозги не на бикрень - обязательно найдут применение). Собственно ниже речь пойдет о геометрии (к сожалению пока только прямолинейной).

Довольно часто мы знаем в каком направлении мы отправляем объект, знаем с какой скоростью он движется, на какое расстояние, но не знаем точно - где именно он остановится.
Помогут формулы:

Код:
    /**
     * Вычисление X координаты по заданному азимуту и известной дистанции.
     * Данный метод вычисляет Y координату на растоянии известной дистанции
     * по направлению в заданом азимуте.
     *
     * @param angle азимут 0* - 360*
     * @param distance растояние
     * @param x текущая координата по оси X
     * @return float x координата на растоянии известной дистанции в направлении заданного азимута
     */
    public final static float getXfromAngle(float angle, float distance, float x)
    {
        float dx = (float)(Math.cos(Math.toRadians(angle)) * distance);
        x = x + dx;
        return x;
    }

    /**
     * Вычисление Y координаты по заданному азимуту и известной дистанции.
     * Данный метод вычисляет Y координату на растоянии известной дистанции
     * по направлению в заданом азимуте.
     *
     * @param angle азимут 0* - 360*
     * @param distance растояние
     * @param y текущая координата по оси Y
     * @return float Y координата на растоянии известной дистанции в направлении заданного азимута
     */
    public final static float getYfromAngle(float angle, float distance, float y)
    {
        float dy = (float)(Math.sin(Math.toRadians(angle)) * distance);
        y = y + dy;
        return y;
    }
Только не забывайте в комитах писать thx Leo (всего 6 букв)
Так же всем тем, кто мечтает заставить мобов двигаться так же как на офф серверах.
Тут соли много, суть в том - что нынешние эмули умеют учитывать только прямолинейную траекторию движения, плавность же движения задается параметром movementMask. Суть примерно следующая - сервер отправляет клиенту пакет, с определённой маской движения, а клиент сам просчитывает траекторию объекта до конечных координат.

Формулы я конечно в шару не дам, зато расскажу "куда копать". Кто шарит в математике и геометрии - формулы напишут сами.

В общем - представим, что объект стоит на определённых координатах и имеет азимут равный 180 (считаем в градусах окружности). Мы отправляем его в другие координаты, прийдя в которое объект будет иметь азимут равный 0 (т.е. объект развернётся на 180 градусов). Плавность обеспечивается следующим образом:
1. Объект по кратчайшей дистанции на окружности выходит на касательную с конечными координатами, окружность "ложится" так, что бы объект стоял на её внешней стороне и смотрел в одном из направлений окружности.
2. Объект движется по касательной до конечных координат.

Сразу избавлю от амбиций выскочек - учет времени движения (чем в данный момент и занимается мувемент сервис во всех эмулях) - не к чему путнему не приведёт, да и слишком уж это просто
1. Представьте, что вы посчитали время движения и успешно синхронизировали с клиентом координаты на момент окончания анимации со стороны клиента - и всё вроде бы хорошо.
2. Представьте, что в процессе (к примеру) рандвалька кто либо нанёс даммаг мобу - в таком случае сервер должен достоверно знать текущие координаты моба, что бы задать следующую траекторию движения, а у Вас есть только время. В итоге, сервер не умеющий пошагово просчитывать "криволинейные" траектории не сможет точно сказать, где именно находится объект.

Собственно я описал геометрию только одной маски. На оф серверах используются всего 5-6 масок, в общем - это 5-6 геометрически-математических моделей с 5-10 входными параметрами В основном те маски, с которыми объекты двигаются "плавно" имеют статические радиусы описанных мною окружностей, в некоторых случаях радиусы эти определяются свойствами движущегося объекта - есть в клиенте в свойствах нпц что-то типа "размера" объекта, чем он больше - тем больше у объекта "радиус поворота". Успехов в начинаниях
akaLeo вне форума Ответить с цитированием
Сказали спасибо:
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
формулы расчетов,Modifier MeGa Архив 0 03.01.2010 05:12


© 2007–2020 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 17:30. Часовой пояс GMT +3.

Вверх