[Решено]Посмотреть на...

Статус
В этой теме нельзя размещать новые ответы.
1,137
5
3
У меня есть 3 мировые координаты. Надо заставить игрока посмотреть на них(даже если чанк на коорд-ах не загружен)
 
1,976
68
220
Это всё векторы)
Я в них не сильно разбираюсь, но это просто (формулы можно найти в гугле):
1. Ищем координаты вектора в горизонтальной плоскости BlockX - PlayerX и BlockZ - PlayerZ
2. Высчитываем угол между ним и тем, что идёт на юг (на F3 под координатами параметр стороны света "f:", там тоже есть угол, можешь попробовать извлечь оттуда)
3. Поворачиваем Yaw игрока на нужный угол.
4. Делаем тоже самое с вектором |BlockY - PlayerY|: находим угол и поворачиваем Pitch игрока на него.
5. Profit! Игрок смотрит на данную координату :D
[merge_posts_bbcode]Добавлено: 11.06.2016 15:26:12[/merge_posts_bbcode]

Yaw и Pitch, если я вдруг перепутал их местами
1OFpX.png

горизонтальный угол
Hy7jpZH.png
 
1,976
68
220
Руководствуясь логикой я сделал всё правильно. Но оно ни разу не правильно работает (пока только с горизонтальным взглядом):
Код:
// Допустим, блок на (5; Y; 5)
double vecX = 5D - player.posX; // X-координата вектора
double vecZ = 5D - player.posZ; // Z-координата вектора
// Горизонтальный вектор (для Yaw): (vecX, vecZ)
// Стандартный вектор, смотрящий на юг: (0, 1)

// Скалярное произведение a·b  (Горизонтального и Южного) векторов: Xa * Xb + Za * Zb
double scalarHorizontal = (vecX * 0) + (vecZ * 1);
// Модуль |a| (Горизонтального) вектора: sqrt(Xa^2 + Za^2)
double moduleHorizontal = Math.sqrt((vecX * vecX) + (vecZ * vecZ));
// Модуль |b| стандартного будет единица, его не пишем: sqrt(1*1 + 0*0) = 1

// Угол между двумя векторами cos α = (a·b) / (|a|·|b|)
// Сразу применяю арк-косинус и перевожу в градусы:
player.cameraYaw = (float) Math.toDegrees(Math.acos(scalarHorizontal / moduleHorizontal));
Что я делаю не так?
[merge_posts_bbcode]Добавлено: 11.06.2016 16:48:19[/merge_posts_bbcode]

Вот что значит не знать, что за что отвечает -_-
там нужно player.rotationYaw
 
608
5
15
Просто по Пифагору находите нужный угол и сетите вектор взгляда игрока, в чём сложность?
 
1,976
68
220
Дай код. Я написал, но он работает только если позиция игрока больше позиции блока, хз почему.
Код:
double vecX = 10D - player.posX;
double vecY = 10D - player.posY;
double vecZ = 10D - player.posZ;
double scalarHorizontal = (vecX * 0) + (vecZ * 1);
double scalarVertical = vecX * vecX + vecY * 0 + vecZ * vecZ;
double moduleVertical = Math.sqrt(vecX * vecX + vecY * vecY + vecZ * vecZ);
double moduleFlat = Math.sqrt(vecX * vecX + 0 * 0 + vecZ * vecZ);
double moduleHorizontal = Math.sqrt((vecX * vecX) + (vecZ * vecZ));
player.rotationYaw = (float) Math.toDegrees(Math.acos(scalarHorizontal / (moduleHorizontal * 1)));
player.rotationPitch = (float) Math.toDegrees(Math.acos(scalarVertical / (moduleVertical * moduleFlat)));
[merge_posts_bbcode]Добавлено: 11.06.2016 17:33:22[/merge_posts_bbcode]

10 - собственно, тестовая координата. Можете подставлять свои
 
608
5
15
Проводим прямоугольный треугольник, вычисляем гипотенузу, вычисляем угол, ставим ротейты.
Затраты ресурсов будут гараздо меньше.
 
1,137
5
3
Код:
fun lookAt(ent: EntityLivingBase, objectVec: Vec3) {
    val diff = ent.getPosition(1F).toVec3() - objectVec
    val dist = Math.sqrt(diff.z.toDouble() * diff.z + diff.x * diff.x)
    val yaw = Math.toDegrees(Math.atan2(diff.x.toDouble(), diff.z.toDouble())).toFloat()
    val pitch = Math.toDegrees(Math.atan2(diff.y.toDouble(), dist)).toFloat()

    ent.rotationYaw = yaw
    ent.prevRotationYaw = yaw
    ent.rotationPitch = pitch
    ent.prevRotationPitch = pitch
}

на просторах интернета нашёл сие чудо, но на большом расстоянии игрок смотрит не в ту сторону. Как чинить?
 
164
1
4
Ну я делал так:
Код:
        double endX = 10.0;
        double endY = 10.0;
        double endZ = 10.0;
        double deltaX = endX - player.posX;
        double deltaY = endY - player.posY;
        double deltaZ = endZ - player.posZ;
        double hypotenuse = Math.sqrt(deltaX * deltaX + deltaZ * deltaZ);
        float rotationYaw = (float) Math.toDegrees(Math.atan2(deltaX, deltaZ));
        float rotationPitch = (float) Math.toDegrees(Math.atan2(deltaY, hypotenuse));
        
        player.rotationYaw = -rotationYaw;
        player.prevRotationYaw = -rotationYaw;
        player.rotationPitch = -rotationPitch;
        player.prevRotationPitch = -rotationPitch;
И это ты мог найди в рендере Дракона (или в моём лазере). Кликаю на блок, смотрит на координаты.
 
1,137
5
3
nikita488 написал(а):
Ну я делал так:
Код:
        double endX = 10.0;
        double endY = 10.0;
        double endZ = 10.0;
        double deltaX = endX - player.posX;
        double deltaY = endY - player.posY;
        double deltaZ = endZ - player.posZ;
        double hypotenuse = Math.sqrt(deltaX * deltaX + deltaZ * deltaZ);
        float rotationYaw = (float) Math.toDegrees(Math.atan2(deltaX, deltaZ));
        float rotationPitch = (float) Math.toDegrees(Math.atan2(deltaY, hypotenuse));
        
        player.rotationYaw = -rotationYaw;
        player.prevRotationYaw = -rotationYaw;
        player.rotationPitch = -rotationPitch;
        player.prevRotationPitch = -rotationPitch;
И это ты мог найди в рендере Дракона (или в моём лазере). Кликаю на блок, смотрит на координаты.
В сообщении 9 такой же код
 
1,137
5
3
Код:
fun EntityLivingBase.lookAt(pos: Vec3) {
    val diff = pos - getPosition(1F).toVec3()
    val dist = Math.sqrt(diff.z.toDouble() * diff.z + diff.x * diff.x)
    val yaw = Math.toDegrees(Math.atan2(diff.x.toDouble(), diff.z.toDouble())).toFloat()
    val pitch = Math.toDegrees(Math.atan2(diff.y.toDouble(), dist)).toFloat()

    rotationYaw = -yaw
    prevRotationYaw = -yaw
    rotationPitch = -pitch
    prevRotationPitch = -pitch
}
Поправил знаки, всё так. Закрывайте. Код выше
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху