Расчет следующего пункта назначения по скорости, расстоянию и направлению по градусу - PullRequest
1 голос
/ 14 апреля 2020

Расчет следующего 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
...