关于Unity中关节的使用

Posted 杭者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Unity中关节的使用相关的知识,希望对你有一定的参考价值。

1: 刚体的形状大小在物理世界里面是不变的,可是很多时候,我们需要多个刚体来配合使用;
2: 关节: 连接刚体与刚体的对应的物理模拟;
3: 关节类型: 铰链关节,弹簧关节, 固定关节, 角色关节,可配置关节

 

铰链关节

1: 将两个刚体束缚在一起,在两者之间产生铰链效果;
2: 铰链关节属性
connect Body:目标连接的刚体;
Anchor 本体锚点,连接目标旋转时围绕的中心点;
Connect Anchor 连接目标的锚点,本体旋转时围绕的中心点;自动计算出来的。
Axis 锚点和目标锚点的方向,指定了本体和连接目标的旋转方向;绕哪个轴旋转
Auto Configure Connected Anchor: 勾选时,仅给出锚点的坐标,系统将自动计算出目标锚点坐标;
Using Spring: 是否使用弹簧;
Sprint 弹力;
Damper: 阻尼,物体移动受到阻碍的大小,越大物体越慢;
Target Postion: 目标位置,弹簧旋转的目标角度;
Use Moto 使用电机,规定关节肿是否使用电机;
TargetVelocity: 目标速率,对象试图达到的速度,会以此速度与目标速度进行加速和减速;
Force 此属性是达到目标速率的力;
Free Spine 规定了收控制对象的旋转是否会破坏,若启用,马达将永远不会破坏旋转,只会加速;
Use Limits规定了关节在旋转的时候是否受限;
Min 规定了刚体旋转的达到的最小角度
Max 规定了刚体旋转的达到的最大角度
Min Bonus 规定了刚体旋转的达到的最小弹跳值
Max Bonus 规定了刚体旋转的达到的最小弹跳值
Break Force 给出一个力的限值,当关节受到的力超过这个,关节损坏;
Break Torque 给出一个力矩的极限,当关节受到力矩超过此值时关节损坏;

 

 

创建一个空节点hinge_joint

创建一个圆柱体Cylinicer为它的子节点

创建一个立方体Cube为它的子节点,为了区分,给它一个材质,颜色为红色

给圆柱体Cylinicer和立方体Cube都增加刚体组件Rigidbody,都去掉重力,设置圆柱体Cylinicer的Constraint约束Freeze PositionX,Y,Z,RotationX,Y,Z

给圆柱体Cylinicer增加Hinge Joint组件,里面的Connected Body属性设置为Cube 

创建一个脚本test_hinge_joint挂载到Cube上,要给它一个力

using UnityEngine;
using System.Collections;

public class test_hinge_joint : MonoBehaviour {
    Rigidbody body;
    // Use this for initialization
    void Start () {
        this.body = this.GetComponent<Rigidbody>();
        this.body.AddForce(new Vector3(0, 0, 100));//给一个z轴方向的力
    }
    
    // Update is called once per frame
    void Update () {
    
    }
}

 

 

固定关节

1: 将两个刚体束缚在一起, 相对位置保持不变,永远不会变化;
2: 固定关节属性
connect Body:目标连接的刚体;
Break Force 给出一个力的限值,当关节受到的力超过这个,关节损坏;
Break Torque 给出一个力矩的极限,当关节受到力矩超过此值时关节损坏;
Enable collision 允许碰撞检测;
Enable Preprocess 允许进行预处理;

 

创建一个空节点fixed_joint

创建一个球体Sphere1为它的子节点,创建一个球体Sphere2为它的子节点,为了区分,给Sphere2一个材质,颜色为红色

给球体Sphere1和Sphere2都增加刚体组件Rigidbody,都去掉重力

给球体Sphere1增加fixed_joint组件,里面的Connected Body属性设置为Sphere2

创建一个脚本test_fix_joint挂载到Sphere2上,要给它一个力

