Differences

This shows you the differences between two versions of the page.

Link to this comparison view

zh:gdevelop5:behaviors:physics2 [2019/03/12 09:10] (current)
lanslot created
Line 1: Line 1:
 +FIXME **This page is not fully translated, yet. Please help completing the translation.**\\ //(remove this paragraph once the translation is finished)//
  
 +#​物理引擎e 2.0
 +
 +物理Behavior可以添加到物体中,使它们以一种符合现实(遵循物理定律)的方法移动。在后台,该扩展使用了Box2D,一个快速且完备的刚体物理模拟库。\\
 +\\
 +Behavior由三大概念组成:一个处理自身物理的世界(World),自身(Body),以及连接身体的关节(Joint)。所有这些都将在本文中详细介绍。
 +\\
 +<note important>​限制:如上所述,该扩展模拟“刚体”物理运行,它意味着物体不能变形。比如软体,布料以及流体,这些将不被支持。</​note>​
 +##World
 +
 +世界是整个物理模拟运行的地方,身体(Body)和关节(Joint)都连接在一个世界(World)上,因此它可以与其它实体进行物理交互。\\
 +你不需要关心如何向世界添加物体,使用物理Behavior的物体将自动被识别,并添加到世界(World)中。而且,在同一时间也仅能存在一个世界(World)。\\
 +世界(World)的尺寸与GDevelop的场景一样,都是无限大的,所以你无需在意你的对象在哪,它们总是遵循物理原则的。\\
 +\\
 +(World)包含三种属性:​
 +  * **重力**: 它由两个分量(X与Y)组成,就像真实世界的重力一样,给每个物体施加一个力,都将使它们被推向指定的方向。物体也包括一个重力比例,详情见于身体(Body)部分。
 +  * **时标(Timescale)**:​ 它定义了整个模拟行为所使用的时间比例,当时标(Timescale)为0.5时,模拟行为将以一半的速度运行,而当时标(Timescale)为2时,模拟行为将以两倍的速度运行,二如果时标(Timescale)为0时,整个模拟行为将停下来,直到它再次被改变为正数。这在子弹时间(Bullet Time)中非常有用。
 +  * **比例**: GDevelop中的距离和尺寸是以像素为单位,但是物理引擎使用的是米,为了使单位统一,请设置一个合适的比例。与重力一样的使,它也有两个分量(X和Y);
 +
 +<​note>​The rule number one to decide the world scale is to choose it so the size of your movable/​dynamics objects falls in the range 0.1 - 10 meters, out of this range the simulations will lose precision. For example, if you work with object sizes around 100x100 pixels, a world scale of 100 would be perfect, as it will make your bodies size to be approximately 1x1 meter. Static objects can be much longer, scaling up to 50 meters.</​note>​
 +
 +##Bodies
 +
 +Bodies are the life of the Physics extension, they define how your object will move, what will be its shape, how much it will bounce, will it be able to rotate or move at all?\\
 +\\
 +When you add the Physics behavior to an object you can set the body configuration right from the IDE.\\
 +There are many options to play with, so they have been categorized below.
 +###Body Type
 +
 +GDevelop supports three basic body types:
 +  * **Dynamic**:​ The most common type, dynamic bodies are affected by gravity, can collide with other dynamic, static, and kinematic bodies. You can apply forces and impulses on them, and modify its velocity as well. Almost anything that must move should be a dynamic body.
 +  * **Static**: Static objects are not affected by gravity, and you can't move them using forces, impulses nor modifying its velocity. Can collide with dynamics objects only, ignoring kinematics and other static bodies. They are meant to be used for static world geometry, as the ground, non-movable walls, and platforms.
 +  * **Kinematic**:​ Kinematics are very specialized,​ as static objects they won't be affected by gravity nor forces or impulses, but, like dynamics, you can move them through their velocity. Kinematics collide with dynamic objects only and are useful to simulate movable walls and platforms.
 +
 +And some dynamic-related settings:
 +  * **Bullet**: If set to true, the object will use a continuos-collision-detection algorithm, slightly reducing the performance but improving the response when moving very fast. Useful to correctly simulate... well... bullets (or any very fast object), and reduce the chances for the bullets to go through thin objects.
 +<note warning>​Use this option on the objects that really need it, the performance impact when used in every object that moves is not *slightly*</​note>​
 +  * **Fixed Rotation**: If set to true the object won't be able to rotate. Imagine your player rotating each time it collides with a wall or while walking down a slope.
 +  * **Can Sleep**: If set to true the engine can improve the performance on objects that haven'​t moved in a while putting them to sleep. It's just a performance setting and should not impact the simulation itself.
 +<​note>​You can check if a body is sleeping using events conditions. If an object is sleeping it means it has been in an equilibrium state for a while, useful to make balance games.</​note>​
 +
 +###Body Shape
 +
 +Body shape options determine the body form and size, and depending on the shape type you have different options to set the dimensions:
 +  * **Box**: An axis-aligned rectangle centered on the object, if custom width and height are not set the object size is used
 +  * **Circle**: A circle centered on the object, if a custom radio is not set it will be calculated as an average from the object width and height, if the object is squared the result will be an inscribed circle inside the object bounding box.
 +  * **Edge**: A thin line centered in the object, since this shape has no volume it doesn'​t work well as a dynamic body, it's meant to be used for static geometry, as ground and platforms. If customs length and angle are not set the edge will be a horizontal line with length equal to the object width.
 +  * **Polygon**:​ The polygon shape lets you define a custom shape through vertices. The polygon must be convex, if this condition fails the shape falls back to a default box. The number of vertices must be greater or equal than 3 (otherwise it can't be convex) and equal or less than 8 (the maximum number of vertices supported per polygon): 3 ≤ number of vertices ≤ 8.
 +
 +In addition to custom shape type and dimension, the body shape supports two extra options:
 +  * **Offset**: The offset has two components (X and Y) and can be used to move the shape from the object center.
 +  * **Scale**: You can scale the shape too. It will scale the shape custom dimensions and offset. If you don't use custom dimensions, for example you use the box shape and let the width and height be equal to the object original size, there'​s no need to change the shape scale as the scaling will be done automatically. If the shape type is a polygon the scale will modify the vertices position too, and the scaling origin will be the **Polygon Origin**, if you set the polygon origin to `Center` and scale the shape down the vertices will be scaled down to/​in-direction-of the center of the object.
 +
 +###Body Settings
 +
 +Besides the type and shape, physic bodies have some extra settings that determine how the body will behave on collision, how the gravity will affect them and the energy they lose by air friction. Each setting is explained below:
 +  * **Density**:​ The density determines the body mass. The general formula is `density = mass/area`. Two bodies with the same density but different areas/size will have different mass, so you have to take the density into account when resizing objects.\\ \\ __Density can't be negative!__
 +
 +  * **Friction**:​ The friction adds a force to bodies in contact in the opposite direction of their movement. The higher the friction the faster the objects will slow down on contact. To understand it better, a platform made of sand will have friction close to 1 (very high), while a platform made of ice will have a friction factor close to zero.\\ \\ __Friction can't be negative!__\\ \\ When two objects make contact, the total friction is calculated mixing the friction of the colliding objects through the formula: `friction = sqrt(frictionA * frictionB)`
 +
 +  * **Restitution**:​ Determines how much energy the object will keep or lose in each collision. A value of zero means the collisions will be perfectly inelastic and the object won't bounce at all. While a restitution = 1 means the collisions will be perfectly elastic, and the object will bounce with the same energy each time, imagine a ball bouncing in the ground and always reach the same height, forever. Values of restitution greater than 1 are valid but will make the object gain energy on each collision, and the simulation will probably run out of control.\\ \\ __Restitution can't be negative!__\\ \\ When two objects make contact, the total restitution is calculated mixing the restitution of the colliding objects through the formula: `restitution = max(restitutionA,​ restitutionB)`
 +
 +  * **Linear Damping**: The linear damping reduces the object velocity all the time, the higher the value the faster it slows down the objects. You can imagine it as the air viscosity, very high values would even simulate the object to move in liquid.\\ \\ __Although you can use any value, negative damping will make the object to gain velocity on each step, generating a non-physical behavior__.
 +
 +  * **Angular Damping**: Analogous to the linear damping, but instead slowing down the object velocity it slows down the angular velocity, making the object to rotate slower each step.\\ \\ __Although you can use any value, negative damping will make the object to gain angular velocity on each step, generating a non-physical behavior__.
 +
 +  * **Gravity Scale**: This factor is multiplied by the world gravity to determine the gravity applied to the object. Note that this is a number and not a vector, you can't change the orientation of the gravity, just the magnitude and sense. Any number is valid, some examples: If the gravity scale is 1 the gravity applied will be the world gravity, if it's 2 the gravity will be twice as strong for this object, if it's 0.5 the gravity will be twice as weak, if it's 0 the object won't be affected by gravity, and if it's -1 the gravity will be inverted.
 +<​note>​You can use a negative gravity scale to invert the gravity for a specific object.</​note>​
 +
 +###Layers & Masks
 +
 +Layers and masks are the way to filter collisions between objects. Imagine you're building a zombies game, and you want your player to collide with the ground, and want the zombies to collide with the player and with the ground as well, but you don't want zombies to collide with other zombies, you need collision filters.
 +
 +How filters work?, there is one rule only:
 +<note important>​Two objects A and B can collide if any layer of A matches any mask of B **and** any layer of B matches any mask of A</​note>​
 +
 +Here is a possible solution to the zombies problem:
 +  * Ground: Enable the first layer, and the first and second masks.
 +  * Player: Enable the first layer, and the first and second masks.
 +  * Zombie: Enable the second layer, and the first mask only.
 +Why does it work?
 +  * Ground & Player: A ground layer matches a player mask (first) **and** a player layer matches a ground mask (first)
 +  * Ground & Zombie: A ground layer matches a zombie mask (first) **and** a zombie layer matches a ground mask (second)
 +  * Player & Zombie: A player layer matches a zombie mask (first) **and** a zombie layer matches a player mask (second)
 +  * Zombie & Zombie: The zombie has only the second layer enabled, and only the first mask enabled, so zombies can't collide each other.
 +
 +Note that you have 16 layers and 16 masks available, and to solve our little problem only 2 layers and masks were needed.
 +
 +###Movement
 +
 +After setting up your objects it's time to start the simulation: gravity will start to push things, objects will move and collide, but you can't interact with your game at all. It's time to move the objects by yourself, and to do that you have to use the events system, here are some useful actions to interact with the objects and move them in the way you want:
 +
 +<note warning>​GDevelop built-in forces are not suited for the Physics behavior, use the forces specific for physics or the physic actions to set the linear velocity.</​note>​
 +
 +  * **Forces**: Forces change the movement of an object and are meant to be used for some time to generate an apreciable effect. The velocity the object gain when you apply on it a force depends on the force length and the object mass. A heavy object will move slower than a lighter one applying the same force on both.\\ \\
 +__To add a force an application point must be set.__\\ \\
 +  * **Torques**:​ The analogous of forces but for rotation. A toque will generate an angular acceleration on the object, making it rotate faster or slower along the time.
 +  * **Impulses**:​ Similar to forces, but don't depend on the time step, adding an "​amount"​ of velocity instantly. They'​re meant to be used a single time. A common use could be to simulate jumps: each time the jump button is pressed add an impulse upwards.\\ \\
 +__To add an impulse an application point must be set.__\\ \\
 +  * **Angular Impulses**: The analogous of impulses but for rotation. Change the rotation speed of an object instantly.
 +  * **Velocity**:​ You can modify the velocity of an object directly. For example, you can make your character walk with constant speed changing the velocity while a movement button is pressed.
 +  * **Angular Velocity**: You can set the angular velocity (rotation speed) directly too.
 +
 +<note important>​You can change the position of the objects directly, but it will generate non-physical behaviors, at least until the new position is corrected. Objects don't teleport in real life after all.</​note>​
 +
 +Note that forces and impulses need an application point, it's important because it isn't the same to push a glass from the base (move the glass) than pushing it from the top edges (the glass will probably fall), nor pushing a door from the knob than from the hinges.\\
 +If the application point is different than the object mass center it will generate some kind of torque/​rotation.
 +<​note>​You can get an object mass center using the physics behavior expressions `MassCenterX()` and `MassCenterY()`</​note>​
 +
 +##Joints
 +
 +Joints are restrictions given to the objects to make them follow extra rules of movement. Some joints make the objects rotate around a fixed point, others keep two objects together, complex ones simulate vehicle wheels limiting the distance between the bodies but allowing them to rotate freely.
 +
 +**Joint ID**:\\
 +When you create a joint you can pass a variable name, if you do it GD will store the joint unique identification number (ID) in the given variable. Using the joint ID you can modify it after the creation, check its values and remove it. Imagine you create a joint to stick a key to a rope attached to the roof, if you save the joint ID in a variable then you can check if an object collides with the rope, and remove the joint using the saved ID to make the key fall down.
 +<​note>​A joint ID will be always a number greater than zero.</​note>​
 +
 +Usually, you will need two objects to define a joint (in the previous example the rope and the key), but there are "​exceptions",​ check the explanation given in the Revolute joint if you want to know more.
 +
 +Here is a list of  properties, conditions, and actions common for all types of joints:
 +  * **Joint first/​second object**: Conditions that let you pick objects if they are the first or second object the joint is attached to.
 +  * **Joint first/​second anchor X/Y**: Expressions to get the position of the first or second object anchor point the joint is attached at.
 +  * **Joint reaction force/​torque**:​ Conditions and expressions to check the joint reaction force or torque, this value is a measure of how much far away is the joint from its equilibrium state. If the joint reaction force is too high it means the joint has been separated from the equilibrium position through a considerable force. Useful to make breakable joints.
 +  * **Remove joint**: Action to remove the specified joint. If the joint is one of the children of a gear joint the gear will be also removed. If any of the objects the joint is attached to is deleted the joint will be deleted too.
 +
 +There are many kinds of joints, each one with unique behaviors and properties, they are listed below.
 +<note important>​Make sure to create joints in events that run only once (for example at the beginning of the scene), creating joints every frame will create hundreds of joints in seconds, resulting in poor performance,​ non-physical behaviors and possible crashes due to memory consumption.</​note>​
 +
 +
 +###Distance Joint
 +
 +Distance joint tries to keep two objects separated by a given distance, the distance is calculated from the joint anchor points.
 +The objects won't be at the given distance all the time but will tend to reach it, following an oscillator formula.
 +
 +Settings:
 +  * **Length**: The target distance, if a negative value is given the distance between the objects at the moment of creating the joint is used.
 +  * **Damping ratio**: The "​friction"​ the objects will suffer, low values make the objects oscillate more, higher values reduce oscillations but objects will move slower.
 +  * **Frequency**:​ How fast the objects will oscillate, lower values generate soft joints moving slower to reach the target distance, higher values simulate harder joints with objects moving very fast to reach the target.
 +<​note>​Low values of damping ratio and frequency will generate soft joints, with lots of oscillations before getting close to the target distance, while high values for both settings generate very rigid joints.</​note>​
 +
 +###Revolute Joint
 +
 +Revolute joints work like "​pins"​ and are also known as "​hinges",​ they make the objects to rotate around a point.
 +There are two types of revolute joints, in the end they are the same, but there'​s a small difference:
 +  * **Revolute joint between two objects**: It "​pins"​ two objects, the objects will move together in a way their anchor points overlap, and each object will rotate around their anchor point. Imagine that you pin two cards together and throw them so they move and rotate freely around the pin.
 +  * **Revolute joint in a single object**: Joints usually work between two objects, this is one of the exceptions. This joint needs a single object and its anchor point, and pin the object at the given fixed position. Think of it like pinning a note in a wall, the note can rotate around the pin but can't move.
 +<​note>​Note that, in the single object version of the joint, the object is added as the second object in the joint, the first object is a hidden static body, this allows to use this type of joint in gears, this is explained in the gear joint section.</​note>​
 +
 +Here is the list of the settings specific for revolute joints:
 +  * **Angle limits**: If enabled the rotation will be restricted between the minimum and maximum angles. Note that both angles are relative to the first object.
 +  * **Reference angle**: The angle between the objects that will be considered as zero. It offsets all the angle properties. If the reference angle is 15 degrees, asking for the current joint angle when the angle between the objects is 15 degrees in world coordinates will return 0, and set the maximum angle to 30 will set it to 45 (relative to the first object).
 +  * **Minimum angle**: The minimum angle between the objects, relative to the first object. Must be lower or equal than the maximum angle.
 +  * **Maximum angle**: The minimum angle between the objects, relative to the first object. Must be higher or equal than the minimum angle.
 +<note tip>You can use revolute joints with angle limits to simulate articulations,​ in other words, ragdolls!</​note>​
 +  * **Motor**: If enabled, the joint will add torque to the second object to make it rotate without the need of an external force... like a motor. If you enable it, remember to set a motor speed and a maximum motor torque!
 +  * **Motor speed**: The target motor speed, in degrees per second. This is the speed the second object will try to reach, rotating around the first object. Motor speed can be positive to rotate the object in a clockwise direction, or negative to rotate it in the opposite direction.
 +  * **Maximum motor torque**: The maximum torque the motor can spend to reach the target motor speed. Must be positive.
 +
 +Also, you can access these values during simulation:
 +  * **Joint angle**: The current angle between the objects, relative to the first object and affected by the reference angle.
 +  * **Joint speed**: The current joint angular speed, i.e. the speed the second object is rotating around, relative to the first object rotation.
 +  * **Joint motor torque**: The current motor torque, it can be lower than the maximum motor torque, as it's the required torque to reach the target motor speed.
 +
 +<​note>​Other uses for revolute joints can be: pinball levers, top-down doors, automated rotating machines as bridges.</​note>​
 +
 +###​Prismatic Joint
 +
 +Prismatic joints work like "​pistons"​ and are also known as "​sliders"​. They make objects to slide one over the other, in a given axis. A good example is an elevator, the elevator moves in a vertical axis along a rail, the rail would be the first joint body and the elevator the second one, the axis would be an angle pointing up or down (-90 or 90 degrees).
 +
 +Settings specific for prismatic joints:
 +  * **Axis angle**: The angle that determines the movement direction, an axis angle of 0 means a horizontal movement. The value is given in world coordinates,​ but the axis will rotate following the first object direction (if you rotate your elevator rails, the elevator movement angle rotates too).
 +  * **Reference angle**: As in revolute joints, this angle adds an offset to the axis, establishing a new "angle zero". If the reference angle is 15, an axis angle of 15 in world coordinates (relative to the first object direction) will be treated as 0.
 +  * **Translation limits**: If enabled the second object movement will be limited between the given minimum and maximum translations.
 +  * **Minimum translation**:​ The minimum position the second object can move from the first one. In our elevator example, the minimum translation would be the floor.
 +  * **Maximum translation**:​ The maximum position the second object can move from the first one. In our elevator example, the roof.
 +<note important>​The translation limits range must include the zero, a minimum translation of 5 and maximum translation of 10 (range [5, 10]) will be converted to the range [0, 10] to include the zero</​note>​
 +  * **Motor**: If enabled the joint will apply a force to the second object to reach a given motor speed. If you enable it, remember to set a motor speed and motor maximum force!
 +  * **Motor speed**: The target speed the motor will try to reach, if positive the second object will move in the axis direction, and in the opposite direction if negative.
 +  * **Maximum motor force**: The maximum amount of force the motor can spend to reach the target speed. Must be positive.
 +
 +Also, you can access the next values during simulation:
 +  * **Joint translation**:​ The current translation the second object has moved relative to the first.
 +  * **Joint speed**: The current speed the second object is moving at, along the axis and relative to the first object speed.
 +  * **Joint motor force**: The current force the motor is applying to the second object, this value can be lower than the maximum motor force as it's the force needed to reach the target motor speed.
 +
 +###Pulley joint
 +
 +A simple joint with a simple name. This joint makes the summation of the distances from each object to its ground position to be constant, it's a lot easier to understand using other words: simulates a pulley :)
 +
 +Imagine you have a box hanging 3 meters under a fixed point A, and a circle hanging 2 meters under a fixed point B, both objects attached to the ends of the same rope. The rope has a constant length, so if you move the box up, now hanging just 1 meter under A, the circle has to move down the same distance, now 4 meters under B, this way the distance between the box and A plus the distance between the circle and B is always 5 meters:\\
 +`distance(box,​ A) + distance(circle,​ B) = constant`
 +
 +**Ratio**:​\\
 +Easy, no? now the crazy part, this joint supports an extra setting: ratio. The ratio makes the rope to be more extensible in one of the sides than the other. It can make, for example, 1 meter of rope in the box side to be equivalent to 2 meters of rope in the circle side (ratio = 1/2 = 0.5).
 +
 +Going back to our initial example: The box 3 meters under A, the circle 2 meters under B, but with a ratio = 0.5. Now, moving the box 2 meters upward will make the circle move 4 meters downward. Clearly, the rope length is not constant, but:\\
 +`distance(box,​ A) + ratio*distance(circle,​ B) = constant`
 +(Note that the first equation is a particular case of this one, with ratio = 1).
 +
 +Also, please note that there is not a "​rope"​ at all, the joint works with the distance between the objects and the anchor points only!
 +
 +Here are the joint settings:
 +  * **First ground point**: The fixed point the first object is attached (in the examples, the point A).
 +  * **Second ground point**: The fixed point the second object is attached (in the examples, the point B).
 +  * **First length**: The initial rope length between the first object and its ground point, if the value is negative or zero the distance at the moment of creating the joint is used.
 +  * **Second length**: The initial rope length between the second object and its ground point, if the value is negative or zero the distance at the moment of creating the joint is used.
 +  * **Ratio**: Explained above, the equivalence between the distance in each side. If the ratio is = 0.33, 1 meter on the first side is equivalent to 3 meters in the second side.
 +
 +###Gear Joint
 +
 +This joint is very special, instead of joining two bodies directly, gears join two other joints, those child joints must be revolute or prismatic.\\
 +When two joints are linked through a gear joint the movement of one of the joints makes the other joint to move. For example, moving an object along the axis on a prismatic joint will make the linked revolute joint to rotate, and vice versa.
 +
 +This joint is also very tricky! to get a gear to work the first body of each child joint must be static, and the second body dynamic.\\
 +You can gear together two revolute joints, two prismatic joints, or a revolute and a prismatic, but always the first body of each of the joints must be static!
 +<​note>​The first body of the gear child joints must be static, that's why the single object version of the revolute joint clarifies that the first body is a hidden static object</​note>​
 +
 +The gear joint settings:
 +  * **First joint**: A revolute or prismatic joint, will be linked to the second joint.
 +  * **Second joint**: A revolute or prismatic joint, will be linked to the first joint.
 +  * **Ratio**: Like the pulley joint, gears support a "​ratio",​ and works in a similar way: If you link two revolute joints with a ratio = 0.33, each turn in the first revolute will be equivalent to three turns in the second one. But there is a difference against the pulley joint ratio: gears ratios can be negative, allowing a positive movement in one of the joints to generate a negative movement in the other. For example, when linking two revolute joints with a ratio = -1, a clockwise rotation in a revolute joint will generate an anti-clockwise rotation in the other, much like a gear, uh?
 +
 +<note important>​Gear need the two child joints to exist, if any of the two joints are deleted the gear will be automatically deleted too.</​note>​
 +
 +###Mouse Joint
 +
 +This joint is not necessarily related to the mouse, but it's very common. What this joint does is move an object towards a target position, if you update the target position continuously to target the mouse or a touch position you can drag objects around.
 +
 +Note that it's another exception for joints as it's a joint that requires a single body to work: the object that will be moved towards the target.
 +
 +Settings for the mouse joint:
 +  * **Object**: The object to move around, towards the target position.
 +  * **Target**: ​ The target point the object will try to reach. You can update it as many times as you want after creating the joint.
 +<note important>​The initial target position (at the moment of creating the joint) is also used as the object anchor point, so make sure to set it!</​note>​
 +  * **Maximum force**: The maximum force the joint can apply on the object to reach the target position, the greater the force the faster the object will move. Must be positive.
 +  * **Frequency**:​ Works like the distance joint frequency, determining how fast the object will oscillate around the target.
 +  * **Damping ratio**: Works like the distance joint damping ratio, slowing down the object along the time.
 +
 +<​note>​The mouse joint is not restricted to be used with the mouse only but accepts any world point as the target. </​note>​
 +
 +###Wheel Joint
 +
 +A very specified joint, when you need wheels you'll want this joint, and it's hard to think a case different than vehicles wheel were the best joint is the wheel joint.\\
 +Made to simulate vehicles wheels, this joint does only that but does it very well!
 +
 +You can think in the wheel joint as a revolute plus a prismatic joint:\\
 +The revolute joint is used to make the second object (the wheel) to rotate and, as the classic revolute joint, it supports a motor to simulate the vehicle motor, making the wheel to rotate.\\
 +The prismatic joint function is to simulate the vehicle wheel suspension and, as the classic prismatic joint, you can set the axis angle to define the wheel translation direction. Generally, the axis direction is vertical but, for example, motorbikes have a front wheel suspension direction different (and in some cases very far) from vertical.
 +
 +<note important>​The body that will work as the wheel has to be the second object in the joint.</​note>​
 +
 +Here are the wheel joint settings:
 +  * **Axis angle**: Equivalent to the prismatic joint axis angle, it determines the direction of movement (or sliding) between the wheel and the first object.
 +  * **Frequency**:​ The suspension frequency, equivalent to the distance joint frequency. Higher values will make the wheel to oscillate faster.
 +  * **Damping ratio**: The suspension damping, equivalent to the distance joint damping ratio. Higher values slow down more the wheel movement.
 +  * **Motor**: If enabled the joint will add torque to the wheel (second object) to reach a given motor target speed. If you enable it, remember to set the motor speed and the maximum motor torque!
 +  * **Motor speed**: The target angular speed the wheel will try to reach. Can be positive for clockwise rotation or negative for anti-clockwise rotation.
 +  * **Maximum motor torque**: The maximum amount of torque the joint can apply to the wheel to reach the motor target speed. Must be positive.
 +
 +And some extra values you can access during simulation:
 +  * **Joint translation**:​ The current wheel translation along the suspension axis.
 +  * **Joint speed**: The current wheel rotation speed.
 +  * **Joint motor torque**: The current torque the joint is applying to the wheel, it can be lower than the maximum motor torque as it's the torque needed to reach the target speed.
 +
 +###Weld Joint
 +
 +This joint is super basic, just tries to stick/glue two objects together, and move them as if it were a single object.
 +
 +<note important>​You can use it to make breakable objects, but don't abuse! after all the objects will be attached by soft joints and sticking lots of objects or with very different densities can lead to physically inaccurate results.</​note>​
 +
 +The weld joint specific settings:
 +  * **Reference angle**: The angle the second object will have, relative to the first object angle.
 +<​note>​To stick the objects in the angle they are at the moment of creating the joint, use the relative angle between the objects as the reference angle: `SecondObject.Angle() - FirstObject.Angle()`</​note>​
 +  * **Frequency**:​ Works like the distance joint frequency, determining how fast the objects will oscillate to reach the rest position.
 +  * **Damping ratio**: Works like the distance joint damping ratio, slowing down the objects along the time.
 +
 +###Rope Joint
 +
 +Another simple joint. This one makes two objects to be virtually linked with a rope, this way they can't be separated by a distance greater than the rope length, but can be in any distance below it.
 +
 +As in the pulley joint, there is not a real rope at all, the joint just check the distance between the objects, and react if the distance is greater than the given length.
 +
 +The only setting specific for the rope joint:
 +  * **Maximum length**: The maximum distance between the objects. If the initial value is negative the distance between the objects at the moment of creating the joint is used.
 +
 +###Friction Joint
 +
 +Friction joint simulates friction in a Z-axis, it slow down the realive speed and/or the angular speed between two objects, so it can simulate linear and angular friction.
 +<note tip>If one of the objects is static, the friction joint can be used to correctly simulate friction in a top-down game, like a pool table or top-down racing games.</​note>​
 +
 +Friction joint settings:
 +  * **Maximum force**: The maximum force the joint can apply to the objects, higher values generate higher linear friction.
 + ​**Maximum torque**: The maximum torque the joint can apply to the objects, higher values generate higher angular friction.
 +
 +###Motor Joint
 +
 +The motor joint has not much to do with real motors, at least not directly. When you link two objects with a motor joint, the objects will try to reach a target position and/or angle relative to the other object plus an offset.
 +
 +Two things to take into account:
 +  * The joint is not rigid at all, the objects can be far away from their target position or angle, a correction factor will tell how fast they will move and rotate to reach the rest pose.\\
 +For example, imagine one of these punching bags toys that always gets up again. You could simulate it using a motor joint, linking the ground and the bag, this way no matter how much you push the bag object the joint will try to put it back in the original angle, but not automatically.
 +  * Motor joints will stop if there are obstacles.\\
 +Going back to the punching bag example, if you push it with a big object to keep it on the ground, the motor joint won't be able to push it back, like in real life.
 +
 +<​note>​Note that this joint doesn'​t use anchor points, the offset position must be set using the linear and angular offsets only. Accessing the anchor points of this joint will return the objects positions.</​note>​
 +
 +The motor joint specific settings:
 +  * **Offset X/Y**: The offset position for the second object, relative to the first one. To use the current objects position at the moment of creating the joints use `SecondObject.X() - FirstObject.X()` and `SecondObject.Y() - FirstObject.Y()`
 +  * **Offset angle**: The angular offset for the second object, relative to the first one. To use the current objects relative angle at the moment of creating the joints use `SecondObject.Angle() - FirstObject.Angle()`
 +  * **Maximum force**: The maximum force the joint can apply to the objects to move them to the target position. Higher values will move the objects faster, in case of being necessary. If this value is zero, there won't be a linear correction and objects won't move to reach the target position.
 +  * **Maximum torque**: The maximum torque the joint can apply to the objects to rotate them to the target angle. Higher values will rotate the objects faster, in case of being necessary. If this value is zero, there won't be an angular correction and objects won't rotate to reach the target angle.
 +  * **Correction factor**: How much fast the objects have to move and rotate to reach the target position and angle. The higher the correction the faster the objects will move and/or rotate. The correction is limited by the maximum amount of force and torque the joint can use.