// Допустим, блок на (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));
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)));
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
}
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 такой же код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;
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
}