Единство: добавление импульса к мячу из определенной позиции - PullRequest
0 голосов
/ 06 января 2019

Я играю в бильярд в 3d и застрял с этой проблемой.
Я не могу найти нужную функцию, чтобы добавить импульс к мячу, который заставит шар вращаться.
Другими словами, как установить точку AIM, откуда я хочу добавить импульс?

enter image description here

Если я использую AddForce или AddTorque, похоже, что он вычисляет его по центру шара.
Но как указать точку прицеливания (левый английский, правый английский и т. Д.)?
А как направить мяч в направлении камеры после удара по мячу?

1 Ответ

0 голосов
/ 06 января 2019

На первый взгляд, я думаю, что вы должны проверить Rigidbody.AddForceAtPosition . Вы должны рассчитать точки прицеливания как-то в мировых координатах.

Я относительно новичок в Unity, но мне пришла в голову основная идея: сначала повернуть вектор метки по оси y на небольшой угол, а затем вычислить точку попадания для каждой области, применив физический луч, и, наконец, применить импульс с помощью Rigidbody. .AddForceAtPosition. Я пытался написать пример кода:

public class SphereController : MonoBehaviour {

private Vector3 cueStartPoint;

void Start () {

    cueStartPoint = new Vector3(0, 0.5f, -13f);

}

void Update () {

    //direction from cue to center
    var direction = transform.position - cueStartPoint;

    //rotate cue to aim right english
    var angleForRightEnglish = 5f;
    var directionForRight = Quaternion.AngleAxis(angleForRightEnglish, Vector3.up) * direction;
    Debug.DrawRay(cueStartPoint, directionForRight, Color.red, 10f);

    //rotate cue to aim right english
    var angleForLeftEnglish = -5f;
    var directionForLeft = Quaternion.AngleAxis(angleForLeftEnglish, Vector3.up) * direction;
    Debug.DrawRay(cueStartPoint, directionForLeft, Color.blue, 10f);

    //try a sample hit from right
    if (Input.GetKeyDown(KeyCode.RightArrow)) {
        var forceMagnitude = 1f;
        var hitForce = forceMagnitude * directionForRight.normalized;

        //calculate right hit point on sphere surface
        RaycastHit hitInfo;
        if (Physics.Raycast(cueStartPoint, directionForRight, out hitInfo)) {
            var rightHitPoint = hitInfo.point;
            gameObject.GetComponent<Rigidbody>().AddForceAtPosition(hitForce, rightHitPoint, ForceMode.Impulse);
        }

    }

    //try a sample hit from left
    if (Input.GetKeyDown(KeyCode.LeftArrow)) {
        var forceMagnitude = 1f;
        var hitForce = forceMagnitude * directionForLeft.normalized;

        //calculate left hit point on sphere surface
        RaycastHit hitInfo;
        if (Physics.Raycast(cueStartPoint, directionForLeft, out hitInfo)) {
            var leftHitPoint = hitInfo.point;
            gameObject.GetComponent<Rigidbody>().AddForceAtPosition(hitForce, leftHitPoint, ForceMode.Impulse);
        }

    }

}

}

этот скрипт должен быть добавлен в шар как компонент, конечно, надеюсь, это поможет.

...