Расчет следующего 3d-места по скорости, расстоянию и направлению по градусу. В приведенном ниже коде это не дает правильное значение назначения. Позиция трансформации и пункт назначения движения находится в векторе 3.
val distance = 1f // 1 metere
val speed = getEntitySpeed(entity, deltaTime) // 0.44
val newDistance = transform.rotation.dir() * speed
val newDest = transform.position.cpy().sub(newDistance.x, 0f, newDistance.y).nor()
movement.destination.set(newDest.add(distance, 0f, distance))
Рассчитать направление
inline fun Float.dir( ) : Vector2 {
val direction = Vector2(1f, 0f)
//Put here your default direction with length 1. This usually is a vector. pointing right.
direction.rotate(this)
if (abs(direction.x) > 0.707) { //a perfect diagonal in unit circle
direction.x = sign(direction.x);
} else {
direction.x = 0f
}
if (abs(direction.y) > 0.707) {
direction.y = sign(direction.y);
} else {
direction.y = 0f
}
return direction
}
Пункт назначения будет использоваться для расчета скорости, добавляемой в позицию.
val distance = vec2()
distance.x = movement.destination.x - transform.position.x
distance.y = movement.destination.z - transform.position.z
val length = distance.len()
// Normalize
movement.velocity.x = distance.x / length * speed
movement.velocity.z = distance.y / length * speed
if (abs(movement.velocity.x) > abs(distance.x)) {
movement.velocity.x = distance.x
}
if (abs(movement.velocity.z) > abs(distance.y)) {
movement.velocity.z = distance.y
}
Рассчитать, чтобы перейти от позиции к данному месту назначения
transform.position.x += movement.velocity.x
transform.position.z += movement.velocity.z