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