Хм.. Телепорт!

53
4
Как тпшнуть игрока на два блока в право, имееться ввиду какие координаты указывать x, y или z? Кажеться очевидно что x, но даже если я использую игрик или z всё равно тпхает токо назад или вперёд
 
"в право" относительно взгляда игрока или относительно Север/Юг/тд ?
 
Берешь направление игрока и потом получаешь в виде EnumFacing (если 1.7 че-т другое).
После крутишь на право и тепехаешь игрока.
Как получить направление - поиск по форуму.
 
Берешь направление игрока и потом получаешь в виде EnumFacing (если 1.7 че-т другое).
После крутишь на право и тепехаешь игрока.
Как получить направление - поиск по форуму.
а координатами как нить можно попроще?
 
А как ты себе это представляешь? Я даже алгоритм проще не могу продумать, не то что реализацию.
 
У тебя есть 360 градусов, куда может смотреть игрок, как ты хочешь получить, что "игрок смотри в ту сторону мира", не трогая игрока??
округление до точности в 90 градусов
Ну, из моей логике, игрока нельзя телепортировать, если он смотрит на 45 градусов.
Опять же, это не фулл тз, что бы как-то спорить )
 
Java:
final double moveScale = 2D;//множитель расстояния
final double moveAngle = 90;//угол телепортации(90 = право)

EntityPlayer player = event.player;//игрок
Vec3d look = player.getLookVec();//взгляд

Vec3d currentPos = new Vec3d(player.posX, player.posY, player.posZ);
Vec3d extrapolatedPos = new Vec3d(
        player.posX + look.x,
        player.posY,
        player.posZ + look.z);

//полярная система
double dx = extrapolatedPos.x - currentPos.x;
double dz = extrapolatedPos.z - currentPos.z;
double phi = Math.atan2(dz, dx);//угол между игроком и его 'взглядом'

phi += Math.PI / 180 * moveAngle;//поворот
double newX = moveScale * Math.cos(phi);
double newZ = moveScale * Math.sin(phi);

player.setPosition(currentPos.x + newX, currentPos.y + 0.05, currentPos.z + newZ);//телепорт
Сначала мы экстраполируем координаты игрока в сторону его взгляда.
Затем вычисляем угол между этими координатам и игроком.
Далее прибавляем к этому углу 'право'.
Переводим полярные координаты в декартовые, с центром в начальной позиции игрока
 
Прекрасно, но можно куда проще. Прикинув, я понял, что мы перемещаем в плоскости ака 2д. Следовательно можно просто взять вектор взгляда, найти перпендикулярный к нему вектор и, собственно, переместить по этому направлению игрока. Находится он просто - меняешь х и у(у нас x, z) и расставляешь минус в зависимости от направления перпендикуляра. На этом все! Никаких косинусов, вообще.
 
расставляешь минус
В самом деле, но в таком случае есть проблема, когда взгляд игрока направлен вниз.
Когда взгляд равен vec3(0.0, 1.0, 0.0), если его отперпендикулярить и экстраполировать, получится тоже самое и игрок никуда не сдвинется
 
В самом деле. Но у тебя та же проблема. Единственным решением проблемы я вижу только использование вектора направления тела (опираясь на pitch). Тогда точно можно будет определить направление тела. И, по-видимому, применить синус и косинус придется ровно по разу - для определения направления тела
 
P.S. Псевдокод:

dir = vec2(cos(pitch), sin(pitch))
normal = vec2(dir.y, -dir.x)
pos = pos + normal * amount

Естественно, в Майнкрафте будет куча преобразований, ибо он хранит все в градусах (ребятки, пожалуйста, используйте радианы. Это стандартная единица измерения в системе СИ). А также я не уверен насчёт направления нормали. Если она будет направлена влево относительно направления игрока, то спасет простейший минус у amount
 
Последнее редактирование:
Крч дело было так
Приперся ко мне дохрена довольный керилл и заявил, что он мол самый умный на форуме и даже сыч не смог ничего противопоставить.
Так вот. Да начнутся же петушиные бои.
Есть вот такая замечательная штука тык. В отличии от кериллового варианта, она не ищет арктангенс, а сразу поворачивает вектор.
Если рассмотреть частный случай поворота на 90 градусов, она и вовсе сводится к очень простой математике.
x2 = -y1
y2 = x1
Все!

И о госпаде как я мог забыть. Самый мега убойный аргумент, который просто, не побоюсь этого слова, крошит черепа оппонентов керилла. Случай с вектором взгляда {0;1;0}.
Тут я могу сказать так: этот случай наиболее приятен для нас. Если в первом варианте нам нужно вектор нормализовывать после поворота, то тут наш вектор константен. Например: {5;0;0}. Конец сложнейшего случая.

@implicit нападай
 
О чем я и говорил. Речь шла о повороте строго направо
Если нужен поворот градусов на 30, то помогут вам матрицы, которые вырождаются в твои формулы (не твои, а те что в твоей статье)
 
Я избежал эту проблему, применяя ro за константное значение
Не особо понял, что имел в виду жастагот, но я таки нашел ошибку. Поскольку я считаю, что математические ошибки существовать не должны и устранять их нужно любой ценой, несмотря на то, как стара проблема. В общем, дело вот в чем. Представим вектор, направленный вниз. Горизонтальный к нему какой? А никакой, там целая плоскость, количество векторов бесконечно. Следовательно твой способ будет всегда двигать в одну сторону, несмотря на то, как повернут игрок.
Подойдя итоги, единственным решением проблемы будет взятие вектора по pitch, так как перпендикуляр к нему всегда будет один, в плоскости xz. А "вправо" относительно взгляда как раз лежит в этой плоскости. Чтд.
 
Назад
Сверху