Character Controller主要用于不使用刚体物理的第三人称或第一人称玩家控制。
Property: | Function: |
---|---|
Slope Limit | 最大斜坡的角度,最好是90 |
Step Offset | 爬上楼梯的高度,不能比自身身高还要高一般为 0.1到0.4之间 |
Skin width | 两个碰撞器碰撞之后相互嵌入的宽度,最好为radius的10%,或者比这个稍大一点 |
Min Move Distance | 如果移动距离小于这个值,就认为他没有动,一般设置为0 |
Center | This will offset the Capsule Collider in world space, and won’t affect how the Character pivots. |
Radius | Length of the Capsule Collider’s radius. This is essentially the width of the collider. |
Height | Y轴的高度,一般为2米 |
The Character Controller
传统的 Doom-style第一人称控制在物理上是不现实的.:这个角色以每小时90英里的速度奔跑,突然停了下来,在一个转弯处转弯. 因为它是如此的不现实,使用刚体和物理来创造这种行为是不现实的,会觉得是错误的。解决方案是专门的Character Controller. 它只是一个胶囊状的对撞机,可以根据脚本的某个方向移动. 控制器将执行运动,但会受到碰撞的限制
它将沿着墙壁滑动,走上楼梯(如果它们低于Step Offset),并在Slope Limit内行走。
Controller本身不会对 forces力做出反应,也不会自动将Rigidbodie刚体推开。
如果你想要推动 一个挂有Character Controller的Rigidbodies或者一个物体 , 可以在脚本中通过OnControllerColliderHit() 方法执行
另一方面,如果你想让你的玩家角色受到物理影响,那么你最好使用刚体而不是角色控制器。
Character Joints 主要用于布偶效果. 它们是一个扩展的球窝关节,允许你限制每个轴上的关节。
Property: | Function: |
---|---|
Connected Body | 关节依附的 Rigidbody如果没有, the joint connects to the world. |
Anchor | GameObject(游戏物体)的关节旋转的局部空间的点。 |
Axis | 旋转轴 |
Auto Configure Connected Anchor | If this is enabled, then the Connected Anchor position will be calculated automatically to match the global position of the anchor property. This is the default behavior. If this is disabled, you can configure the position of the connected anchor manually. |
Connected Anchor | Manual configuration of the connected anchor position. |
Swing Axis | The swing axis. Visualized with the green gizmo cone. |
Low Twist Limit | The lower limit of the joint. See below. |
High Twist Limit | The higher limit of the joint. See below. |
Swing 1 Limit | Limits the rotation around one element of the defined Swing Axis (visualized with the green axis on the gizmo). See below. |
Swing 2 Limit | Limits movement around one element of the defined Swing Axis. See below. |
Break Force | The force that needs to be applied for this joint to break. |
Break Torque | The torque that needs to be applied for this joint to break. |
Enable Collision | When checked, this enables collisions between bodies connected with a joint. |
Enable Preprocessing | Disabling preprocessing helps to stabilize impossible-to-fulfil configurations. |
The Character Joint on a Ragdoll
Constant Force 能快速给 Rigidbody添加一个恒定的力,非常适合火箭一类的单镜头物体,如果你不希望它以一个很大的速度开始,而是加速
Property: | Function: |
---|---|
Force | 作用于世界空间的力的矢量。 |
Relative Force | :作用于物体局部空间的力的矢量。 |
Torque | 力矩的矢量,应用于世界空间. 体会绕着这个矢量旋转. 矢量越长,旋转越快。. |
Relative Torque | The vector of a torque, applied in local space. The object will begin spinning around this vector. The longer the vector is, the faster the rotation. |
T要使火箭加速前进,必须使Relative Force沿正z轴. 然后使用刚体的阻力特性使其不超过某个最大速度 (阻力越大,最大速度越低).刚体要确保关闭重力,使火箭将永远停留在它的路径。
Character joints 为你提供了许多约束运动的可能性,就像使用万向关节一样。
twist axis旋转轴 (场景中橘色的) 让你在限制之内最大限度的移动旋转,你可以声明一个上限和下限的角度,角度是从开始点开始计算的. A value of –30 in Low Twist Limit->Limit and 60 in High Twist Limit->Limit limits the rotation around the twist axis (orange gizmo) between –30 and 60 degrees.
The Swing 1 Limit 限制围绕摆动轴的旋转 (在gizmo上用绿色轴表示). 极限角是对称的. :因此,值30将限制-30和30之间的旋转。
The Swing 2 Limit坐标轴在这个小装置上是看不出来的但是它与另外两个坐标轴是正交的 (t这是在gizmo上用橙色显示的扭转轴和在gizmo上用绿色显示的摆动极限).这个角度是对称的,因此值40将限制绕该轴旋转-40和40度
For each of the limits the following values can be set:
Property: | Function: |
---|---|
Bounciness | 0的值不会反弹。值1会反弹而不会损失任何能量。 |
Spring | 使两个物体保持在一起的弹簧力。 |
Damper | 用来阻尼弹簧力的阻尼力。 |
Contact Distance | 在接触距离内,限位将保持接触,以避免抖动。 |
可以用 Break Force 和 Break Torque 属性设置关节强度限制.并且一个力/扭矩大于这个限制,其固定关节将被破坏,将不再受其约束。
Mesh Colliders勾选 Convex 能和其它Mesh Colliders.碰撞
Property | Function | |
---|---|---|
Convex | 勾选上之后可以和其它网格碰撞体碰撞. Convex限定网格碰撞器器为255个三角形 | |
Is Trigger | 勾选上之后,不受物理引擎的影响 | |
Cooking Options | 影响物理引擎处理网格的方式。 | |
None | 不使用 | |
Everything | 启用下面列出的所有 Cooking Options | |
Cook for Faster Simulation | 更快的模拟,执行一些额外的步骤,确保运行时最优. | |
Enable Mesh Cleaning | physics engine 清除 Meshes.清除掉一些退化的三角网格,让碰撞更精准 | |
Weld Colocated Vertices | 让物理引擎删除网格中的等顶点. 启用后,物理引擎将组合具有相同位置的顶点. This is important for the collision feedback that happens at run time. | |
Material | Reference to the Physics Material that determines how this Collider interacts with others. | |
Mesh | Reference to the Mesh to use for collisions. |
碰撞网格中的面是片面的。这意味着物体可以从一个方向穿过它们,但从另一个方向与它们相撞。就是正反面
Mesh cooking 把一个普通的网格变成一个你可以在物理引擎中使用的网格.
For a Mesh Collider to work properly, the Mesh must be read/write enabled in any of these circumstances:
Optimization tip: If a Mesh is used only by a Mesh Collider, you can disable Normals
in Import Settings, because the physics system doesn’t need them.
Cloth 组件只能配合 Skinned Mesh Renderer 组件使用,来模拟衣服,流体,如果没有Skinned Mesh组件,或者不是Skinned Mesh组件,添加cloth后会自动添加一个Skinned Mesh,并清除之前的mesh组件
Property: | Function: |
---|---|
Stretching Stiffness | 衣服的柔软度 |
Bending Stiffness | 弯曲度 |
Use Tethers | 应用约束来防止布粒子远离固定的布粒子。这有助于减少过度拉伸。 |
Use Gravity | 应用重力 |
Damping | 运动阻尼系数。 |
External Acceleration | 给布料施加一个外部的恒定的加速度 |
Random Acceleration | 给布料施加一个外部的随机的加速度 |
World Velocity Scale | 人物的移动对布料速度的影响 |
World Acceleration Scale | 人物世界坐标系啊的加速度对布料的影响 |
Friction | 摩擦力 |
Collision Mass Scale | 增加布料的质量 |
Use Continuous Collision | Enable continuous collision to improve collision stability. |
Use Virtual Particles | 为每个三角形增加一个虚拟粒子,以提高碰撞稳定性。 |
Solver Frequency | 每秒求解器迭代次数。 |
Sleep Threshold | Cloth’s sleep threshold. |
Capsule Colliders | 布料应该与之发生碰撞的胶囊碰撞体 |
Sphere Colliders | An array of ClothSphereColliderPairs which this Cloth instance should collide with. |
Cloth 在一个场景中,不会和碰撞发生交互, 它也不会对世界施加力量.且不会对身体的其它部位产生影响,但是如果你手动给布料添加指定的 colliders. ,布料会对你指定的碰撞体产生碰撞,但是不会施加力,比如不会穿过指定的物体,
Select Edit > Constraints 编辑 constraints 每个顶点的约束条件.所有顶点都有一个基于当前可视化模式的颜色,以显示它们各自值之间的差异。. You can author Cloth constraints by painting them onto the cloth with a brush.
Property: | Function: |
---|---|
Visualization | 可视化界面,提供了两个工具,还有一个编辑反面的的按钮 |
Max Distance | 布料上的点可移动的最大距离 |
Surface Penetration | 布料上的点,能够穿过网格的距离 |
Brush Radius | 设置画笔的半径,使您能够在布上绘制约束条件。 |
The Cloth Constraints Tool 在 Skinned Mesh Renderer使用
每一个顶点有两种模式:
Select 选择一个或一组粒子. 可以同时设置Y Max Distance, Surface Penetration, 先选择粒子,再为其设置参数
Paint 调节单个粒子 ,设置 Max Distance, Surface Penetration, or both, and set a value.,先设置参数,在选择要应用参数的粒子
这个按钮设置布料的自碰撞和内部碰撞
没有应用碰撞的粒子显示为黑色
Unused cloth particles
To apply self-collision or intercollision, you need to select a single set of particles to apply collision to. To select a set of particles for collision, click the Select button:
Select cloth particles button
Now left-click and drag to select the particles you want to apply collision to:
Selecting cloth particles using click and drag
The selected particles appear in blue:
Selected cloth particles are blue
The Wheel Collider是一种特殊的地面碰撞器.它有内置的碰撞检测和一个基于滑块的轮胎摩擦模型. 它可以用于轮子以外的物体,但它是专门为有轮子的车辆设计的。
Property: | Function: |
---|---|
Mass | 车轮的质量 |
Radius | Radius of the wheel. |
Wheel Damping Rate | 这是施加在车轮上的阻尼值 |
Suspension Distance | 悬挂的外扩距离,如果不知道悬挂是什么,百度,这个是在y轴的距离 |
Force App Point Distance | 此参数定义将应用轮力的点. This is expected to be in metres from the base of the wheel at rest position along the suspension travel direction. 当forceAppPointDistance = 0 在静止的轴距上施加力. 一辆更好的车所受的力应该略低于车的重心。 |
Center | 轮子的中心 |
Suspension Spring | 悬架试图通过增加弹簧和阻尼力来达到目标位置 |
Spring | 弹簧力试图达到 Target Position.值越大打到Target Position 的速度越快 |
Damper | 降低悬挂的速度. 值越大Suspension Spring ,达到目标位置的速度越慢 |
Target Position | 就是弹簧的比例,0代表弹簧的压缩状态,1代表弹簧的伸展状态,.默认值为0.5,与普通汽车的悬挂行为相匹配。 |
Forward/Sideways Friction | 轮胎前后滚动时的摩擦特性。参见下面的车轮摩擦曲线部分 |
The Wheel Collider Component. Car model courtesy of ATI Technologies Inc.
T:车轮的碰撞检测是通过从中心向局部y轴的下方向投射光线来实现的。车轮有一个Radius,可以根据Suspension Distance悬挂距离向下延伸. 通过脚本中修改不同的属性来控制车辆: motorTorque, brakeTorque and steerAngle.
Wheel Collider 使用基于滑动的模型计算摩擦力,忽略 Physic Material 的设置
您不能旋转或滚动WheelCollider对象来控制汽车 -挂有WheelCollider的物体应该在汽车的固定位置上. 但是,您可能想要转动和滚动车轮的模型。最好的方法是为WheelCollider和可见车轮设置单独的对象
Wheel Colliders 和车轮模型分开,wheel collider的位置在运行时是不会改变的
suspension distance为0.15 时
Wheel Colliders的距离
由于汽车可以达到大的速度,得到正确的赛道碰撞几何形状是非常重要的.具体来说,碰撞网格不应该有构成可见模型的小凸起或凹痕(如栅栏杆)。通常情况下,赛道的碰撞网格是与可见网格分开制作的,使得碰撞网格尽可能的平滑.它也不应该有薄的物体-如果你有一个薄的轨道边界,使它更宽的碰撞网格(或完全删除另一边,如果汽车不能去那里)。
可见几何体(左)比碰撞几何体(右)复杂得多。
轮胎摩擦力. 有单独的曲线为车轮的前进(滚动)方向和横向方向. 在两个方向上,首先要确定轮胎打滑的程度(根据轮胎橡胶和路面之间的速度差). 然后用这个滑移值求出施加在接触点上的轮胎力。
该曲线以轮胎打滑为输入,以力为输出, 这条曲线用两条样条逼近.第一部分从 (0 , 0) to (ExtremumSlip , ExtremumValue), at which point the curve’s tangent is zero. The second section goes from (ExtremumSlip , ExtremumValue) to (AsymptoteSlip , AsymptoteValue), where curve’s tangent is again zero:
典型的车轮摩擦曲线形状
真轮胎的特性是,在低滑移时,它能产生较大的力,因为橡胶通过拉伸来补偿滑移. 后来,当滑动变得很高时,随着轮胎开始滑动或旋转,力就会减小。因此,轮胎摩擦曲线的形状如图所示。
Property: | Function: |
---|---|
Extremum Slip/Value | 曲线的极值点 |
Asymptote Slip/Value | 曲线的渐近线 |
Stiffness | 极值和渐近值的乘数(默认为1) 改变摩擦的刚度. 设置为0,禁用所有摩擦.通常在运行时通过脚本来修改这个值,从而模拟不同地面的摩擦力 |
Physic Material 用于调整碰撞物体的摩擦和弹跳效果
Assets > Create > Physic Material 创建,拖到Collider上
Property: | Function: |
---|---|
Dynamic Friction | 移动时的摩擦力. 通常是0到1之间的值. 0的值就像冰,1的值会让它很快停下来,除非有很大的力或重力推动物体。 |
Static Friction | 物体静止时在表面上的摩擦力. 通常是0到1之间的值。0的值就像冰,1的值会让物体很难移动。 |
Bounciness | 表面弹性如何?0的值不会反弹。1的值会反弹而不会损失任何能量,尽管这可能会给模拟增加少量的能量,但仍需要一定的近似。 |
Friction Combine | 两个相互碰撞的物体之间的摩擦力是如何结合在一起的。 |
- Average | 两个摩擦值取平均值。 |
- Minimum | 使用两个值中最小的值. |
- Maximum | 使用两个值中最大的一个。. |
- Multiply | 摩擦值彼此相乘。. |
Bounce Combine | 如何结合两个相互碰撞的物体的弹性。与摩擦组合方式相同 |
摩擦力是防止表面相互滑动的量. 摩擦有两种形式,动态的和静态的 dynamic and static. Static friction 当物体静止时使用。它将阻止对象开始移动。如果对物体施加足够大的力,它就会开始运动. 这时,动摩擦就起作用了 Dynamic Friction . Dynamic Friction 现在将尝试在与另一个物体接触时减速.
当两个物体接触时,根据所选择的方式,对它们施加相同的弹性和摩擦效应.在这种特殊情况下,两个碰撞器在接触时有不同的组合模式,默认使用具有最高优先级的函数. 优先顺序如下: Average < Minimum < Multiply < Maximum. 比如一个材质的合并方式为Average 另一个材质为 Maximum, 优先使用 Maximum。
请注意,Nvidia PhysX引擎使用的摩擦模型是为模拟的性能和稳定性而调整的,并不一定是真实世界物理的近似值. 特别地,大于单点的接触面(例如两个相互靠在一起的盒子)将被计算为有两个接触点,并且摩擦力将是现实物理中摩擦力的两倍 ,在这种情况下,您可能需要将摩擦系数乘以0.5以获得更实际的结果。
同样的逻辑也适用于弹性模型。Nvidia PhysX不保证完美的能量守恒,因为各种模拟细节,如位置校正.例如,当一个受重力影响的物体的弹跳值为1,并且与有弹跳的地面发生碰撞时,该物体会到达比初始位置更高的位置。
选择 GameObject> 3D Object> Plane. 作为汽车行驶的地面. 位置为远点,缩放大一些
car_root
.car_root
添加 Rigidbody组件,mass改为1500kg .放在car_root下
. Reset重置Transform. 缩放一下z轴 为3wheels
. Reset the Transform on it. 这个GameObject(游戏对象)不是强制的,但是它对以后的调优和调试很有用frontLeft
. Reset the Transform, then set the Transform Position X to –1, Y to 0, and Z to 1. 为其添加一个Wheel Collider, go to Add component > Physics > Wheel ColliderfrontLeft
GameObject.改变 Transform’s X为1.重命名为 frontRight
.frontLeft
and frontRight
GameObjects. 改变 Transform’s Z 为 –1. 重命名rearLeft
and rearRight
respectively.为了让这辆车真正可以驾驶,你需要为它写一个控制器. The following code sample works as a controller:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class SimpleCarController : MonoBehaviour {
public List axleInfos; // the information about each individual axle
public float maxMotorTorque; // maximum torque the motor can apply to wheel
public float maxSteeringAngle; // maximum steer angle the wheel can have
public void FixedUpdate()
{
float motor = maxMotorTorque * Input.GetAxis("Vertical");
float steering = maxSteeringAngle * Input.GetAxis("Horizontal");
foreach (AxleInfo axleInfo in axleInfos) {
if (axleInfo.steering) {
axleInfo.leftWheel.steerAngle = steering;
axleInfo.rightWheel.steerAngle = steering;
}
if (axleInfo.motor) {
axleInfo.leftWheel.motorTorque = motor;
axleInfo.rightWheel.motorTorque = motor;
}
}
}
}
[System.Serializable]
public class AxleInfo {
public WheelCollider leftWheel;
public WheelCollider rightWheel;
public bool motor; // is this wheel attached to motor?
public bool steering; // does this wheel apply steer angle?
}
在car_root上添加这个脚本
(Add Component > New Script),您可以如下所示调整脚本参数;实验设置和进入播放模式,以测试结果。
The following settings are very effective as a car controller:
你可以有多达20个车轮在一个车辆实例,每一个应用转向,电机或制动扭矩
Wheel Collider 不会模拟轮子的位置变换和角度旋转
你需要一些车轮的几何形状. :你可以用圆筒做一个简单的轮子形状. 可能有几种添加可视轮的方法:使您不得不在脚本属性中手动分配可视轮,或者编写一些逻辑来自动查找相应的可视轮
Next, change the controller script:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[System.Serializable]
public class AxleInfo {
public WheelCollider leftWheel;
public WheelCollider rightWheel;
public bool motor;
public bool steering;
}
public class SimpleCarController : MonoBehaviour {
public List axleInfos;
public float maxMotorTorque;
public float maxSteeringAngle;
// finds the corresponding visual wheel
// correctly applies the transform
public void ApplyLocalPositionToVisuals(WheelCollider collider)
{
if (collider.transform.childCount == 0) {
return;
}
Transform visualWheel = collider.transform.GetChild(0);
Vector3 position;
__Quaternion__ rotation;
collider.GetWorldPose(out position, out rotation);
visualWheel.transform.position = position;
visualWheel.transform.rotation = rotation;
}
public void FixedUpdate()
{
float motor = maxMotorTorque * Input.GetAxis("Vertical");
float steering = maxSteeringAngle * Input.GetAxis("Horizontal");
foreach (AxleInfo axleInfo in axleInfos) {
if (axleInfo.steering) {
axleInfo.leftWheel.steerAngle = steering;
axleInfo.rightWheel.steerAngle = steering;
}
if (axleInfo.motor) {
axleInfo.leftWheel.motorTorque = motor;
axleInfo.rightWheel.motorTorque = motor;
}
ApplyLocalPositionToVisuals(axleInfo.leftWheel);
ApplyLocalPositionToVisuals(axleInfo.rightWheel);
}
}
}
一个重要的参数是 Wheel Collider 组件的 Force App Point Distance. 这是从静止轮的基座到施加轮力的点的距离.默认值是0,这意味着施加在静止车轮底部的力,但实际上,明智的做法是让这个点位于稍微低于汽车重心的地方。
Note: To see the Wheel Collider in action, download the Vehicle Tools package, which includes tools to rig wheeled vehicles and create suspension for wheel colliders.