精华内容
下载资源
问答
  • vipkid提供wheel是什么意思、wheel英语单词推荐、wheel英语解释、wheel相关词、wheel英语短语英音 [wi:l] 美音 [wil]【中文释义】n. 轮子;旋转;Wheels 汽车;有…轮子的汽车(或自行车等);vi. 转动,旋转;突然转变方向...

    vipkid提供wheel是什么意思、wheel英语单词推荐、wheel英语解释、wheel相关词、wheel英语短语

    英音 [wi:l] 美音 [wil]

    【中文释义】

    n. 轮子;旋转;Wheels 汽车;有…轮子的汽车(或自行车等);

    vi. 转动,旋转;突然转变方向;

    vt. 推;拉(车);使变换方向;(使)迅速转身;

    【英文释义】

    Noun:a simple machine consisting of a circular frame with spokes (or a solid disc) that can rotate on a shaft or axle (as in vehicles or other machines)

    a handwheel that is used for steering

    forces that provide energy and direction;

    "the wheels of government began to turn"

    a circular helm to control the rudder of a vessel

    game equipment consisting of a wheel with slots that is used for gambling; the wheel rotates horizontally and players bet on which slot the roulette ball will stop in

    an instrument of torture that stretches or disjoints or mutilates victims

    a wheeled vehicle that has two wheels and is moved by foot pedals

    Verb:

    change directions as if revolving on a pivot;

    "They wheeled their horses around and left"

    wheel somebody or something

    move along on or as if on wheels or a wheeled vehicle;

    "The President's convoy rolled past the crowds"

    ride a bicycle

    【wheel相关词】

    cartwheel n. (大车)车轮;侧手翻,侧身筋斗;

    cogwheel n. 钝齿轮,木齿铁轮;

    flywheel n. 调速轮;

    freewheel n. 自由飞轮; vi. 轻快地行动,凭惯性前进;

    gearwheel n. 大齿轮;

    pinwheel n. 轮转焰火,纸风车;针轮;靶中心;

    wheelbarrow n. 独轮手推车;

    wheelbase n. 前后轮之车轮轴距离,轴距;

    wheelchair n. 轮椅;

    wheeled adj. 有轮的,用轮子行走的;

    wheeler n. 车夫,车轮制造人;明轮船;

    wheelhouse n. 舵手室;

    wheelie n. 自行车前轮离地平衡特技;

    wheelman n. 舵手;骑自行车的人;(机动车)驾驶员;开车的(人);

    wheelsman n. 舵手,骑脚踏车的人;

    wheelwork n. (钟表等的)齿轮装置,转动装置;

    wheelwright n. 车轮制造人,车匠;

    【wheel相关词条】

    antifriction wheel 减摩轮;

    Athey wheel 履带轮;

    wheel borer 轮孔镗床;

    pedestal wheel 导线立轮;

    wheel aligner 车轮对准器;

    grinding wheel n. 砂轮;

    straight wheel 盘形轮;

    wheel bracket 导轮支架;

    wheel bearing 轮轴轴承;

    wheel shoulder 轮肩;

    indicator wheel 指示轮;

    hour wheel driving wheel 时轮传动轮;

    resinoid wheel 树脂胶结砂轮;

    sheet wheel 薄片砂轮;

    saucer wheel 盘型砂轮,碟形砂轮;

    multitype wheel 多次印字轮;

    main-wheel 主轮;

    wheel drag 车轮制动器,轮闸,轮阻力;

    buff wheel 抛光轮;

    catherine wheel n. 轮转烟火,烟花;

    展开全文
  • 简谈一下时间轮(Time Wheel

    千次阅读 2016-08-10 16:47:49
      ...如果一个程序员不知道 Time Wheel,那么那个程序员一定不是个合格的程序员。...timer对于操作系统还是一个虚拟机语言或大型中间件都起着重要的作用,同时...Time Wheel翻译为时间轮,是用于实现定时器timer
     
    

     

    如果一个程序员不知道 Time Wheel,那么那个程序员一定不是个合格的程序员。

     

    timer对于操作系统还是一个虚拟机语言或大型中间件都起着重要的作用,同时timer算法的选择也直接影响着性能。

     

    Time Wheel翻译为时间轮,是用于实现定时器timer的经典算法,算法细节就不多说了,这里主要是看看Erlang中和Linux kernel的time wheel实现有哪些不同。

     

    Erlang中的Time Wheel实现文件是time.c,kernel中的实现文件是timer.c,好了,先看看kernel中的实现吧!

     

    Linux kernel中的time wheel这么多年一直没怎么改变,主要特点是以下几点:

    1)kernel中的timer是在softirq中执行

    2)多CPU同时执行,和process差不多,timer也可在cpu中migrate

    3)使用percpu

    4) 核心数据结构:

    1. struct tvec_base {  
    2.         spinlock_t lock;  
    3.         struct timer_list *running_timer;  
    4.         unsigned long timer_jiffies;  
    5.         unsigned long next_timer;  
    6.         struct tvec_root tv1;  
    7.         struct tvec tv2;  
    8.         struct tvec tv3;  
    9.         struct tvec tv4;  
    10.         struct tvec tv5;  
    11. } ____cacheline_aligned;  
     

    这里的base属于percpu数据,即每个cpu拥有一个base,这样每个cpu执行自己base里面的timer。这里有tv1/tv2/tv3/tv4/tv5,这几个vector维护着所有timer,每次加timer时根据timeout的时间分别加入到不同的vector中,tv1是最近的,tv5是最远的,kernel首先会在tv1中遍历timeout的timer,如果遍历完tv1,则从tv2中的timer list加到tv1中,如果tv2中的timer list用完后,再从tv3中取,注意tv3中的timer可以分布到tv1和tv2中,以此类推,实现代码如下:

    1. #define INDEX(N) ((base->timer_jiffies >> (TVR_BITS + (N) * TVN_BITS)) & TVN_MASK)  
    2.   
    3. /** 
    4.  * __run_timers - run all expired timers (if any) on this CPU. 
    5.  * @base: the timer vector to be processed. 
    6.  * 
    7.  * This function cascades all vectors and executes all expired timer 
    8.  * vectors. 
    9.  */  
    10. static inline void __run_timers(struct tvec_base *base)  
    11. {  
    12.         struct timer_list *timer;  
    13.   
    14.         spin_lock_irq(&base->lock);  
    15.         while (time_after_eq(jiffies, base->timer_jiffies)) {  
    16.                 struct list_head work_list;  
    17.                 struct list_head *head = &work_list;  
    18.                 int index = base->timer_jiffies & TVR_MASK;  
    19.   
    20.                 /* 
    21.                  * Cascade timers: 
    22.                  */  
    23.                 if (!index &&  
    24.                         (!cascade(base, &base->tv2, INDEX(0))) &&  
    25.                                 (!cascade(base, &base->tv3, INDEX(1))) &&  
    26.                                         !cascade(base, &base->tv4, INDEX(2)))  
    27.                         cascade(base, &base->tv5, INDEX(3));  
    28.                 ++base->timer_jiffies;  
    29.                 list_replace_init(base->tv1.vec + index, &work_list);  
    30.                 while (!list_empty(head)) {  
    31.                         void (*fn)(unsigned long);  
    32.                         unsigned long data;  
    33.   
    34.                         timer = list_first_entry(head, struct timer_list,entry);  
    35.                         fn = timer->function;  
    36.                         data = timer->data;  
    37.   
    38.                         timer_stats_account_timer(timer);  
    39.   
    40.                         base->running_timer = timer;  
    41.                         detach_timer(timer, 1);  
    42.   
    43.                         spin_unlock_irq(&base->lock);  
    44.                         call_timer_fn(timer, fn, data);  
    45.                         spin_lock_irq(&base->lock);  
    46.                 }  
    47.         }  
    48.         base->running_timer = NULL;  
    49.         spin_unlock_irq(&base->lock);  
    50. }  
    51.   
    52. static int cascade(struct tvec_base *base, struct tvec *tv, int index)  
    53. {  
    54.         /* cascade all the timers from tv up one level */  
    55.         struct timer_list *timer, *tmp;  
    56.         struct list_head tv_list;  
    57.   
    58.         list_replace_init(tv->vec + index, &tv_list);  
    59.   
    60.         /* 
    61.          * We are removing _all_ timers from the list, so we 
    62.          * don't have to detach them individually. 
    63.          */  
    64.         list_for_each_entry_safe(timer, tmp, &tv_list, entry) {  
    65.                 BUG_ON(tbase_get_base(timer->base) != base);  
    66.                 internal_add_timer(base, timer);  
    67.         }  
    68.   
    69.         return index;  
    70. }  
     

    可以看出,即使你加了很多长时间的timer,kernel的timer性能并没有减少,因为长时间time被分布到不同的vector中,因此Linux kernel中的time wheel算法适合大容量的timer应用场景。

    (注意kernel中每个base的lock用的是spin lock,而不是mutex,下面会讲到)

     

     

    下面再来看看Erlang中的timer实现,erlang普遍应用于并发量比较高的场景,erlang的process通信是通过message,message的发送接收显然离不开timer,erlang甚至把timer提升到语言语法的层次,从此可看出timer在

    erlang中使用是多么的广泛。

    和Linux kernel的time wheel比较,erlang有以下几点不同:

    1)erlang的timer执行过程是在erlang process schedule时发生,而不是像很多中间件timer实现那样用单独的线程,这是有历史原因的(Erlang应兼顾到plain cpu的情形)。

    2)erlang的scheduler线程可以有多个,所以timer wheel需要lock的支持

    3)没有percpu,由于erlang在user space,所以percpu是个很难的问题,原因是抢占的问题,kernel实现的percpu可以显著提高性能,但也是有代价的,代价就是在很多percpu的处理过程中要关闭抢占,这也就是为什么RT kernel的人比较头疼percpu的原因。而在用户空间,抢占被操作系统强制执行,导致用户空间程序无法使用percpu。

    4)Erlang中time wheel没有像Linux kernel那样把timeout根据相对时间挂载到tv1/tv2/tv3/tv4/tv5中,但是erlang中的wheel slot却比较大(kernel中的slot是16或64),可以是8192或65536,这在一定程度上缓解了大量长时间timer对性能带来的影响,如果把 每个wheel的slot的间隔时间算作是1ms,wheel算作8192,那么几乎是8s一个wheel就遍历完,如果程序中有大量的timer超时时间大于8s,那么那些timer就会对8192取模挂载在相应的slot下,这就意味着每次遍历是会有很多并未超时的timer被访问到,而这在Linux kernel中则不存在。核心代码如下:

    1. static ERTS_INLINE void bump_timer_internal(erts_short_time_t dt) /* PRE: tiw_lock is write-locked */  
    2. {  
    3.     Uint keep_pos;  
    4.     Uint count;  
    5.     ErlTimer *p, **prev, *timeout_head, **timeout_tail;  
    6.     Uint dtime = (Uint) dt;  
    7.   
    8.     /* no need to bump the position if there aren't any timeouts */  
    9.     if (tiw_nto == 0) {  
    10.         erts_smp_mtx_unlock(&tiw_lock);  
    11.         return;  
    12.     }  
    13.   
    14.     /* if do_time > TIW_SIZE we want to go around just once */  
    15.     count = (Uint)(dtime / TIW_SIZE) + 1;  
    16.     keep_pos = (tiw_pos + dtime) % TIW_SIZE;  
    17.     if (dtime > TIW_SIZE) dtime = TIW_SIZE;  
    18.   
    19.     timeout_head = NULL;  
    20.     timeout_tail = &timeout_head;  
    21.     while (dtime > 0) {  
    22.         /* this is to decrease the counters with the right amount */  
    23.         /* when dtime >= TIW_SIZE */  
    24.         if (tiw_pos == keep_pos) count--;  
    25.         prev = &tiw[tiw_pos];  
    26.         while ((p = *prev) != NULL) {  
    27.             ASSERT( p != p->next);  
    28.             if (p->count < count) {     /* we have a timeout */  
    29.                 /* remove min time */  
    30.                 if (tiw_min_ptr == p) {  
    31.                     tiw_min_ptr = NULL;  
    32.                     tiw_min = 0;  
    33.                 }  
    34.   
    35.                 /* Remove from list */  
    36.                 remove_timer(p);  
    37.                 *timeout_tail = p;      /* Insert in timeout queue */  
    38.                 timeout_tail = &p->next;  
    39.             }  
    40.             else {  
    41.                 /* no timeout, just decrease counter */  
    42.                 p->count -= count;  
    43.                 prev = &p->next;  
    44.             }  
    45.         }  
    46.         tiw_pos = (tiw_pos + 1) % TIW_SIZE;  
    47.         dtime--;  
    48.     }  
    49.     tiw_pos = keep_pos;  
    50.     if (tiw_min_ptr)  
    51.         tiw_min -= dt;  
    52.   
    53.     erts_smp_mtx_unlock(&tiw_lock);  
     

    综上比较,在面对大容量timer的情况下Linux kernel的time wheel算法会比Erlang更有效率一些。最后还有一点要注意,Erlang的time wheel使用的lock是mutex(上面说过Linux kernel使用spin lock),在这里那种lock会更适合time wheel呢?个人觉得spin lock会好些,毕竟临界区代码处理应该会很快。当然如果erlang中ethread mutex使用的是mutex spin机制(mutex使用的是futex,在进入kernel futex前,进行spin lock很短一段时间),那就无所谓了。

    展开全文
  • Timing wheel

    千次阅读 2016-03-29 14:30:51
    本来在看netty5的源码,后来里面使用timewheel实现定时任务,就了解下是什么玩意,转载3篇文章: http://www.cppblog.com/Solstice/archive/2011/05/04/145691.html这篇理论讲的不错,c++的实现 ...

    本来在看netty5的源码,后来里面使用timewheel实现定时任务,就了解下是什么玩意,转载3篇文章:

    http://www.cppblog.com/Solstice/archive/2011/05/04/145691.html这篇理论讲的不错,c++的实现

    http://blog.csdn.net/mindfloating/article/details/8033340 java实现

    http://biocy.iteye.com/blog/2006928,对上一篇java实现的改进


    在严肃的网络程序中,应用层的心跳协议是必不可少的。应该用心跳消息来判断对方进程是否能正常工作,“踢掉空闲连接”只是一时权宜之计。我这里想顺便讲讲 shared_ptr 和 weak_ptr 的用法。

    如果一个连接连续几秒钟(后文以 8s 为例)内没有收到数据,就把它断开,为此有两种简单粗暴的做法:

    • 每个连接保存“最后收到数据的时间 lastReceiveTime”,然后用一个定时器,每秒钟遍历一遍所有连接,断开那些 (now - connection.lastReceiveTime) > 8s 的 connection。这种做法全局只有一个 repeated timer,不过每次 timeout 都要检查全部连接,如果连接数目比较大(几千上万),这一步可能会比较费时。
    • 每个连接设置一个 one-shot timer,超时定为 8s,在超时的时候就断开本连接。当然,每次收到数据要去更新 timer。这种做法需要很多个 one-shot timer,会频繁地更新 timers。如果连接数目比较大,可能对 reactor 的 timer queue 造成压力。

    使用 timing wheel 能避免上述两种做法的缺点。timing wheel 可以翻译为“时间轮盘”或“刻度盘”,本文保留英文。

    连接超时不需要精确定时,只要大致 8 秒钟超时断开就行,多一秒少一秒关系不大。处理连接超时可以用一个简单的数据结构:8 个桶组成的循环队列。第一个桶放下一秒将要超时的连接,第二个放下 2 秒将要超时的连接。每个连接一收到数据就把自己放到第 8 个桶,然后在每秒钟的 callback 里把第一个桶里的连接断开,把这个空桶挪到队尾。这样大致可以做到 8 秒钟没有数据就超时断开连接。更重要的是,每次不用检查全部的 connection,只要检查第一个桶里的 connections,相当于把任务分散了。

    Timing wheel 原理

    《Hashed and hierarchical timing wheels: efficient data structures for implementing a timer facility》这篇论文详细比较了实现定时器的各种数据结构,并提出了层次化的 timing wheel 与 hash timing wheel 等新结构。针对本文要解决的问题的特点,我们不需要实现一个通用的定时器,只用实现 simple timing wheel 即可。

    Simple timing wheel 的基本结构是一个循环队列,还有一个指向队尾的指针 (tail),这个指针每秒钟移动一格,就像钟表上的时针,timing wheel 由此得名。

    以下是某一时刻 timing wheel 的状态,格子里的数字是倒计时(与通常的 timing wheel 相反),表示这个格子(桶子)中的连接的剩余寿命。

    wheel1

    一秒钟以后,tail 指针移动一格,原来四点钟方向的格子被清空,其中的连接已被断开。

    wheel2

    连接超时被踢掉的过程

    假设在某个时刻,conn 1 到达,把它放到当前格子中,它的剩余寿命是 7 秒。此后 conn 1 上没有收到数据。

    wheel3

    1 秒钟之后,tail 指向下一个格子,conn 1 的剩余寿命是 6 秒。

    wheel4

    又过了几秒钟,tail 指向 conn 1 之前的那个格子,conn 1 即将被断开。

    wheel5

    下一秒,tail 重新指向 conn 1 原来所在的格子,清空其中的数据,断开 conn 1 连接。

    wheel6

    连接刷新

    如果在断开 conn 1 之前收到数据,就把它移到当前的格子里。

    wheel4

    收到数据,conn 1 的寿命延长为 7 秒。

    wheel7

    时间继续前进,conn 1 寿命递减,不过它已经比第一种情况长寿了。

    wheel8

    多个连接

    timing wheel 中的每个格子是个 hash set,可以容纳不止一个连接。

    比如一开始,conn 1 到达。

    wheel3

    随后,conn 2 到达,这时候 tail 还没有移动,两个连接位于同一个格子中,具有相同的剩余寿命。(下图中画成链表,代码中是哈希表。)

    wheel9

    几秒钟之后,conn 1 收到数据,而 conn 2 一直没有收到数据,那么 conn 1 被移到当前的格子中。这时 conn 1 的寿命比 conn 2 长。

    wheel10


    展开全文
  • NWH Vehicle Physics2 文档Wheel Controller翻译 Wheel Controller 设定说明 将载具模型拖进场景中 将RigidBody组件附加在载具上 给载具添加Collider 创建新的GameObject 此对象要做为悬架系统的锚点,所以需要...

    NWH Vehicle Physics2 文档Wheel Controller翻译

    Wheel Controller

    在这里插入图片描述


    设定说明

    • 将载具模型拖进场景中
    • 将RigidBody组件附加在载具上
    • 给载具添加Collider
    • 创建新的GameObject
    • 此对象要做为悬架系统的锚点,所以需要放在轮胎位置上方
    • 拷贝轮胎对象,除了Transform对象删除其所有组件,然后向上拖动到弹簧行进的起点
    • 在其上附加WheelController对象

    调整车辆参数

    Tips
    • 弹簧长度不应小于0.2(或Time.fixedDeltaTime*10).小的弹簧刚度会导致当车轮在一帧里上下移动超过弹簧总长度时,悬挂系统触底。通常这回造成车辆在地面上弹开,因为悬挂系统没有吸收撞击的能量。如果你想要载具保持低位,请不要减小弹簧长度,而是考虑上移WheelController 对象,这会反过来时车轮上移,从而降低驾驶高度
    • 最大弹簧力 = 载具重量*10
    过度转向实现
    • 减小后轮相对于前轮的 Maximum Tire Grip Force
    • 向前调整centerOfMass。如果实现基于WheelController3D,你可以使用提供的脚本。如果实现基于NWH Vehicle Physic,centerOfMass选项可以在 VehicleControlle的setting选项卡中找到
    • 增加后轮的弹簧刚度
    • 增加后轮的roll-bar force
    街机风格

    ​ 默认来说,属性是基于现实中的模型设置的,要实现街机风格:

    • 减小Slip Coefficient、增加Force Coefficient。如此设置,会让载具不容易打滑和旋转。推荐值 Slip Coefficient:0.3 force coefficient:0.6

    • 调整摩擦力曲线使其更加线性。之后可能需要增加 Force Coefficient,是载具更难打滑在这里插入图片描述

    • 降低centerOfMass,来减少载具翻转的可能性,并减少载具的q倾斜程度,表现得更像是卡丁车。请勿将重心降低到车轴高度以下,否则车辆可能开始向相反的方向倾斜。

    属性解释说明

    Wheel

    在这里插入图片描述

    • Rim offset 表示悬挂系统中心和轮缘中心的距离
    • Drag Torque 制动力矩,用来模拟滚动阻力,是施加在轮胎上的常量力
    • Use Rim Collider为真,则会生成一个半圆形的网格碰撞器,并将其放置在车轮的上半部分,以防止车轮的该部分将载具检测为地面,从而导致车轮突然跳动。 还可以防止车轮侧面通过物体,因为地面检测仅发生在轮胎螺纹的下半部分。
    Spring

    在这里插入图片描述

    • Max Force 当弹簧被最大程度压缩时,弹簧的最大弹力
    • Max Length 最大延伸弹簧长度。 与Unity的WheelCollider中不同,没有目标弹簧位置设置,因为弹簧在空中时会完全伸展(如其应有的那样)。 因此,弹簧的静止长度是事先未知的。 因此,将车辆置于静止位置的最佳方法是进入播放模式,让车辆稳定下来,然后复制Transform
    • Force Curve 在两个轴上均具有归一化的值(均为0到1)。 X表示弹簧压缩(0表示松弛,1表示压缩),Y轴表示力。 实际的X和Y最大值可通过“最大力”和“最大长度”进行调整。
    Damper

    在这里插入图片描述

    • Bump Force 压缩时的减震器的最大力
    • Rebound Force 拉伸时减震器的最大力
    • Curve 决定了弹簧的速度和力的关系(x轴表示速度,y轴表示力)
    Geometry

    在这里插入图片描述

    • Camber At Top and Camber At Bottom 表示悬挂系统移动到最高点和最低点时的外倾角
    • Squat 当轮胎通过摩擦往地面施加一个力时,会在轮轴周围产生相反方向的扭矩。Squat 决定了传递到载具的力矩,以百分比表示。设置为1的效果时后端会因为加速而下蹲,-1则相反
    Friction

    在这里插入图片描述

    Friction Preset

    FrictionPreset是一个包含轮胎摩擦属性数据的ScriptableObject
    在这里插入图片描述

    车轮碰撞体使用基于滑动的摩擦模型计算摩擦力。车轮总会有些打滑,在正常状态下打滑程度非常低,在曲线上的左下部分。
    在这里插入图片描述

    上图中,X轴表示打滑程度,Y轴表示摩擦力。曲线左边的部分是轮胎在正常操作下的表现,称之为“has traction”,右边的部分表示轮胎失去的牵引力

    。不同的曲线会让载具在失去牵引力控制上有不同的表现。下面是曲线的参数,以及它们是如何影响处理的说明:

    • B(stiffness):较高的值会让曲线更陡峭,更快达到峰值,意味着载具稍微一打滑就会失去牵引力的控制,使载具会表现得不稳定,更容易旋转。较低的值会使载具表现的更稳定,很难旋转。过低的值会让载具表现得像在冰面上一样
      在这里插入图片描述

    • C(shape)-决定了转峰值之后转折点的强度。较高的值会使转折点变尖,而较低的值会使之后的曲线更平

    • D(peak)-值越高,轮胎拥有的牵引力越多。简单来说,摩擦力结果值等于峰值乘以slip coefficient 再乘以其他值。

    • E(falloff)-决定了曲线在峰值之后降落的速度快慢。它取决于其他参数,但是较低的值通常表示曲线的结束点更接近于0,而值1则表示曲线在峰后几乎是水平的。如果设置为低值,则一旦失去牵引力,车辆将开始滑动;如果设置为高值,则曲线的“具有牵引力”和“失去牵引力”部分几乎没有差异。

    其他参数
    • Slip Coefficient- 滑动系数。用于在不改变曲线的情况下,改变摩擦力的表现
    • Force Coefficient - 轮胎摩擦力系数。大致等于摩擦曲线的Pacejka参数的D参数。
    Load and Forces

    轮胎的抓地力随负载增加而增加。 多少取决于轮胎,但是在大多数轮胎中,这种抓地力/负载关系直到开始趋于稳定的某个点才是线性的。 载荷抓地力曲线模仿了以下关系,其中X轴表示最大轮胎载荷的百分比(0到1),Y轴表示最大轮胎抓力的百分比(0到1)。 车轮性能在很大程度上取决于这些值。

    Ground Detection

    在这里插入图片描述

    WheelController中的地面检测是通过发射一个或多个射线到地面以检测地面形状。 这是经过高度优化的,并且射线被分批处理。 不过,由于需要对接收到的匹配数据进行一些后处理,因此射线的数量确实会影响性能。

    • Sinle Ray-只会从轮胎中心发出一条射线。与Unity的WheelCollider做的事情一样。适用于赛车游戏和没有太多障碍的游戏。
    • Multiple rays-使用于需要更加准确的检测地面的情况。例如在越野游戏中,可以使用多条射线。 取消勾选“Single Rays”,将显示两个字段,即“Longitudinal Scan Resolution and Lateral Scan Resolution。 这两个字段确定将要投射的射线网格的分辨率。
    • Apply Force To Others - 如果勾选上这个选项,则会与其他刚体进行交互。
    Ground Detection - Layer Mask

    由于Raycast用于检测地面,因此车轮还将检测其他物体,例如车辆本身。 为了防止这种情况,使用了“Layer Mask”。 默认情况下,自动设置Layer Mask被勾选,并且分配给父级(车辆)对撞机的所有图层都将自动从图层蒙版中删除(即将被忽略)。

    Debug Values

    在这里插入图片描述

    调试面板展示了很多轮胎最重要的信息。

    • 勾选Debug,在运行模式下可以看到调试 gizmos.
    • Suspension Force Magnitude 可用于平衡车辆的重量分布。 调整刚体的质心,直到所有车轮在平坦表面上具有相同的力,以获得平均的重量分布。 如果使用WheelController资产调整质量中心是通过附带的脚本完成的,如果使用NWH Vehicle Physics 2,则可以在VehicleController 的settings选项卡中设置。

    故障排除

    1. 在点击播放后,载具飞天了
      • 载具没有碰撞器
      • RigidBody质量为1
      • WheelController很可能与父组件的碰撞体发生了碰撞
    2. 载具停不下来
      • 增加车轮的Drag Torque
    3. 在无输入、保持静止的情况下,载具在震动
      • Time.fixedDeltaTime 值太大了。不推荐使用高于0.02的值,0.1667(物理以60HZ更新)会在牺牲很少的性能情况下很大程度上增加物理模拟的平稳性
      • 载具的center of mass太高了。尝试添加CenterOfMass脚本来降低质心。较高的质心具有试图平衡手指尖上的极点的效果,并且更容易产生振荡。
      • 极大的spring length
      • 摩擦曲线太硬或力系数/滑移系数太大。
    展开全文
  • linux中wheel组的概念

    千次阅读 2015-10-30 22:50:20
    linux中wheel组的概念  qianghaohao(孤狼)  先来看看维基百科中对wheel组的一段描述:
  • 欢迎来我博客使用UNITY的WheelCollider车轮系统,该系统自带碰撞检测,和物理摩擦功能,能物理方式实现汽车运行。 祝生活愉快! 2020.05.26 一 ;使用Wheelcollider制作的晒车游戏 1.实现了物理漂移功能。 2.实现了...
  • Linux中的Wheel组的作用

    2014-05-11 12:57:00
    原文:... Linux中的Wheel组的作用(用自己的话翻译的) (原文) Wheel The wheel group is a legacy from UNIX. When a server had to be maintained at a hig...
  • Color Wheel for Mac是一款可直接输出Web颜色代码的取色工具,通过方便的Hex/RGB/Float/HSL翻译提供即时访问标准Mac OS X的ColorWheel,任何网页设计师的工具箱都应该有它,将它配置在工具栏上,并打开一个全局热键...
  • 使用过 Linux/Unix 的朋友应该知道,将用户添加都 wheel用户组,让用户可以通过在命令在前加 sudo 临时获取 root 用户的权限。但是有没有朋友会想知道为何这个用户组要交 wheel用户组,而不是叫 admin 用户组呢? 在...
  • Android WheelMenu圆形菜单,巧妙实现

    千次阅读 2015-05-05 17:59:04
    这个圆形菜单是在GitHub开源项目Android-Wheel-Menu-master的基础上修改而来 这个是GitHub项目的地址https://github.com/anupcowkur/Android-Wheel-Menu 不说别的了,直接上代码 1.自定义组件 package ...
  • (转)使用WM_MOUSEWHEEL

    千次阅读 2012-02-15 18:18:59
    使用WM_MOUSEWHEEL   需要把CWnd设定为Focus  ON_WM_MOUSEWHEEL( )   CWnd::OnMouseWheel     afx_msg BOOL OnMouseWheel( UINT nFlags, short zDelta, CPoint pt );     返
  • WM_MOUSEWHEEL The WM_MOUSEWHEEL message is sent to the focus window when the mouse wheel is rotated. The DefWindowProc function propagates the message to the window's parent. There should be no inter
  • [Violation ] Added non-passive event listener to ascroll- blocking 'mousewheel’event Consider marking event handler ...翻译: [冲突]在ascroll中添加了非被动事件侦听器-阻塞“mousewheel”事件考虑将事件处理
  • Muduo 网络编程示例之八:用 Timing wheel 踢掉空闲连接 Muduo 网络编程示例之八:Timing wheel 踢掉空闲连接 陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solsticet.sina.com.cn/giantchen 这是《Muduo 网络编程示例...
  • timing wheel 可以翻译为“时间轮盘”或“刻度盘”,本文保留英文。 连接超时不需要精确定时,只要大致 8 秒钟超时断开就行,多一秒少一秒关系不大。处理连接超时可以用一个简单的数据结构:8 个桶组成的循环队列...
  • 本文讲述了Python使用pip安装报错:is not a supported wheel on this platform的解决方法。分享给大家供大家参考,具体如下: 可能的原因1:安装的不是对应python版本的库,下载的库名中cp27代表python2.7,其它同理...
  • Muduo 网络编程示例之八:Timing wheel 踢掉空闲连接 陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice t.sina.com.cn/giantchen 这是《Muduo 网络编程示例》系列的第八篇文章,原计划讲文件传输,这里...
  • 谷歌控制台 提示: [Violation] Added non-passive event listener to a scroll-blocking 'mousewheel' event. Consider marking event handler as 'passive' to make the page more responsive 翻译 违反:没有添加...
  • [Violation] Added non-passive event listener to a scroll-blocking ‘mousewheel’ event. Consider marking event handler as ‘passive’ to make the page more responsive. 翻译过来如下: 违反:没有添加...
  • Recycle View 文档翻译, 正好用到, 详细学习下;
  • 在基于 Element-ui 写项目的时候...[Violation] Added non-passive event listener to a scroll-blocking 'mousewheel' event. Consider marking event handler as 'passive' to make the page more responsive. ...
  • 最近学习UE4的使用,发现这篇官方文档没有中文翻译,就想着翻译一下给大家参考参考吧。由于水平有限,里面一些翻译掺杂了我个人的理解,如果有任何问题欢迎提出,我会及时修改的~同时这里需要声明一点,官方的中文...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,517
精华内容 2,206
关键字:

wheel翻译