我正在研究我的第一个Unity项目(一个自我规定的崩溃课程),我遇到了一个小问题。
我正试图将一个物体偏离另一个物体(通过碰撞)。目前,偏转应该处于完全镜像的角度。没问题!我想,我看到这个超级方便的contact.normal
财产;看起来很直接(我正在2D飞机上工作,所以它应该从那里顺利航行)。
一些令人沮丧的失败尝试,以及之后几千drawRay
个命令,我意识到法线不是影响面的法线,而是正常的影响(即反映影响的角度) )。
这实际上是有用的信息,但为了有用,我需要一个面部法线来反映影响的角度。
移动物体正在使用this.rigidbody.velocity =
所以我不能依赖内置的物理学;对于这种弹跳看起来我也是一个完全坚持的人,所以我真的很想保持对它的完全控制。
以下相关代码:
function OnCollisionEnter(collision : Collision)
{
var contactCount : int = 0;
var normalAve : Vector3 = Vector3(0,0,0);
var velocityAve : Vector3 = Vector3.zero;
for (var contact : ContactPoint in collision.contacts)
{
contactCount++;
normalAve += contact.normal;
velocityAve += collision.relativeVelocity;
Debug.DrawRay(contact.point, contact.normal, Color.green, 2, false);
}
normalAve /= contactCount;
velocityAve /= contactCount;
var damage = Vector3.Dot(normalAve, velocityAve) * collision.rigidbody.mass;
life -= damage;
if(life <= 0)
{
// Stackoverflow people can ignore this, bounces
// don't happen when you're dead
this.rigidbody.useGravity = this.GetComponent(ship_small_physics).stage.GetComponent(stage_params).grav_on_hit;
this.GetComponent(ship_small_physics).impact();
}else{
// Stackoverflow people! Right here!
Debug.Log("survived! with " + life + " life");
this.GetComponent(ship_small_physics).small_impact(normalAve, velocityAve);
}
}
然后,在.small_impact
function small_impact(n : Vector3, v : Vector3)
{
var h_angle : Vector3 = Vector3(n.x, 0, n.z);
Debug.DrawRay(this.transform.position, n, Color.blue, 2, false);
Debug.DrawRay(this.transform.position, h_angle, Color.red, 2, false);
}
只是为了澄清:游戏是在某种3D中,但由于种种原因,在这种情况下,我只关心x-z
平面中的碰撞法线(飞机旧物理引擎不会的另一个原因)做)。这就是为什么我创建一个新的向量h_angle
,它实际上就是将碰撞法线投影到x-z
平面上。