Unity 物理系列五 关节

参考
https://docs.unity.cn/cn/2019.4/Manual/Joints.html
Unity物理关节全解析

关节组件将刚体连接到另一个刚体或空间中的固定点。关节施加使刚体移动的力,而关节限制功能可以限制该移动。

Unity 提供的以下关节可以对刚体组件施加不同的力和限制,从而使这些刚体具有不同的运动。

一、CharacterJoint角色关节

https://docs.unity.cn/cn/2019.4/Manual/class-CharacterJoint.html)

角色关节 (Character Joint) 主要用于布娃娃效果。此类关节是延长的球窝关节,可在每个轴上限制该关节,例如臀部或肩膀。沿所有线性自由度约束刚体移动,并实现所有角度自由度。连接到角色关节 (Character Joint) 的刚体围绕每个轴进行定向并从共享原点开始转动。

关于布娃娃和角色关节,本系列后续专门搞一篇来研究一下。

二、ConfigurableJoint可配置关节

https://docs.unity.cn/cn/2019.4/Manual/class-ConfigurableJoint.html
模拟任何骨骼关节,例如布娃娃中的关节。您可以配置此关节以任何自由度驱动和限制刚体的移动。

当您想要自定义布娃娃的运动并对角色强制实施某些姿势时,这种关节特别有用。使用可配置关节还可以将关节修改为您自行设计的高度专业化关节。

三、FixedJoint固定关节

https://docs.unity.cn/cn/2019.4/Manual/class-FixedJoint.html

限制刚体的移动以跟随所连接到的刚体的移动。当您需要一些可以轻松相互分离的刚体,或者您想连接两个刚体的移动而无需在 Transform 层级视图中进行父级化时,这种关节很有用。

固定关节 (Fixed Joint) 将对象的移动限制为依赖于另一个对象。这有点类似于管控 (Parenting),但是实现的方式是通过物理系统而不是变换 (Transform) 层级视图。使用固定关节的最佳场合是在希望对象可以轻松相互分离时,或者在没有管控情况下连接两个对象的移动。

在游戏中有时可能希望对象永久或暂时粘在一起。固定关节可能是比较适合用于这些情况的组件,因为不必通过脚本更改对象的层级视图来实现所需的效果。代价是所有使用固定关节的对象都必须使用刚体

例如,如果要使用“粘性手榴弹”,可写一个脚本来检测与另一刚体(如敌人)的碰撞,然后创建一个固定关节并附加到该刚体。然后,当敌人四处移动时,关节将使手榴弹紧贴在他们身上。

四、HingeJoint铰链关节

https://docs.unity.cn/cn/2019.4/Manual/class-HingeJoint.html

在一个共享原点将一个刚体连接到另一个刚体或空间中的一个点,并允许刚体从该原点绕特定轴旋转。用于模拟门和手指关节。 也可用于模拟链条、钟摆等对象。

参考 Unity 关节

1.Hinge小车案例

在这个例子中,车头转向前进时,会带动车厢。


image.png
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//主要控制车头,然后车头通过铰链和车厢连接

public class DriveControl : MonoBehaviour
{

    public GameObject[] obj_lunzi;
    public GameObject Car_Head;

    public float Speed_Rorate = 10f;
    public float Angla_Rorate = 60f;

    public float Speed_Move = 10f;

    public float AnglesNow = 0f;//最大转向角度

    void Update()
    {

        float hor = Input.GetAxis("Horizontal");//左右偏离度
        HeadRorate(hor);
        float var = Input.GetAxis("Vertical");
        HeadMove(var);
    }

    //车头轮子转向控制
    void HeadRorate(float hor)
    {
        if (Mathf.Abs(hor - 0.0f) <= 0.1f)
            return;

        foreach (GameObject e in obj_lunzi)
        {
            if (e.transform.localEulerAngles.y <= 180)
                AnglesNow = e.transform.localEulerAngles.y;
            else if (e.transform.localEulerAngles.y > 180)
                AnglesNow = e.transform.localEulerAngles.y - 360;

            float newAngles = Time.deltaTime * hor * Speed_Rorate;
            //和移动一样,每一帧都在旋转,不过最大旋转到Angla_Rorate
            if (Mathf.Abs(AnglesNow + newAngles) >= Angla_Rorate)
                newAngles = 0;

            e.transform.Rotate(Vector3.right, newAngles, Space.Self);
        }
    }

    //车头前进
    void HeadMove(float var)
    {
        float PI = 3.1415926f;
        float A = AnglesNow * PI / 180;
        Vector3 Dir = new Vector3(Mathf.Sin(A), 0, Mathf.Cos(A));

        float Speed = Time.deltaTime * var * Speed_Move;
        Car_Head.transform.Translate(Dir.normalized * Speed, Space.Self);
    }

}
五、SpringJoint弹簧关节

https://docs.unity.cn/cn/2019.4/Manual/class-SpringJoint.html

使刚体彼此分开,但使刚体之间的距离略微拉伸。弹簧就像一块弹性物,试图将两个锚点一起拉到完全相同的位置。 拉力的强度与两个点之间的当前距离成比例,其中每单位距离的力由 Spring 属性设定。为了防止弹簧无休止振荡,可以设置 Damper 值,从而根据与两个对象之间的相对速度按比例减小弹簧力。值越高,振荡消失的速度越快。

1.发射小球案例

默认的小球是有弹簧关节的,发射出去后,取消关节,小球就会飞出去

    void FireBall()
    {
        Destroy(obj_ball.GetComponent<SpringJoint>());
        Destroy(obj_ball, 1);
    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容