Unity 3D物理

时间:2011-02-12 20:25:53

标签: scripting unity3d game-physics unityscript

我在团结3d中遇到物理问题。我想让我的球从墙上弹开然后转向另一个方向。当球击中墙壁时,它会直接弹回。我已经尝试将方向改变为与它撞向墙壁的方向正交,但它不会改变方向。由于这个原因,球只是一直撞到墙上并直接弹回来。

其次,有时球会穿过墙壁。墙壁有盒子对撞机,而球有球形对撞机。它们都具有连续动态的碰撞检测模式。

3 个答案:

答案 0 :(得分:1)

这是一个类似线程的链接:

http://forum.unity3d.com/threads/22063-I-shot-an-arrow-up-in-the-air...?highlight=shooting+arrow

就我个人而言,我会使用LookAt对旋转进行编码,因为GargarathSunman在此链接中建议,但如果你想用物理做,你可能需要至少在几个部分构建标枪,正如其他人建议的那样在链接中,并为每个部分添加不同的拖动和角度拖动值,也许是密度。如果你在真空中投掷标枪,它就永远不会落地,因为空气阻力起着如此重要的作用(无论质量如何,所有东西都以同样的速度下降,谢谢艾萨克·牛顿爵士)。对于物理引擎而言,这是一个难以模拟的正确模拟。

答案 1 :(得分:1)

也许尝试在你的球体和你的墙壁之间获得对撞机点然后抓住你的刚体速度并将其恢复到正常的碰撞点。

执行该操作的脚本示例---> (将此脚本放在带有对撞机的墙上)

C#脚本:

public class WallBumper : MonoBehaviour
{
    private Vector3 _revertDirection;
    public int speedReflectionVector = 2;
    /***********************************************
    * name : OnCollisionEnter
    * return type : void
    * Make every gameObject with a RigidBody bounce againt this platform
    * ********************************************/
    void OnCollisionEnter(Collision e)
    {
        ContactPoint cp = e.contacts[0];
        _revertDirection = Vector3.Reflect(e.rigidbody.velocity, cp.normal * -1);
        e.rigidbody.velocity = (_revertDirection.normalized * speedReflectionVector);
    }
}

答案 2 :(得分:0)

由于速度问题,我最近遇到了火箭穿过目标的问题,即使是连续的动态碰撞检测,我也无法避免这种情况发生。

我使用wiki.unity3d.com上发布的脚本"DontGoThroughThings"解决了这个问题。这使用当前位置和先前位置之间的光线投射,然后确保帧结束,并且连接的消息对象是OnTrigger事件的消息。从那以后每次都工作过,只需要附加脚本就可以了,这非常容易使用。

我认为物理学答案正如其他人建议使用具有不同阻力的多个组件一样,但通常我认为你只想在父母身上使用一个RigidBody。而不是使用transform.LookAt的方向,您可以尝试使用rigidbody.velocity中的Quaternion.LookRotation进行计算。然后使用Vector3.Angle找出关闭的数量。角度差异越大,应经历的力越大,然后使用RigidBody.ApplyTorque。也许使用Sin(angleDifference)*一个常数,因此当你接近正确的旋转时,对扭矩施加的力就会减小。

以下是我在火箭上使用的一些代码,虽然你必须替换某些东西,因为我指向一个固定的目标并且你想要使用你的速度。

var rotationDirection = Quaternion.LookRotation(lockedTarget.transform.position - this.transform.position);
var anglesToGo = Vector3.Angle(this.transform.rotation.eulerAngles, rotationDirection.eulerAngles);

if (anglesToGo > RotationVelocity)
{
    var rotationDirectionToMake = (rotationDirection * Quaternion.Inverse(this.transform.rotation)).eulerAngles.normalized * RotationVelocity;

    transform.Rotate(rotationDirectionToMake);
}