找回密码
 立即注册
查看: 10558|回复: 96

[源码] Unity3D 车辆物理模拟包Edy Vehicle Physics

  [复制链接]
发表于 2012-10-13 12:38 | 显示全部楼层 |阅读模式
资源信息 Asset Information
资源名称: Unity3D 车辆物理模拟包Edy Vehicle Physics (发帖教程)
版本: (版本)
资源等级: 1
资源格式: .unitypackage (链接失效请点击帖子右下方举报通知管理员)
资源大小: 34.4MB (默认:MB)
下载地址: 百度网盘 (购买积分)
点击查看原图
美丽分割线
Edy的车辆物理模拟,游戏中逼真的车辆模拟,基于标准的WheelCollider 组件。

包含:

完整的演示场景工程项目
预置化的,很容易应用于新的场景
4中不同属性和行为的车辆
通过GIT repository版本归档
全部文档,属性和教程
操作方法:

4种车辆: Pickup / GTA4-Pickup / Bus / Sport Coupe (上下箭头选择).

效果:ads刹车系统,车辆破坏效果,可视轮胎效果

按H为帮助键

下载包中包含,资源包、演示文件和教程
教程:

Press Enter to restart the level (i.e. if you flip the car or fall outside the terrain)

Press C to change the secondary camera.
Press B to change the stability mode among "Sport / Offroad" (default is "Sport")
Press N to disable all stability features (keeps the plain rigidbody + 4 wheel colliders only). B to reenable.

It's not only a typical road-car not meant to being too stable, but it also carries a heavy 500 Kg (1100 lbs) box! Can you keep it safely with you in all kind of terrains?

Notes:
- Simple PhysX model: rigidbody + some box colliders roughly resembling the car's shape + 4 standard WheelColliders
- REAL center of mass, located around the front seats.
- No angular drag, no arbitrary forces.
- Default tyre friction curves, only stiffness is adjusted (forward: 0.82, sideways: 0.022)
- No parameter is modified at runtime! (center of mass, rigidbody, drag or angular drag, suspension...)

---------------------------------------------------------------------------------------------------

This is the typical stability problem when using WheelColliders:

Q: Why my absolutely simple car (rigidbody + 4 wheel colliders) flips over so easily when steering?
A: Because that's exactly how such car would behave in real life!!

So you have created a box, added a rigidbody and four wheel colliders. Maybe you've even used some real car's data (mass, dimensions...). You have added a control script, tested it, and as soon as you gain a bit of speed and do a corner, the car rolls and flips over.

If you could build that in real life, it would do the same! PhysX is not perfect, but resembles the physical behavior of real objects in a fairly good manner.

Also note that the default WheelCollider's friction curve parameters in Unity (1,20000,2,10000,1) define a tyre with almost infinite grip. So the rigidbody has no choice but rolling-over when steering even at low speed. You should first set the last parameter (Stiffness Factor) to 0.01-0.03 to have more realistic tyres, but even in that case the car will roll over when stering at certain (low) speed.

Q: But real cars don't roll over so easily. Why?
A: Because real cars have STABILIZER BARS (aka anti-roll or anti-sway bars)

http://auto.howstuffworks.com/question432.htm

Think about what happens to a car in a sharp turn. [...] the part of the car on the outside of the turn gets pushed down toward the road and the part of the car on the inside of the turn rises up. In other words, the body of the car "rolls" 10 or 20 or 30 degrees toward the outside of the turn. If you take a turn fast enough, the tires on the inside of the turn actually rise off the road and the car flips over.

Sounds familiar?
Stabilizer bars "link" the two wheels of the same axle allowing a limited degree of freedom between them. When one of the wheels is pushed upwards, the stabilizer bar transfers a portion of that compression force to the other wheel, so its suspension compress as well. This limits the roll of the body's car at that axle.

If you don't have a stabilizer bar, you tend to have a lot of trouble with body roll in a turn. If you have too much stabilizer bar, you tend to lose independence between the suspension members on both sides of the car.  
Q: I haven't heard of such bars! Are really so important?
A: Absolutely. Stabilizer bars are an essential part of a vehicle's suspension system in the same way as springs and dampers are.

Look under your car, observe the suspension behind the front wheels. You'll be able to easily identify a rigid bar that travels from one wheel's suspension to another. That's it. The only exceptions are a very few car models that use dynamic systems (ej. computer-controlled hydraulic systems) to actively emulate the behavior of the anti-roll bars in turns.

