Угол взгляда [Решено]

Статус
В этой теме нельзя размещать новые ответы.
104
0
Долго мучался с векторами, но так и не вышло настроить правильно: как высчитать угол между взглядом игрока, и конкретным Энтити? Тобишь по сути нужно число градусов, на которые нужно повернуть голову игроку, чтобы смотреть прямо на Энтити.
 
104
0
Мне нужно получать угол в 1) трехмерной плоскости 2) относительно координат в мире
 
608
5
15
Ну можно ещё по Пифагору :) Хотя, наверное, эти методы так и делают.
 

timaxa007

Модератор
5,831
409
672
Хотя нет, я бред написал, я не учёл углы самого игрока для правильного смещения угла поворота. По-этому конец кода у меня точно не правильный.
 
104
0
cIjDOaZckX0.jpg

Допустим мне показывает правильное смещение - "Facing: xOffset / yOffset". Когда я посмотрю на курицу, мне должно показать примерно "Facing: 0 / 0". Отведу голову - цифры должны слегка увеличится. Как же это сделать?
 
104
0
Найти угол между двумя прямыми (первая прямая - между игроком и Энтити, вторая прямая - между игроком и точкой взгляда, которая на том же расстоянии от игрока, на котором и Энтити). Просто мыслю формулы вслух.

Пытаюсь найти угол беря в рассчет двухмерную плоскость, для х и z, тоесть только по горизонтали:
Код:
player.rotationPitch = 0; // Для того, что бы вектор встал ровно по горизонту
double pointX = player.posX + player.getLookVec().xCoord * distanceToEntity; // Точки, куда смотрим, расстояние от игрока до точки = distanceToEntity
double pointZ = player.posZ + player.getLookVec().zCoord * distanceToEntity;
player.rotationPitch = player.prevRotationPitch; // Возвращаем взгляд игрока на место

double cat1 = Math.sqrt( Math.pow(player.posX - entity.posX, 2) + Math.pow(player.posZ - entity.posZ, 2) ); // Первая прямая, от игрока до Энтити
double gip = Math.sqrt( Math.pow(player.posX - pointX, 2) + Math.pow(player.posZ - pointZ, 2) ); // Вторая прямая, от игрока до точки взгляда
double cat2 = Math.acos((player.posX * player.posZ + pointX * pointZ) / ( Math.sqrt( Math.pow(player.posX, 2) + Math.pow(pointX, 2) ) * Math.sqrt( Math.pow(player.posZ, 2) + Math.pow(pointZ, 2) ) )); // Пытаемся вычислить угол между прямыми по формуле "угол между двумя прямыми". Не выходит что-то
 
1,137
5
3
Код:
val entvec = Vec3.toVec3(event.entity.lookVec)
val playervec = Vec3.toVec3(Minecraft.getMinecraft().thePlayer.lookVec)
println("Angle between entities is ${Math.toDegrees((playervec angle entvec).toDouble())}")

Сие чудо на котлине. Угол находится, пишется в градусах.
 
104
0
1) Это что, Скала?
2) Не уверен, откуда в Vec3 появился toVec3, или какой у этого метода есть аналог на фордж 1.8

UPD: Котлин, язык, понял. В общем этот вариант мне не актуален
 
1,137
5
3
Я просто показал, примерно.
Тебе надо угол между векторами найти? Тогда открой оффтоп, мне там все подробно рассказали.
 
104
0
Окей, тогда такой вопрос по этой картинке: Az и Bz - это точки самих векторов в 3д-пространстве, или точка пересечения этих векторов? Если второе, то все равно по этой формуле результат не удовлетворительный. Если же первое, то тогда как можно пользоваться этой формулой без точки пересечения, ведь в таком случае, векторы могут смотреть в бог знает какую сторону, а значит и угол между может быть разный

P5hxOO2NMyQ.jpg
 
104
0
Помучавшись, я все же смог решить эту задачу. Ищу угол через треугольник между точками: взгляда игрока, положениями Энтити и игрока. Код ниже указывает угол между положением Энтити и взглядом игрока по горизонтали:

Код:
float distanceToEntity = player.getDistanceToEntity(entity);
        
player.rotationPitch = 0;
Vector2d playerPoint = new Vector2d(player.posX, player.posZ);
Vector2d entityPoint = new Vector2d(entity.posX, entity.posZ);
Vector2d lookPoint = new Vector2d(playerPoint.x + player.getLookVec().xCoord * distanceToEntity, playerPoint.y + player.getLookVec().zCoord * distanceToEntity);
player.rotationPitch = player.prevRotationPitch;

double fromPlayerToLook = Math.sqrt( Math.pow((lookPoint.x - playerPoint.x), 2) + Math.pow((lookPoint.y - playerPoint.y), 2));
double fromPlayerToEntity = Math.sqrt( Math.pow((entityPoint.x - playerPoint.x), 2) + Math.pow((entityPoint.y - playerPoint.y), 2));
double fromEntityToLook = Math.sqrt( Math.pow((entityPoint.x - lookPoint.x), 2) + Math.pow((entityPoint.y - lookPoint.y), 2));

double angleA = Math.acos((Math.pow(fromPlayerToLook, 2) + Math.pow(fromPlayerToEntity, 2) - Math.pow(fromEntityToLook, 2)) / (2 * fromPlayerToLook * fromPlayerToEntity));

double xOffset = angleA * (180 / Math.PI);


*Нахождение углов треугольника по координатам его вершин*
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху