Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Расчет координат в момент передвижения.
#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 * [color=Green]Math.cos(atan)[/color]);//если deltaX зависит от косинуса
int deltaY = (int) (distanceTreveled * [color=green]Math.sin(atan)[/color]);//а deltaY зависит от синуса
//То от чего будет зависить дельта Z?

int [color=Red]newPlayerX [/color]= currX + deltaX;
int [color=Red]newPlayerY [/color]= currY + deltaY;
Так как произвести расчет чтобы впихнуть сюда еще и учет координаты Z.
Ответ
#2
Для 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);

В любом случае, в снипете все есть и можно переделать под поставленную задачу, без учета моих рекомендацийSmile

P.S: Либо все тоже самое можно проделать с помощью векторов, используя вычитание, сложение, нормализацию и умножение векторов.
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
Ответ
#3
n3k0nation Написал:Для Lineage 2 не рекомендуется считать с момента startingTime, ибо путь может быть криволинейным, из-за той же высоты. Сейчас Вы строете четкую прямую из A в B, но таких методов передвижения в игре почти не существует.
Благодарю за столь быстрый ответ, приму к сведению, возможно оставлю вашу реализацию.
Но прекрасно понимаю что в представленном моем варианте отрезок АБ будет прямолинейным и если допустим бежать через гору то в клиенте вы пройдете по верхушке горы, а на сервере через гору.
Но я хотел разбивать весь путь на множество отрезков AB с учетом координаты Z из геодаты и засовывать это все в массив пути.
[Изображение: Bg-FeBzz9VovXNn1I6mvvBmWIRUYyRJrTqTj9E7L...ce82676091]
зеленые отрезки - отрезки пути
Ответ
#4
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.
Гадаю по капче.
Ответ
#5
Спасибо еще раз за внимание, для себя понял что было нужно. В добавок понял пока рисовал рисунок в паинте что координату Z можно брать из геодаты. Вопрос закрыт.
Ответ
#6
Alay Написал:что координату Z можно брать из геодаты. Вопрос закрыт.
Не можно, а нужно. Более того, клиент не вычисляет путь с учетом Z. Другими словами, время затраченное на прохождение пути в крутую гору будет равно врмени затраченному на прохождение горизонтального катета такого треугольника.

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

Правильны подход, при движении по поверхности (геодете) считаетм X,Y а Z брать из гео для каждой конкретной точки.
Ответ
#7
да это логично. Осталось только понять структуру геоданных в ла2 или адаптировать уже готовый геодвиг с java на шарп
Ответ
#8
похожие действия мельком видел в книгах по Unity 3d
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Непонятный момент с 7-ю печатями Sber 2 1,804 12-13-2016, 01:25 PM
Последний пост: Emperor
  Сделать что-либо в момент логина mego4el 1 1,323 07-10-2013, 03:01 PM
Последний пост: n3k0nation
  Подвисание сервера в момент бекапа DomiNo 4 2,141 04-22-2013, 02:42 PM
Последний пост: DomiNo
  Стоит ли на данный момент открывать проект High Five? MrFanCold 108 24,947 04-06-2013, 03:20 PM
Последний пост: Krickt105
  Вычисление координаты движущегося объекта в момент времени. krisadr 15 3,483 11-26-2012, 01:18 AM
Последний пост: krisadr
  Расчет ресурсов для сервера Svyat_deb 18 4,965 11-03-2012, 01:46 AM
Последний пост: Mafio
  Изменение координат Свитков ТП Aristocrat 2 2,218 06-16-2009, 11:27 AM
Последний пост: Aristocrat
  Сборка интерлюд, какая лучшая на данный момент? KeMnS 91 27,124 09-04-2008, 07:36 PM
Последний пост: devil
  Какая на данный момент лутьше сборка Камаель и Хеллбаунд ilyxa 101 24,230 08-06-2008, 05:49 PM
Последний пост: drumNikola

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)