IMHO, an AntiRoll script for WheelColliders should be at least mentioned in the documentation and tutorials as a basic requirement for physically real vehicles. Actually, anti-roll bars are barely mentioned in the last chapter of the Unity's Car Tutorial (http://unity3d.com/support/resources...s/car-tutorial), where an alternate car physics model is proposed.

Q: What about all other solutions proposed here? (lower center of mass, angular drag, custom friction models...)
A: The essential requirements for having a car that physically feels like real include the anti-roll bars.

Once you have the REAL absolutely simple car (rigidbody + four wheel colliders + 2 anti-roll bars) you can then apply all other techniques to get special behaviors on your car and/or tweaking its handling, i.e for arcade-style driving.

Even with the real absolutely simple car you'll find a lot of options to tweak and play with, all of them affecting the handling and feel of the car: mass, REAL center of mass (typically moved towards the engine location), front-rear springs, front-rear dampers (must be different because the axle under the engine will support more weight), front-rear anti-roll bar stiffness...

No need for complicated custom friction/drag models at the beginning - leave them for final tweaks if necessary. You'll see how much the handling can change by simply adjusting the difference between the stiffness of the front and rear stabilizer bars.

Q: What's bad with lowering the center of mass?
A: Jumps, collisions, crashes or air-tricks will look weird because of the false center of mass.

Artificially lowering the center of mass is just a workaround that works under some circumstances, but fails at others. Having the REAL center of mass in the car, and making it stable by means of stabilizer bars, will make almost all situations behave like real.

Q: I've run your demo and I've made the car flip in "Sport" mode!
A: Look at that kind of car. If you do a close turn at high speed with that car in real, surely you'd roll over as well!

If you are (like me) used to watch those "educative" documentaries at Discovery Channel "Road Rampage", "Destroyed in Seconds", and so on, you'll know how easily this kind of cars can roll over at relatively normal speeds. Also, you may have heard about "The moose test", which is a heavy "S" turn test performed at 80 Km/h (50 mph). Many actual cars failed that test (Google for "the moose test" or seehttp://en.wikipedia.org/wiki/Moose_test)

Note that in the demo the elevation of the center of mass is around the middle of the car's body! You must do a hard turn at around 60 Km/h (40 mph) for being able to flip the car in "Sport" mode. The anti-roll bars are doing an excellent work already.

---------------------------------------------------------------------------------------------------
Now the fun part...


Q: How to simulate stabilizer bars in Unity?

A: Easily

Anti-roll bars work by transferring some compression force from one spring to the opposite in the same axle. The amount of the transfered force depends on the difference in the suspension travel among the wheels.

So first task is to calculate the suspension travel on each wheel, as well as determine whether is grounded or not. We want the travel value to be between 0.0 (fully compressed) and 1.0 (fully extended):

code:

groundedL = WheelL.GetGroundHit(hit))

if (groundedL)

    travelL = (-WheelL.transform.InverseTransformPoint(hit.point).y - WheelL.radius) / WheelL.suspensionDistance;

else

    travelL = 1.0;

We multiply the travel diference by the AntiRoll value, which is the maximum

