Как найти вращение на основе точки столкновения в Unity? - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть два объекта, один из которых - рука, а другой - куб.Когда рука касается куба, я получаю точку контакта (Vector3) и порождает эффект частиц Кольца.Однако вращение частицы неправильное, потому что я хочу, чтобы кольцо было параллельным стороне куба, к которой касается рука.

Куб может вращаться, поэтому вычисление вращения кольца становится сложным.Здесь я пытаюсь вычислить вращение на основе нормали точки столкновения, но кольцо по-прежнему не появляется правильно (почти кажется, что появляется случайно).

private void StartParticles(Vector3 pos, Transform parent, Color color, Vector3 normal)
    {
        ParticleSystem pSystem = Instantiate(ps2, pos, Quaternion.identity, parent);
        var main = pSystem.main;
        main.startColor = color;
        // start rotation
        //.eulerAngles;
        Vector3 rot = Quaternion.LookRotation(normal).eulerAngles;
        main.startRotationX = rot.x;
        main.startRotationY = rot.y;
        main.startRotationZ = rot.z;
        pSystem.Play();
        Destroy(pSystem, 3.0f);
    }

Это пример, где линия представляетстолкновение, квадрат представляет куб, и я хочу, чтобы кольца были параллельны той стороне куба, которой касается рука.Поскольку куб может вращаться, начальные значения вращения (Эйлер: [x, y, z]) для системы частиц должны быть найдены динамически.

enter image description here

1 Ответ

0 голосов
/ 14 декабря 2018

Попробуйте:

//TODO: introduce instance reusability/pooling
void StartParticles ( Vector3 pos , Transform parent , Color color , Vector3 normal )
{
    //instantiate:
    ParticleSystem pSystem = Instantiate(
        ps2 ,
        pos ,
        Quaternion.LookRotation( normal ) ,
        parent
    ).GetComponent<ParticleSystem>();

    //assertions:
    UnityEngine.Assertions.Assert.IsTrue(
        pSystem.main.simulationSpace == ParticleSystemSimulationSpace.Local ,
        "This will only work when simulation space is set to local"
    );

    //initialize modules:
    var main = pSystem.main;
    main.startColor = color;

    //play:
    pSystem.Play();

    //queue destroy:
    Destroy( pSystem , 3.0f );
}
...