Unity_物理引擎细说_02

1、Physics Material 物理材质

Physic Material 用于调整碰撞体对象的摩擦力和弹力效果。
  • 物理材质的创建:

    在Project视图空白处,鼠标右击-----选中Create-----physicMaterial
    

在这里插入图片描述

属性功能
Dynamic Friction作用于运动中的对象的摩擦力,通常设为0到1之间的值。值为0时,对象像冰块一样光滑;值为1时,不受力(合力为0)的对象将很快停止运动。
Static Friction作用于静止在其他物体表面的对象的摩擦力,通常设为0到1之间的值。值为0时,对象像冰块一样容易滑动;值为1时,需要施加很大的力才能使对象开始运动。
Bounciness对象的表面弹性。值为0时,对象完全没有弹力;值为1时,对象变为具有完全弹性的理想刚体(在碰撞过程中完全不随损失能量)。
Friction Combine发生碰撞的两个碰撞体对象的摩擦力的混合方式:01、Maximum - 取两个对象的摩擦力的最大值;02、Multiply - 取两个对象的摩擦力相乘后的值;03、Minimum - 取两个对象的摩擦力的最小值; 04、Average - 取两个对象的摩擦力的平均值。
Bounce Combine发生碰撞的两个碰撞体对象的弹力的混合方式。其参数与Friction Combine的参数相同。

2、Joint 关节

连接刚体与刚体的对应的物理模拟。
关节类型: 
链条关节,固定关节,弹簧关节,角色关节和可配置关节。
  1. 链条关节(hinge joint)

    将两个物体以链条的形式绑在一起,当力量大于链条的固定力矩时,两个物体就会产生相互的拉力。
    
  2. 固定关节(fixed joint)

    将两个物体永远以相对的位置固定在一起,即使发生物理改变,它们之间的相对位置也将不变。
    
  3. 弹簧关节(spring joint)

    将两个物体以弹簧的形式绑定在一起,挤压它们会得到向外的力,拉伸它们将得到向里的力。
    
  4. 角色关节(character joint)

    可以模拟角色的骨骼关节。
    
  5. 可配置关节(configurable joint)

    可以模拟任意关节的效果。
    

3、射线检测

  1. Debug.DrawLine / Debug.DrawRay 绘制射线
        Debug.DrawLine(transform.position, Vector3.right, Color.green, 100);
        Debug.DrawRay(transform.position, Vector3.right, Color.green, 100);
  1. 示例
    public Transform playerTrans;
    private Rigidbody playerRigid;
    public float camRayLength = 100;
    private int floorMask;

    // Start is called before the first frame update
    void Start()
    {
        //LayerMask一般用于Physics.Raycast光线投射
        //只选定Layermask层内的碰撞器,其它层内碰撞器忽略
        floorMask = LayerMask.GetMask("Floor");
        playerRigid = playerTrans.GetComponent<Rigidbody>();
    }

    private void FixedUpdate()
    {
        Turning();
    }
    /// <summary>
    /// player旋转  前提:摄像机对着地面
    /// </summary>
    private void Turning()
    {
        // 从鼠标光标沿相机方向创建一个射线
        Ray camRay = Camera.main.ScreenPointToRay(Input.mousePosition);
        // 存储被射线击中的物体的信息.
        RaycastHit floorHit;
        //如果检测到碰撞,返回true
        bool isCollider = Physics.Raycast(camRay, out floorHit, camRayLength, floorMask);

        // 如果它碰到"Floor"层上的东西,进行射线检测
        if (isCollider)
        {
            //Debug.Log(isCollider);    //检测到发生了碰撞输出true
            //Debug.Log(floorHit.collider);  //输出碰撞体的名字
            //Debug.Log(floorHit.point);     //输出碰撞的点的坐标

            // 取得从playerTrans指向floorHit的向量
            Vector3 offectPos = floorHit.point - playerTrans.position;
            // 确保该向量的y值为0
            offectPos.y = 0f;
            Quaternion newRotatation = Quaternion.LookRotation(offectPos);
            // 平滑的转过去
            playerRigid.MoveRotation(newRotatation);
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值