force that the anti-roll bar can transfer among the springs (we could call this

the Anti-roll bar's stiffness). This yields the amount of force that will be

transfered:

code:

var antiRollForce = (travelL - travelR) * AntiRoll;

Finally, we must simply substract the force from one spring and add it to the

other. We achieve this by adding opposite forces to the rigidbody at the

positions of the WheelColliders:

code:

if (groundedL)

    rigidbody.AddForceAtPosition(WheelL.transform.up * -antiRollForce, WheelL.transform.position);

if (groundedR)

    rigidbody.AddForceAtPosition(WheelR.transform.up * antiRollForce, WheelR.transform.position);

Q: What's a good AntiRoll value? Which units is it expressed in?

A: A good  value is roughly the value of the wheel's spring. Both are expressed in Newtons.  

The spring value means the force the spring can give when fully

compressed, and the AntiRoll value means the amount of force that can be

transfered from one spring to another. Having the same values for Springs and

AntiRoll in the same axle means that the anti-roll bar can transfer up the

entire force of one spring to the other.

Q: Can I have the script  for an anti-roll bar?

A: Sure, here is it.

As suggestion, I

believe that an Anti-Roll script should be included in Unity's Standard

Assets.

Add two anti-roll scripts to your vehicle, one per axle (front -

rear). Set the left-right wheels on each one and adjust the AntiRoll value.

Remember to reset center of mass to the real position, or don't touch it at

all!

The full script: AntiRollBar.js

code:

var WheelL : WheelCollider;

var WheelR : WheelCollider;

var AntiRoll = 5000.0;

function FixedUpdate ()

    {

    var hit : WheelHit;

    var travelL = 1.0;

    var travelR = 1.0;

    var groundedL = WheelL.GetGroundHit(hit);

    if (groundedL)

        travelL = (-WheelL.transform.InverseTransformPoint(hit.point).y - WheelL.radius) / WheelL.suspensionDistance;

    var groundedR = WheelR.GetGroundHit(hit);

    if (groundedR)

        travelR = (-WheelR.transform.InverseTransformPoint(hit.point).y - WheelR.radius) / WheelR.suspensionDistance;

    var antiRollForce = (travelL - travelR) * AntiRoll;

    if (groundedL)

        rigidbody.AddForceAtPosition(WheelL.transform.up * -antiRollForce,

               WheelL.transform.position);

    if (groundedR)

        rigidbody.AddForceAtPosition(WheelR.transform.up * antiRollForce,

               WheelR.transform.position);

    }

Q: How can I set a real center of mass for my vehicle?

A: Use  non-overlapping box colliders to roughly resemble your vehicle's shape, then  move the center towards the position of the engine.


Unity/PhysX calculates the center of mass based on the position and

volume of the GameObject's colliders. Note that overlapping colliders add more

mass at the overlap position.

Typically, you would only need to move the

center of mass a bit towards the position of the engine (front - rear). For

instance, if your vehicle has front engine and its front is oriented in the Z+

direction, you should only need to move the (automatically calculated) center of

mass 1 meter to the front:

code:

function Start ()

    {

    rigidbody.centerOfMass += Vector3(0, 0, 1.0);

    }

Q: Does it really works so good? Could it really be so simple??

A: See it  by yourself: http://www.edy.es/unity/offroader.html

You can have

a good view of how it works by pressing C (change secondary camera), then

pressing B while driving (alternate Sport / Offroad mode). Press N for

completely disabling the stabilizer bars (B to reenable, or Enter to restart

after flipping over).

Ending words....

As this is my first post here, please let me introduce myself. I'm a developer now working on dj software. Years ago, while I was a student two friends and me spent about two years trying to develop games in C++ from scratch (no engines at all), because games was what we wanted to do since kids. As you can imagine, very little to no result could be seen in the screen. I discovered Unity about four weeks ago (had heard of it before, but hadn't look at it) and for me it was like seeing The Light. I could just put things on the screen, click play, and worked! I could then fine-tune the scene by looking at code examples and writing scripts in whatever language used by Unity (two weeks ago I realized I was coding in javascript). Magic! Now I'm about to achieve a personal goal of modeling physically real vehicles. This is what I really wanted to do since I was kid and self-learned to code in Basic with by Commodore **. Overlander, Powerdrift, Hard Driving, and later 4D Sports Driving, Fatal Racing... now I can easily do it!! Even as hobbyist, I'm purchasing the Unity Pro license just because I love it!

This article is my first contribution to the GREAT Unity community. It's great to have fun by modeling and playing with Unity's vehicle physics.

Enjoy!

Edy

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

评分

参与人数 6鲜花 +8 收起 理由
shaojava + 1
jichen + 2
qwer4650987 + 2
aa1287537617 + 1
viiqii + 1 很给力!
relidin + 1 很给力!

查看全部评分

发表于 2012-11-9 14:35 | 显示全部楼层
苦逼的一上午过去了
发表于 2012-11-10 17:44 | 显示全部楼层
这个好,顶一下
发表于 2012-11-23 23:45 | 显示全部楼层
教程呢?帮忙发下。。。谢啦。。以下载
发表于 2012-11-24 00:48 | 显示全部楼层
谢谢楼主分享
发表于 2012-12-16 14:27 | 显示全部楼层
好贵………………………………………………{:5_408:}
发表于 2012-12-19 16:00 | 显示全部楼层
good~~{:5_427:}{:5_427:}
发表于 2013-1-16 09:49 | 显示全部楼层
我就想要是下一次给1u币多好嘎嘎
发表于 2013-2-20 21:03 | 显示全部楼层
十分感谢楼主分享!
发表于 2013-2-21 22:36 | 显示全部楼层
只有资源没教程 那么多脚本怎么研究啊  求教程帮助
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-23 20:34 , Processed in 0.108618 second(s), 34 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表