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

Lineage II
Дискуссии на тему создания, настройки и обслуживания серверов Lineage 2. При поддержке: Премиум услуги по рекламе

Ответ
Опции темы
Непрочитано 30.01.2017, 13:05   #1
Пользователь

Автор темы (Топик Стартер) Расчет координат в момент передвижения.

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

Задача поставлена четко и ясно. Прошу не писать в теме зачем это нужно тд, и тп. Если у кого то есть информация как решить данную задачу или хотя бы в каком направлении подумать буду рад почитать.

PS никогда не любил геометрию

Ситуация:
Объект начал движение из точки А к точке B.

Дано(все данные условны. Чисто ради примера):
А(0.0.0) B(15.15.15) - x,y,z соответственно. z - высота.
ObjectSpeed = 2. (точек в секунду)

Задача.
Найти промежуточные координаты в ЛЮБОЙ момент движения(координаты точек принадлежащих к отрезку АВ).
Например нужно узнать в какой точке объект будет находится спустя 3 секунды после начала движения, если он еще не дошел до конца (а через 3 секунды он и не дойдет с текущими параметрами)

Нашел решение задачи только если в расчетах используется лишь X и Y.
Код:
int currX = 0;//Координата X точки А
int currY = 0;//Координата Y точки А

int targetX = 15;//Координата X точки B
int targetY = 15;//Координата Y точки B

long startingTime = Time.TimeNowInMs;
long timeNeedToCalculate = startingTime + 3 * 1000
int speed = 2; //Точек в секунду.

double distanceTreveled = (timeNeedToCalculate  - startingTime) * (speed * 1000);//Расстояние, которое пройдет объект за  3 секунды.

double tgA = (targetY-currY)/(targetX-currX);
double atan = Math.atan(tgA);

int deltaX = (int) (distanceTreveled * Math.cos(atan));//если deltaX зависит от косинуса
int deltaY = (int) (distanceTreveled * Math.sin(atan));//а deltaY зависит от синуса 
//То от чего будет зависить дельта Z?

int newPlayerX = currX + deltaX;
int newPlayerY = currY + deltaY;
Так как произвести расчет чтобы впихнуть сюда еще и учет координаты Z.
Alay вне форума Ответить с цитированием
Непрочитано 30.01.2017, 13:21   #2
Аватар для n3k0nation
Antihero

По умолчанию Re: Расчет координат в момент передвижения.

Для Lineage 2 не рекомендуется считать с момента startingTime, ибо путь может быть криволинейным, из-за той же высоты. Сейчас Вы строете четкую прямую из A в B, но таких методов передвижения в игре почти не существует.
Рекомендую с некоторой переодичностью обновлять оригинальные координаты и считать текущую точку уже с момента обновления, и прошедшем времени движения с точки обновления. Небольшой снипет:
Код:
		long timeNow = System.currentTimeMillis();
		double complete = getSpeed(actor, isWalk) * (timeNow - moveModel.getPrevUpdateTime());
		double divider = complete / moveModel.getEndMovePoint().getDistance3(actor.getLocation());
		moveModel.setPrevUpdateTime(timeNow);
		
		if(divider >= 1) {
			if(!this.moveModel.compareAndSet(moveModel, null))
				return;
			
			actor.set(moveModel.getEndMovePoint());
			completeMove();
			return;
		}
			
		int dx = moveModel.getEndMovePoint().getX() - actor.getX();
		int dy = moveModel.getEndMovePoint().getY() - actor.getY();
		int dz = moveModel.getEndMovePoint().getZ() - actor.getZ();
		
		int x = actor.getX() + (int)Math.round(divider * dx);
		int y = actor.getY() + (int)Math.round(divider * dy);
		int z = actor.getZ() + (int)Math.round(divider * dz);
		
		actor.setXYZ(x, y, z);
В любом случае, в снипете все есть и можно переделать под поставленную задачу, без учета моих рекомендаций

P.S: Либо все тоже самое можно проделать с помощью векторов, используя вычитание, сложение, нормализацию и умножение векторов.
__________________
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
n3k0nation вне форума Ответить с цитированием
Непрочитано 30.01.2017, 13:32   #3
Пользователь

Автор темы (Топик Стартер) Re: Расчет координат в момент передвижения.