using UnityEngine;
using System.Collections;

public class test_fix_joint : MonoBehaviour {

    Rigidbody body;
    // Use this for initialization
    void Start() {
        this.body = this.GetComponent<Rigidbody>();
        this.body.AddForce(new Vector3(0, 0, 100));//给它一个z轴方向的力
    }
    
    // Update is called once per frame
    void Update () {
    
    }
}

两者开始旋转,但是彼此之间的位置距离都没有变化,你到哪里我到哪里

如果固定两者或其中一个的Freeze RotationX,Y,Z,那么两者会朝着Z轴方向直线运动

 

 

弹簧关节

1: 将两个刚体束缚在一起, 相对位置保持不变,永远不会变化;
2: 弹簧关节属性
connect Body:目标连接的刚体;
Anchor 本体锚点,连接目标旋转时围绕的中心点;
Connect Anchor 连接目标的锚点,本体选择时围绕的中心点;
Axis 锚点和目标锚点的方向,指定了本体和连接目标的旋转方向;
Auto Configure Connected Anchor: 勾选时,仅给出锚点的坐标,系统将自动计算出目标锚点坐标;
Sprint 弹力;
Damper: 阻尼,物体移动受到阻碍的大小,越大物体越慢;
Min distance 弹簧两端最小距离
Max distance 弹簧两端最大距离
Break Force 给出一个力的限值,当关节受到的力超过这个,关节损坏;
Break Torque 给出一个力矩的极限,当关节受到力矩超过此值时关节损坏;
Enable collision 允许碰撞检测;
Enable Preprocess 允许进行预处理;

 

创建一个空节点spring_joint

创建一个正方体Cube为它的子节点,创建一个球体Sphere为它的子节点,为了区分,给Sphere一个材质,颜色为红色

给正方体Cube和球体Sphere都增加刚体组件Rigidbody,都去掉重力,设置正方体Cube的Constraint约束Freeze PositionX,Y,Z,RotationX,Y,Z,设置球体Sphere的Constraint约束Freeze RotationX,Y,Z。

给球体Cube增加spring_joint组件,里面的Connected Body属性设置为Sphere

创建一个脚本test_spring_joint挂载到Sphere上,要给它一个力

using UnityEngine;
using System.Collections;

public class test_spring_joint : MonoBehaviour {

    Rigidbody body;
    // Use this for initialization
    void Start()
    {
        this.body = this.GetComponent<Rigidbody>();
        this.body.AddForce(new Vector3(200, 0, 0));//给球体一个x轴方向的力,它会像弹簧一样在正方体面前弹来弹去
    }
    
    
    // Update is called once per frame
    void Update () {
    
    }
}

 

 

可配置关节

创建一个空节点config_joint

创建一个正方体Cube为它的子节点,创建一个球体Sphere为它的子节点,为了区分,给Sphere一个材质,颜色为红色

给正方体Cube和球体Sphere都增加刚体组件Rigidbody,都保留重力,设置正方体Cube的Constraint约束Freeze PositionX,Y,Z,设置球体Sphere的Constraint约束Freeze PositionX,Y,Z。

给球体Cube增加config_joint组件,修改X Motion, Y Motion, Z Motion 为Locked,里面的Connected Body属性设置为Sphere,

创建一个脚本test_spring_joint挂载到Sphere上,杂重力的作用下两个物体像单摆一样运动。

 

以上是关于关于Unity中关节的使用的主要内容,如果未能解决你的问题,请参考以下文章

《Unity3D 实战核心技术详解》书中关于矩阵的错误

应用程序在主要活动中关闭onBackPressed

Unity编程Unity中关于四元数的API详解

如何在导航控件片段中关闭导航 DrawerLayout onBackPressed

如何从另一个活动或底部工作表对话框/片段中关闭一个活动

UNITY与安卓⭐二AndroidStudio中关于通讯的使用教学