如何在Unity中基于碰撞点找到旋转?

时间:2018-12-13 01:46:45

标签: unity3d rotation particles

我有两个对象,其中一个是手,另一个是立方体。当手触摸立方体时,我得到一个接触点(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);
    }

这是一个示例,其中线条表示碰撞,正方形表示立方体,而我想要的是使圆环平行于手触摸的立方体的侧面。由于立方体可以旋转,因此需要动态地找到粒子系统的起始旋转值(Euler:[x,y,z])。

enter image description here

1 个答案:

答案 0 :(得分:0)

尝试:

//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 );
}