Цитата:
Сообщение от n3k0nation Посмотреть сообщение
Для Lineage 2 не рекомендуется считать с момента startingTime, ибо путь может быть криволинейным, из-за той же высоты. Сейчас Вы строете четкую прямую из A в B, но таких методов передвижения в игре почти не существует.
Благодарю за столь быстрый ответ, приму к сведению, возможно оставлю вашу реализацию.
Но прекрасно понимаю что в представленном моем варианте отрезок АБ будет прямолинейным и если допустим бежать через гору то в клиенте вы пройдете по верхушке горы, а на сервере через гору.
Но я хотел разбивать весь путь на множество отрезков AB с учетом координаты Z из геодаты и засовывать это все в массив пути.

зеленые отрезки - отрезки пути
Alay вне форума Ответить с цитированием
Непрочитано 30.01.2017, 13:40   #4
Аватар для n3k0nation
Antihero

По умолчанию Re: Расчет координат в момент передвижения.

Alay, хм, хорошая идея, у меня сделано похоже, но отрезки я не предвычисляю чтобы не телепать постоянно память, т.к. игрок может изменить точку назначения. В начале передвижения я режу текущую точку назначения до 2000 точек и сохраняю оригинальный эндпоинт, затем при достаточном приближении к обрезанному концу пути, я перехожу на новый отрезок и так пока не будет достигнута оригинальная точка назначения, либо пока игрок не изменит точку назначения (ну и конечно же, есть еще вариант, что он не сможет дойти). Чето типа этого:
Код:
	private Location setupLongWay(Location start, Location dest) {
		if(actor.isType(L2PcInstance.class)) {
			originalEndPoint = dest;
		}
		return normalizeByDistance(dest, MovingConfig.MaxDistance);
	}

...

	private boolean recalculateMove() {
		double distance2 = getDestiny().getDistance2(actor.getLocation());
		if(distance2 > MathUtil.DiscreteSize && distance2 < BL_DISTANCE) {
			Location originalEndPoint = this.originalEndPoint;
			if(originalEndPoint != null) { //путь был обрезан из-за длины. продолжаем движение
				move(originalEndPoint);
				return true;
			}
		}
		
		return false;
	}
__________________
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
n3k0nation вне форума Ответить с цитированием
Сказали спасибо:
Непрочитано 30.01.2017, 13:58   #5
Пользователь

Автор темы (Топик Стартер) Re: Расчет координат в момент передвижения.

Спасибо еще раз за внимание, для себя понял что было нужно. В добавок понял пока рисовал рисунок в паинте что координату Z можно брать из геодаты. Вопрос закрыт.
Alay вне форума Ответить с цитированием
Непрочитано 31.01.2017, 17:04   #6
Аватар для rage
Герой

По умолчанию Re: Расчет координат в момент передвижения.

Цитата:
Сообщение от Alay Посмотреть сообщение
что координату Z можно брать из геодаты. Вопрос закрыт.
Не можно, а нужно. Более того, клиент не вычисляет путь с учетом Z. Другими словами, время затраченное на прохождение пути в крутую гору будет равно врмени затраченному на прохождение горизонтального катета такого треугольника.

Единственный случай, где требуется считать Z - это вода и полеты.

Правильны подход, при движении по поверхности (геодете) считаетм X,Y а Z брать из гео для каждой конкретной точки.
rage вне форума Ответить с цитированием
Сказали спасибо:
Непрочитано 31.01.2017, 18:21   #7
Пользователь

Автор темы (Топик Стартер) Re: Расчет координат в момент передвижения.

да это логично. Осталось только понять структуру геоданных в ла2 или адаптировать уже готовый геодвиг с java на шарп
Alay вне форума Ответить с цитированием
Непрочитано 31.01.2017, 18:56   #8
Пользователь

По умолчанию Re: Расчет координат в момент передвижения.

похожие действия мельком видел в книгах по Unity 3d
Gawric вне форума Ответить с цитированием
Ответ


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

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Синхронизация координат клиента и сервера awers Работа со скриптами 5 03.11.2014 00:05
Нет передвижения мобов в сборке MuHek Работа со скриптами 0 31.07.2013 22:59
Расчет Exp и Sp finfan Работа со скриптами 2 03.02.2013 14:04
Расчет L2Top.Ru [Shadow] Курилка / Yak floor 0 23.12.2012 00:18
Изменение координат Свитков ТП Aristocrat Lineage II 2 16.06.2009 11:27


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

Вверх