刚体_刚体转动惯量 - CSDN
精华内容
参与话题
  • 刚体组件的属性介绍

    2019-10-20 10:45:14
    所有游戏对象必须包含刚体组件来实现重力、通过脚本施加力、或者与其他对象进行交互,这一切都通过NVIDIA的PhysX物理引擎来实现。 属性 Mass:质量,单位为Kg,建议不要让对象之间的质量差达到100倍以上 ...


    刚体能让你的游戏对象被物理引擎所控制,它能通过受到推力和扭力来实现真实的物理表现效果。所有游戏对象必须包含刚体组件来实现重力、通过脚本施加力、或者与其他对象进行交互,这一切都通过NVIDIA的PhysX物理引擎来实现。

     

    属性

    Mass:质量,单位为Kg,建议不要让对象之间的质量差达到100倍以上

    Drag:阻力,影响位置运动的阻力系数。为0表示没有阻力,infinity表示立即停止移动

    Angular Drag:角阻力,影响旋转运动的阻力系数。数值意义同上

    Use Gravity:是否受重力影响


    Is Kinematic:是否为Kinematic刚体,是否受物理系统影响。如果启用该参数,则对象不会被物理所控制,只能通过直接设置位置、旋转和缩放来操作它,一般用来实现移动平台,或者带有HingeJoint的动画刚体,在某些时候,主要是创建布娃娃效果的时候,你可能需要在动画与物理控制之间进行切换。你可以将刚体设置为IsKinematic,当设置为Kinematic模式,它将不再受到外力影响。这时你只能通过变换方式来操作对象,但是Kinematic刚体还会影响其他刚体,但他自己不会再受物理引擎控制。比如,连在Kinematic刚体上的Joints还会继续影响连接的另一个非Kinematic刚体,同时也能够给其他刚体产生碰撞力。


    Interpolate:如果你的刚体运动时有抖动,尝试一下修改这个参数,None表示没有插值,Interpolate表示根据上一桢的位置来做平滑插值,Extrapolate表示根据预测的下一桢的位置来做平滑插值

     

    Collision Detection : 碰撞检测算法,用于防止刚体因快速移动而穿过其他对象。                                                                             当使用默认的离散式碰撞检测 Discrete 时,如果前一桢时对象在墙这一面,下一桢时对象已到到了墙另一面,那么碰撞检测算法将检测不到碰撞的发生。                                                                                                                                                             设置为Continuous(持续)时,这时碰撞检测算法将会防止对象穿过所有的静态碰撞体。                                                             设置为Continuous Dynamic(连续动态)时,将还会防止穿过其他也设置为Continuous或者Continuous Dynamic的刚体。CCD只支持Box,Sphere和Capsule的碰撞体。                                                                                                                                   设置为 Continuous Speculative 时,碰撞检测为连续投机、动态推测的,一般用于动态对象与IsKinematic的对象进行互动,比Continuous Dynamic模式性能消耗低点,处理旋转运动更好,但是快速移动的物体不容易检测到。

     

    Freeze Rotation :  限制物体在一些轴上的移动和旋转。Freeze Position 冻结位置,Freeze Rotation 冻结旋转​​​​​​​。  如果选中了该选项,在该方向上,那么刚体将不会因为外力或者扭力而发生旋转,你只能通过脚本的旋转函数来进行操作。

    展开全文
  • [专栏精选]Unity刚体详解

    千次阅读 2018-09-04 12:10:24
    本文节选自洪流学堂公众号专栏《郑洪智的Unity2018课》,未经允许不可转载。 ... 洪流学堂,让你快人几步。你好,我是郑洪智。... 从这节课开始,我会尝试用一种新的写作风格,也希望大家能够多提意见。...

    本文节选自洪流学堂公众号专栏《郑洪智的Unity2018课》,未经允许不可转载。

    洪流学堂公众号回复专栏,查看更多专栏文章。


    洪流学堂,让你快人几步。你好,我是郑洪智。

    从这节课开始,我会尝试用一种新的写作风格,也希望大家能够多提意见。

    背景补充

    小新今年数学专业马上大三了,却一直没有找到自己的职业方向,不知道以后要干什么,唯一的爱好就是玩游戏,特别想自己能开发一款成功的游戏。小新趁着暑假去找各种实习兼职,一个偶然的机会收到了一个游戏公司的面试通知。小新欣喜若狂,前去面试,聊到游戏时,小新能滔滔不绝聊出很多东西,但是问到开发游戏的时候,却哑口无言,无法回答面试官的问题。面试官问了很多游戏开发、Unity引擎的问题,小新就下定决心,一定要好好学习一下游戏开发,特别是Unity引擎。小新找到了自己的师兄大智,这位师兄有8年Unity开发经验,想向师兄请教一下学习的方向。没想到师兄特别热情,是一个技术布道者,喜欢研究传播技术,从此小新跟着大智开启了他的Unity学习之旅。

    大智告诉小新,叫我“大智”就好了,以后不要叫师兄了哈。

    Rigidbody 刚体

    “大智,昨天我学习了物理系统,知道了碰撞体,那物理系统里面还有别的东西么?”
    “你呀,太天真了,Collider只是物理系统的一部分。你看昨天学的Collider,他们都只是一个静态的碰撞体。我们昨天学习过物理系统很重要的是模拟物体的受力情况,物体根据物理规则运动呀。”
    “那通过代码修改物体的位置不就能运动起来了么?”
    “通过代码直接修改物体的位置并没有通过受力的方式改变物体,所以这种方式并没有应用到物理系统,要想让物体通过受力运动,我们首先要了解一下Rigidbody组件。物体只有添加了Rigidbody组件,才会对受力作出反应。小新,你现在先去看看Unity的文档,看看Rigidbody组件到底是什么吧!”
    “收到,我马上就去看!”

    小新马上打开Unity文档,找到了Rigidbody的介绍文档https://docs.unity3d.com/Manual/RigidbodiesOverview.html

    Rigidbody组件可以让一个物体受到物理影响。比如添加Rigidbody组建后,物体会立马对重力作出反应。如果物体上还添加了Collider,物体在受到碰撞时也会移动。

    “大智,我知道了!Rigidbody可以让物体对受力做出反应,但是我有点和Collider搞不清楚了。”
    “这两个是初学者不太容易搞清楚的概念。Collider只是给物体加上了碰撞,让物体拥有了实体,而不是一个可以穿过去‘全息投影’。而Rigidbody是让物体拥有了动态受力的功能。所以我们一般称只有Collider没有Rigidbody的物体叫静态Collider。一般刚体物体上也会有Collider,因为需要和别的物体发生碰撞。如果没有Collider,即使刚体也不会和其他物体碰撞。”
    “那是不是不应该给场景里所有的物体添加Rigidbody组件?”
    “非常对,场景里有一些物体是基本不会动的,比如说一栋大楼,一块大石头等等,他们只需要阻挡别的物体别穿过他们就行了,所以它们只需要添加Collider就行。因为添加了Rigidbody组件后会带来很多的物理计算,所以只需要给会移动的物体添加Rigidbody就行。
    “我明白了!我说呢怎么给所有物体添加了Rigidbody后卡的跑不起来呢,我去把我的吃鸡场景重新设置一下,嘿嘿!”
    “你呀你呀,真是个急性子!顺便好好看一下刚体组件的各个参数!”
    “知道啦!”

    Rigidbody组件

    小新认真看了Rigidbody组件的文档,并做了笔记:

    • Mass 刚体的质量,单位是千克(kg)
    • Drag 空气阻力,0代表没有空气阻力,无限大的值代表物体会立即停下来(惯性消失)。
    • Angular Drag 物体受到一个扭力旋转时的阻力,0代表没有阻力,但是需要注意的是无限大的值并不能让物体立即停止旋转。
    • Use Gravity 是否受重力影响
    • Is Kinematic 选中时,物体不会受到物理物理引擎的影响,只能通过修改Transform移动物体。
    • Interpolate 插值,如果发现刚体移动有卡顿,可以尝试选择此选项。
      • None 不使用插值
      • Interpolate 根据上一帧的Transform进行平滑
      • Extrapolate 根据估算的下一帧的Transform进行平滑
    • Collision Detection 碰撞检测的方式,当你的刚体快速运动时,可能会出现穿透的现象,可以设置这个选项。
      • Discrete 离散检测,性能较高,默认值
      • Continuous 连续检测。使用此选项时,物体与其他动态Collider(刚体)使用离散检测;与其他静态Collider使用连续检测。如果其他刚体设置为了Continuous Dynamic,会使用连续检测和这个刚体进行碰撞检测。这个选项非常影响性能,如果没有快速运动物体的碰撞检测问题,保持Discrete设置
    • Continuous Dynamic 动态连续检测。如果其他物体是Continuous或Continuous Dynamic,与这个物体碰撞时会使用连续检测。也会和静态Collider使用连续检测。对于其他的collider(标记为Discrete的Rigidbody)使用离散检测。。用于快速移动的物体。
    • Constraints 约束刚体的运动
      • Freeze Position 选中后刚体不会在对应的轴上移动
    • Freeze Rotation 选中后刚体不会在对应的轴上旋转

    小新看完之后,还是有一些地方不太清楚,又来骚扰大智。
    “大智,刚体的Is Kinematic我明白了是什么,这个有什么用呢?加上刚体不就是为了受力么,为什么还要提供一个这个属性,关掉受力呢?”
    “有些情况,我们不想让物体受力,但是仍然能够和其他物体发生碰撞,影响其他物体。比如这个物体上有动画,在播放动画的时候,我们想让动画来控制物体的位置。”
    “明白了,但是感觉还是需要用到的时候再去理解。那这个Collision Detection该什么时候设置呢?是不是类似子弹这种情况?”
    “说的很对,Collision Detection就是针对快速移动的小物体,比如说子弹,但是通常游戏射击并不用实体的子弹,因为子弹多的时候性能太差了,我可以给你推荐一个文章来看看:https://zhuanlan.zhihu.com/p/22105641
    “谢谢智哥,我也发现了用刚体的话性能太差了,我去看看”

    碰撞汇总

    “大智,我发现有些情况两个物体发生了碰撞,但是并没有调用脚本中的代码,这是怎么回事?”
    “哈哈,这时候我就要祭出大招了,给你两个表格,对照着看看是否会发生碰撞哈。”

    OnCollision消息

    OnTrigger消息

    “太好了,有了这两个表格,能不能获取到消息就很清晰了!”

    总结

    “我来简单总结一下,今天这个Rigidbody组件是物理系统中非常重要的组件,运动的物体都靠它,遇到问题多去查Unity的文档,里面解释的很清楚。”
    “好,我已经掌握的差不多了,下一步就是在我的吃鸡游戏里运用一下,嘿嘿”

    今日思考题

    “既然你说到了运用,我要给你布置一个小作业,用代码控制一个刚体在不平整的地形上运动,试试看!”
    “收到!我去也!”
    “收获别忘了分享出来!也别忘了分享给你学Unity的朋友,也许能够帮到他。”

    洪流学堂公众号回复专栏,查看更多专栏文章。



    《郑洪智的Unity2018课》,倾尽我8年的开发经验,结合最新的Unity2018,带你从入门到精通。

    展开全文
  • 刚体

    2019-06-30 10:46:21
    const static std::string COMPONENT_NAME; /** * 创建一个body * mass 默认是 1.0 * moment 默认是 200 */ static PhysicsBody* create(); /** * 创建一个body * ...
    const static std::string COMPONENT_NAME;
    
        /** 
         * 创建一个body
         * mass 默认是 1.0
         * moment 默认是 200
         */
        static PhysicsBody* create();
       
        /** 
         * 创建一个body
         * @param mass 质量
         */
        static PhysicsBody* create(float mass);
        
        /** 
         * 创建一个body
         * @param mass 质量
         * @param moment This body's moment.
         */
        static PhysicsBody* create(float mass, float moment);
        
        /**
         * 创建一个shape为圆形的body
         * @param   radius 半径
         * @param   material 材料
         * @param   offset  body坐标系中, body的重力中心的偏移量
         */
        static PhysicsBody* createCircle(float radius, const PhysicsMaterial& material = PHYSICSBODY_MATERIAL_DEFAULT, const Vec2& offset = Vec2::ZERO);
        /**
         * 四边形的body
         * @param   size 宽高
         * @param   material 材料
         * @param   offset边缘相对于body中心点位置的偏移
         */
        static PhysicsBody* createBox(const Size& size, const PhysicsMaterial& material = PHYSICSBODY_MATERIAL_DEFAULT, const Vec2& offset = Vec2::ZERO);
    
        /**
         * @brief 创建一个多边形刚体
         * @param   points 点数组
         * @param   count 点的个数
         * @param   material 材料
         * @param   offset 边缘偏移
         */
        static PhysicsBody* createPolygon(const Vec2* points, int count, const PhysicsMaterial& material = PHYSICSBODY_MATERIAL_DEFAULT, const Vec2& offset = Vec2::ZERO);
    
        /**
         * 创建一个不受重力影响的线状刚体
         * @param   a 边缘开始位置
         * @param   b 边缘结束位置
         * @param   material 材料
         * @param   border 边缘宽
         */
        static PhysicsBody* createEdgeSegment(const Vec2& a, const Vec2& b, const PhysicsMaterial& material = PHYSICSBODY_MATERIAL_DEFAULT, float border = 1);
    
        /**
         * 创建一个不受重力四边形刚体
         * @param   size 宽高
         * @param   material 材料
         * @param   border 边界宽
         * @param   offset 边缘相对于body中心点位置的便宜
         */
        static PhysicsBody* createEdgeBox(const Size& size, const PhysicsMaterial& material = PHYSICSBODY_MATERIAL_DEFAULT, float border = 1, const Vec2& offset = Vec2::ZERO);
    
        /**
         * 创建不受重力多边形刚体
         * @param   points 多边形的顶点存放在Point array[ ]中  示例:Point array[ ]={ point(1,1),point(2,2)}  注意:顶点必须按顺时针存放,并且图形为凸状,不能是凹的
         * @param   count 多少个点
         * @param   material 材料
         * @param   border 边界宽
         */
        static PhysicsBody* createEdgePolygon(const Vec2* points, int count, const PhysicsMaterial& material = PHYSICSBODY_MATERIAL_DEFAULT, float border = 1);
    
        /**
         * 创建不受重力链条型刚体
         *
         * @param   points 点的数组
         * @param   count 点的数量
         * @param   material材料
         * @param   border 边界宽
         */
        static PhysicsBody* createEdgeChain(const Vec2* points, int count, const PhysicsMaterial& material = PHYSICSBODY_MATERIAL_DEFAULT, float border = 1);
    
        /**
         * @brief 添加一个shape
         * @param shape 添加的对象
         * @param 值为true时,shape的mass和moment将加到body中, 默认是true
         */
        virtual PhysicsShape* addShape(PhysicsShape* shape, bool addMassAndMoment = true);
    
        /**
         * @brief 移除shape
         * @param shape 对象
         * @param 默认值为true, 移除时将减去shape的mass和moment
         */
        void removeShape(PhysicsShape* shape, bool reduceMassAndMoment = true);
    
        /**
         * @brief 移除shape
         * @param tag shape的tag值
         */
        void removeShape(int tag, bool reduceMassAndMoment = true);
        
        /** 
         * 移除所有的shape
         */
        void removeAllShapes(bool reduceMassAndMoment = true);
    
        /**
         * 获取body中所有的shape
         */
        inline const Vector<PhysicsShape*>& getShapes() const { return _shapes; }
    
        /** 
         * 根据tag值获取body中的shape
         */
        PhysicsShape* getShape(int tag) const;
        
        /** 
         * Applies a continuous force to body.
         * 
         * @param force The force is applies to this body.
         * @param offset A Vec2 object, it is the offset from the body's center of gravity in world coordinates.
         */
        virtual void applyForce(const Vec2& force, const Vec2& offset = Vec2::ZERO);
    
        /** 
         * reset all the force applied to body. 
         */
        virtual void resetForces();
    
        /**
         * Applies a immediate force to body.
         *
         * @param impulse The impulse is applies to this body.
         * @param offset A Vec2 object, it is the offset from the body's center of gravity in world coordinates.
         */
        virtual void applyImpulse(const Vec2& impulse, const Vec2& offset = Vec2::ZERO);
        
        /** 
         * Applies a torque force to body.
         *
         * @param torque The torque is applies to this body.
         */
        virtual void applyTorque(float torque);
        
        /** 
         * Set the velocity of a body.
         * 
         * @param velocity The velocity is set to this body.
         */
        virtual void setVelocity(const Vec2& velocity);
        
        /** Get the velocity of a body. */
        virtual Vec2 getVelocity();
        
        /** 
         * Set the angular velocity of a body.
         *
         * @param velocity The angular velocity is set to this body.
         */
        virtual void setAngularVelocity(float velocity);
        
        /** Get the angular velocity of a body at a local point.*/
        virtual Vec2 getVelocityAtLocalPoint(const Vec2& point);
        
        /** get the angular velocity of a body at a world point */
        virtual Vec2 getVelocityAtWorldPoint(const Vec2& point);
        
        /** get the angular velocity of a body */
        virtual float getAngularVelocity();
        
        /** set the max of velocity */
        virtual void setVelocityLimit(float limit);
        
        /** get the max of velocity */
        virtual float getVelocityLimit();
        
        /** set the max of angular velocity */
        virtual void setAngularVelocityLimit(float limit);
        
        /** get the max of angular velocity */
        virtual float getAngularVelocityLimit();
        
        /** remove the body from the world it added to */
        void removeFromWorld();
        
        /** get the world body added to. */
        inline PhysicsWorld* getWorld() const { return _world; }
    
        /** get all joints the body have */
        inline const std::vector<PhysicsJoint*>& getJoints() const { return _joints; }
        
        /** get the node the body set to. */
        Node* getNode() const { return _owner; }
        
        /**
         * A mask that defines which categories this physics body belongs to.
         * 
         * Every physics body in a scene can be assigned to up to 32 different categories, each corresponding to a bit in the bit mask. You define the mask values used in your game. In conjunction with the collisionBitMask and contactTestBitMask properties, you define which physics bodies interact with each other and when your game is notified of these interactions.
         * @param bitmask An integer number, the default value is 0xFFFFFFFF (all bits set).
         */
        void setCategoryBitmask(int bitmask);
        
        /** 
         * A mask that defines which categories of bodies cause intersection notifications with this physics body.
         *
         * When two bodies share the same space, each body's category mask is tested against the other body's contact mask by performing a logical AND operation. If either comparison results in a non-zero value, an PhysicsContact object is created and passed to the physics world’s delegate. For best performance, only set bits in the contacts mask for interactions you are interested in.
         * @param bitmask An integer number, the default value is 0x00000000 (all bits cleared).
         */
        void setContactTestBitmask(int bitmask);
        
        /**
         * A mask that defines which categories of physics bodies can collide with this physics body.
         *
         * When two physics bodies contact each other, a collision may occur. This body's collision mask is compared to the other body's category mask by performing a logical AND operation. If the result is a non-zero value, then this body is affected by the collision. Each body independently chooses whether it wants to be affected by the other body. For example, you might use this to avoid collision calculations that would make negligible changes to a body's velocity.
         * @param bitmask An integer number, the default value is 0xFFFFFFFF (all bits set).
         */
        void setCollisionBitmask(int bitmask);
        
        /** 
         * Return bitmask of first shape.
         * 
         * @return If there is no shape in body, return default value.(0xFFFFFFFF)
         */
        int getCategoryBitmask() const;
        
        /** 
         * Return bitmask of first shape.
         *
         * @return If there is no shape in body, return default value.(0x00000000)
         */
        int getContactTestBitmask() const;
        
        /** 
         * Return bitmask of first shape.
         * 
         * @return If there is no shape in body, return default value.(0xFFFFFFFF)
         */
        int getCollisionBitmask() const;
        
        /** 
         * Set the group of body.
         *
         * Collision groups let you specify an integral group index. You can have all fixtures with the same group index always collide (positive index) or never collide (negative index).
         * It have high priority than bit masks.
         */
        void setGroup(int group);
        
        /** 
         * Return group of first shape.
         * 
         * @return If there is no shape in body, return default value.(0) 
         */
        int getGroup() const;
        
        /** get the body position. */
        Vec2 getPosition() const;
    
        /** get the body rotation. */
        float getRotation();
    
        /** set body position offset, it's the position witch relative to node */
        void setPositionOffset(const Vec2& position);
    
        /** get body position offset. */
        const Vec2& getPositionOffset() const { return _positionOffset; }
        
        /** set body rotation offset, it's the rotation witch relative to node */
        void setRotationOffset(float rotation);
        
        /** set the body rotation offset */
        float getRotationOffset() const { return _rotationOffset; }
        
        /**
         * @brief Test the body is dynamic or not.
         *
         * A dynamic body will effect with gravity.
         */
        inline bool isDynamic() const { return _dynamic; }
        /**
         * @brief Set dynamic to body.
         * 
         * A dynamic body will effect with gravity.
         */
        void setDynamic(bool dynamic);
        
        /**
         * @brief Set the body mass.
         *
         * @attention If you need add/subtract mass to body, don't use setMass(getMass() +/- mass), because the mass of body may be equal to PHYSICS_INFINITY, it will cause some unexpected result, please use addMass() instead.
         */
        void setMass(float mass);
        
        /** Get the body mass. */
        inline float getMass() const { return _mass; }
    
        /**
         * @brief Add mass to body.
         *
         * @param mass If _mass(mass of the body) == PHYSICS_INFINITY, it remains.
         * if mass == PHYSICS_INFINITY, _mass will be PHYSICS_INFINITY.
         * if mass == -PHYSICS_INFINITY, _mass will not change.
         * if mass + _mass <= 0, _mass will equal to MASS_DEFAULT(1.0)
         * other wise, mass = mass + _mass;
         */
        void addMass(float mass);
        
        /**
         * @brief Set the body moment of inertia.
         *
         * @note If you need add/subtract moment to body, don't use setMoment(getMoment() +/- moment), because the moment of body may be equal to PHYSICS_INFINITY, it will cause some unexpected result, please use addMoment() instead.
         */
        void setMoment(float moment);
        
        /** Get the body moment of inertia. */
        inline float getMoment() const { return _moment; }
        
        /**
         * @brief Add moment of inertia to body.
         * 
         * @param moment If _moment(moment of the body) == PHYSICS_INFINITY, it remains.
         * if moment == PHYSICS_INFINITY, _moment will be PHYSICS_INFINITY.
         * if moment == -PHYSICS_INFINITY, _moment will not change.
         * if moment + _moment <= 0, _moment will equal to MASS_DEFAULT(1.0)
         * other wise, moment = moment + _moment;
         */
        void addMoment(float moment);
        
        /** get linear damping. */
        inline float getLinearDamping() const { return _linearDamping; }
        
        /** 
         * Set linear damping.
         *
         * it is used to simulate fluid or air friction forces on the body.
         * @param damping The value is 0.0f to 1.0f.
         */
        inline void setLinearDamping(float damping) { _linearDamping = damping; updateDamping(); }
        
        /** Get angular damping. */
        inline float getAngularDamping() const { return _angularDamping; }
    
        /**
         * Set angular damping.
         *
         * It is used to simulate fluid or air friction forces on the body.
         * @param damping The value is 0.0f to 1.0f.
         */
        inline void setAngularDamping(float damping) { _angularDamping = damping; updateDamping(); }
        
        /** Whether the body is at rest. */
        bool isResting() const;
        
        /** set body to rest */
        void setResting(bool rest) const;
        
        /**
         * Set the enable value.
         *
         * If the body it isn't enabled, it will not has simulation by world.
         */
        virtual void setEnabled(bool enable) override;
        
        /** Whether the body can rotation. */
        inline bool isRotationEnabled() const { return _rotationEnabled; }
        
        /** Set the body is allow rotation or not */
        void setRotationEnable(bool enable);
        
        /** Whether this physics body is affected by the physics world's gravitational force. */
        inline bool isGravityEnabled() const { return _gravityEnabled; }
        
        /** Set the body is affected by the physics world's gravitational force or not. */
        void setGravityEnable(bool enable);
        
        /** Get the body's tag. */
        inline int getTag() const { return _tag; }
        
        /** set the body's tag. */
        inline void setTag(int tag) { _tag = tag; }
        
        /** Convert the world point to local. */
        Vec2 world2Local(const Vec2& point);
        
        /** Convert the local point to world. */
        Vec2 local2World(const Vec2& point);
    
        /** Get the rigid body of chipmunk. */
        cpBody* getCPBody() const { return _cpBody; }
    
        virtual void onEnter() override;
        virtual void onExit() override;
        virtual void onAdd() override;
        virtual void onRemove() override;

     

    转载于:https://www.cnblogs.com/lion-witcher/p/6024050.html

    展开全文
  • unity刚体介绍

    千次阅读 2017-07-29 15:59:37
    刚体允许你的游戏对象在物理引擎下运动。在现实途径下刚体可以接受力和力矩使物体移动。任何游戏对象必须包含刚体受重力作用下的附加力,通过脚本,或与其他物体通过NVIDIA PhysX物理引擎。 选项: 质量(Mass):...
    刚体允许你的游戏对象在物理引擎下运动。在现实途径下刚体可以接受力和力矩使物体移动。任何游戏对象必须包含刚体受重力作用下的附加力,通过脚本,或与其他物体通过NVIDIA PhysX物理引擎。
    选项:
    质量(Mass):对象德质量
    摩擦(Drag):多少空气阻力的物体受力移动时。0意味着没有空气阻力,而无限大使物体立即停止运动。
    摩擦角(Angular Drag):当扭矩旋转时,空气阻力对物体有多大影响?。0意味着没有空气阻力。注意,你不能把物体的角阻力设置为无穷大,使物体停止旋转。
    使用重力(Use Gravity):如果启用,物体受到重力的影响。
    是否单纯运动(Is Kinematic):如果启用,对象将不会被物理引擎驱动,只能通过它的转换操作。这对移动平台或如果你想要做一个刚体,有铰链连接附件是有用的。
    插值(Interpolate):尝试一个选项只有当你看到你的刚体运动的跳跃。
     --没有插值(None):没有插值
     --插值(Interpolate):基于前一帧的变换平滑变换
     --推算(Extrapolate):基于下一帧的估计变换平滑变换。
    碰撞检测(Collision Detection):用于防止快速移动的物体不经过碰撞而通过其他物体。
     --离散(Discrete):使用离散碰撞检测对场景中的所有其他对撞机。其他对撞机将使          用离散的碰撞检测碰撞测试时对它。用于正常冲突(这是默认值)。
     -- 连续(Continuous):使用离散的碰撞检测和动态碰撞(与刚体)和连续碰撞检测防静           态meshcolliders(没有一个刚体)。被设置为连续动态将使用连续碰撞检测测试时对           该刚体的碰撞。其他单位将用谨慎的碰撞检测。用于连续动态检测需要碰撞的物体。             (这对物理性能有很大的影响,让它设置为离散的,如果你对快速对象的碰撞没有问题)
     --动态连续(Continuous Dynamic):对连续和连续动态碰撞的对象使用连续碰撞检测。          它也将使用连续碰撞检测防静态meshcolliders(没有一个刚体)。对于所有其他对撞机          采用谨慎的碰撞检测。用于快速移动物体。
    约束(Constraints):刚体运动的限制
     --冻结位置(Freeze Position ):停止刚体动的世界X,Y和Z轴的选择
     --禁止转向(Freeze Rotation ):停止刚体在的X、Y、Z轴旋转,选择性。
    细节:
    刚体允许你的游戏对象在物理引擎控制下运动。这就为真实碰撞,大量的关节和其他非常酷的行为敞开了大门。通过添加外力操纵你的游戏对象来产生一个非常不一样的感觉和观感,绝对比使用Transform组件更直接。通常来说,一个对象只能存在rigibody和Transform的其中一个。
    Transform和刚体最大的不同就是刚体通过力来驱动。刚体能够接收力和扭矩的作用,但是Transforn不能。Transform只能单纯地移动和旋转,没有任何物理作用。你自己尝试一下就会注意到直观的不一样。添加外力或者扭矩的刚体会准确地改变对象Transform的位置和面向。这就是为什么你只能在刚体和Transform中选一个。在使用物理作用会导致碰撞和其他计算的问题因此改变Transform。
    刚体必须在被物理引擎影响前明确添加在你的游戏对象中。你能通过菜单的Component->Physics->Rigibody添加一个刚体组件在你的对象上。现在你的对象已经准备好了。它会在重力的作用下自然下落同时还能通过脚本接收外力,但你需要加一个Collider组件或者关节来获得你希望它的行为。
    父级:
    当一个对象在物理控制下,它会跟随着父级移动。
    编辑脚本:
    用来控制你的刚体,你主要使用脚本去添加外力或扭矩。通过使用AddForce()和AddTorque()。记得你不能直接改变物件的Transform当你在使用物理效果时。
    碰撞体:
    碰撞体是另外一些必须添加在刚体上的组件为了允许当两个刚体碰撞时不会穿进对方身体,这个物理引擎不能计算碰撞体除非两个对象都有碰撞体,缺少碰撞体会穿过其他对象。




    展开全文
  • uinty之碰撞体,触碰体,刚体

    千次阅读 2019-10-29 12:13:02
    Rigidbody刚体是赋予物体力的的作用效果的基础,包括重力,拉力(阻力也是拉力的一种),角拉力(角阻力同样)。 体现出来的就是物体悬空时会掉落,被其他东西碰到时(假设有碰撞体)会朝着受力方向运动或产生运动...
  • 脸被拳头打中的时候,身体会旋转180°然后倒地……因为我们生活在物理世界,会受力的作用做出相应的反映,那么在游戏世界里,为了实现这些现实的物理效果呢,Unity引入了刚体。  刚体是物体能够在物理控制下运动,...
  • Unity 关于刚体抖动的问题

    千次阅读 2019-03-06 22:10:20
    一、是刚体物体可能与其他碰撞体有持续的接触,刚体在接触面上移动,比如说刚体在一个带有boxcolider的地面上移动,这个时候你就会发现有些地方会导致刚体位置的变化,应为boxcolider有一定厚度,你人物的colider...
  • Abaqus中的解析刚体与离散刚体

    千次阅读 2019-07-23 00:05:25
    如果模型中某个部件的刚度远远大于其他部件,其变形远远小于其他部件,就可以将其定义为刚体部件。在分析过程中刚体部件不发生变形,而只发生整体的平动和转动。将部件定义为刚体的主要目的是为了提高计算效率,使...
  • 刚体转动的定律及定理

    千次阅读 2020-08-31 17:13:53
    刚体绕定轴转动的动能定理 1. 转动定律 M:和外力矩。 α: 角加速度。 2. 平行轴定理 2. 角动量定理 质点的角动量定理 刚体的角动量定理 3. 角动量守恒定律 质点的角动量守恒定律 *默认相对于某点 刚体的...
  • 碰撞体分为三类(触发器同理):静态碰撞体、刚体碰撞体、Kinematic刚体碰撞体。 静态碰撞体:不挂载刚体组件的碰撞体 常用于地形、障碍物等不会移动位置的物体,物理引擎会对此优化性能。在游戏运行时,不应当...
  • 刚体(Rigidbody)的官方(摘自Unity3d的官方指导书《Unity4.x从入门到精通》)解释如下: Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可接受外力与扭矩力用来保证游戏对象像在真实世界中那样...
  • 刚体动力学学习笔记

    2020-05-24 22:14:25
    刚体动力学 文章目录刚体动力学1. 基本概念1.1 约束及其分类1.2 广义坐标和自由度的概念1.3 虚位移2. 刚体运动学2.1 刚体位置描述$$ a^{(1)}= \begin{pmatrix} a_1^{(1)}\\ a_2^{(1)} \\ a_3^{(1)} \end{pmatrix}2.2...
  • 3D数学基础:刚体旋转的实质

    千次阅读 2020-04-09 14:25:18
    对于入门3D数学的同学,旋转是绕不过去坎儿。...刚体是形状和大小不发生变化的物体,骨骼可以视为是刚体,一段不能弯折和拉伸的铁柱也是刚体,一个陶瓷杯也是一个刚体。对于每一个刚体都有一个物体坐标系...
  • 刚体(Rigidbody)

    2016-11-17 15:58:51
    Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可接受外力与扭矩力,使游戏对象像在真实世界中那样进行运动。 任何游戏对象,只有对其添加了刚体组件,该对象才能受重力的影响。 通过脚本为...
  • 刚体动力学基础学习 1 符号 rrr:刚体上某个质量微元对固定点O的位置矢径 rPr_PrP​:刚体上一点P对固定点O的位置矢径 ρ\rhoρ:刚体上某个质量微元对基点P的位置矢径 ρc\rho_cρc​:刚体质心C对P的位置矢径 mmm...
  • Add Component添加Box Collider 2D(碰撞体)Add Component添加Rigidbody(刚体)首先对碰撞体和刚体做一个简单的区分两句话概括碰撞体: 碰撞体才能被射线检测到,否则无法被检测 碰撞体是产生碰撞的前提两句话...
  • 目录刚体的定轴转动 力矩刚体刚体转动的角速度和角加速度匀变速转动公式角量与线量的关系力矩转动惯量 转动定律质点的转动惯量角动量 角动量守恒定律角动量刚体定轴转动的角动量力矩做功 刚体定轴转动的动能定理力矩...
  • 目录主动碰撞别人的刚体被碰撞的刚体碰撞函数inport引入定义碰撞函数碰撞事件触发事件最后 主动碰撞别人的刚体 需要加两个组件,cc.BoxColliderComponent碰撞组件和cc.RigidBodyComponent刚体组件 记得把大小和阻尼...
  • 机器人学习01——刚体姿态的描述 01刚体运动姿态 刚体运动姿态常常用来确定机器人位姿——位置和姿态。 问:一个刚体(Rigid Body)的状态如何描述? (1)平面:2个移动自由度(DOFs)、1个转动自由度(DOFs)。 (2)...
  • 【Unity】11.2 刚体(Rigidbody) 分类:Unity、C#、VS2015 创建日期:2016-05-02 一、简介 Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可接受外力与扭矩力,使游戏对象像在真实世界中那样...
1 2 3 4 5 ... 20
收藏数 16,331
精华内容 6,532
关键字:

刚体