我正在制作3D游戏。我想要的一个功能是经典'弹射弹丸,子弹等富有表面的弹丸。我遇到的问题是我的代码在某些表面上工作正常而在其他表面上不能正常工作。我录制了一段15秒的视频来说明:
在示例中,左侧墙壁上的法线面向-Z,右侧面向Z.墙壁是相同的模型,它们的法线都正确地指向外面。你可以看到镜头正确地从一组墙壁反弹而不是另一组墙壁。
我目前在OnCollision()中使用的代码是:
transform.LookAt(Vector3.Reflect(transform.position - startPosition, contact.normal.normalised));
在首次发射射弹和每次反弹时分配Vector3 startPosition。其余的代码是简单的东西,这可能对这个问题没有影响,除了在FixedUpdate中,我这样做是为了推动射弹前进:
rigidbody.AddForce(transform.forward * speed);
我尝试了以下所有相同的结果:
Vector3 velocity = transform.forward;
velocity = 2 * (Vector3.Dot(velocity, Vector3.Normalize(contact.normal))) * Vector3.Normalize(contact.normal) - velocity; //Following the formula v' = 2 * (v . n) * n - v
transform.LookAt(velocity);
transform.LookAt(Vector3.Reflect(rb.velocity, contact.normal));
transform.LookAt(Quaternion.AngleAxis(180, contact.normal) * transform.forward * -1);
我也尝试过使用刚体,但我不确定如何继续使用:
rigidbody.AddTorque(Vector3.Reflect(rigidbody.velocity, contact.normal.normalized),ForceMode.Impulse);
知道可能出现什么问题吗?感谢。
答案 0 :(得分:0)
只需将答案放在正确的位置,供有相同问题的人使用。
解决方案是在碰撞过程中将Reflect指定给Vector3,然后在FixedUpdate
中使用rb.AddForce
中的向量,如:
target = Vector3.Reflect(transform.forward, contact.normal.normalized);
rb.AddForce(target.normalized * projSpeed);