simpleplanes吧 关注:1,213贴子:4,485
  • 18回复贴,共1

Funky Tree教程 【原作者:黑旋风灭蚊剂】

只看楼主收藏回复

一,首先说说飞行数据,也就是在游戏中检测到的数据:
Altitude ——离海平面高度(m)
AltitudeAgl ——离地高度(m)
GS ——飞机地速(m/s)
IAS ——飞机空速(m/s)
TAS ——飞机真空速(m/s)
Fuel ——剩余油量(百分比)
AngleOfAttack ——攻角(速度向量在左右对称面上的投影与正前方的夹角,-180到180)(度)
AngleOfSlip ——侧滑角(速度向量在机翼面上与正前方的夹角,-180到180)(度)
PitchAngle ——飞机的俯仰角(度)
RollAngle ——飞机的翻滚角(度)
Heading ——飞机的航向(度)
Time ——时间(秒)重生时清零
pi ——圆周率
e ——自然常数e
true ——真(input里是1)
false ——假(input里是-1)
GForce ——加速度(过载,标量,g)
VerticalG ——上面的垂直分量(g)
ammo(“武器的名字”) ——能返回该名称武器剩余携带数量值(枪8行)
ammo(SelectedWeapon) ——能返回当前选取武器剩余携带数量值
GearDown ——放下起落架
Latitude ——纬度(水平坐标系的Y或X)(m)
Longitude ——经度(水平坐标系的X或Y)(m)
PitchRate ——俯仰角速度(度)
RollRate ——翻滚角速度(度)
YawRate ——偏航角速度(度)


IP属地:天津1楼2020-08-10 23:33回复
    对了,三个角速度会受驾驶舱大小影响,驾驶舱每缩小多少比例角速度会增大几个比例


    IP属地:天津2楼2020-08-10 23:33
    收起回复
      2025-05-15 01:10:45
      广告
      二、数学运算符与逻辑运算符(注意中英文输入)
      数学运算符无非就是四则运算符:加:+ ;减:- ;乘:* ;除:/ ;
      逻辑运算符就是初高中都学过的:大于:> ;大于等于:>= ;等于:= ;小于等于:<= ;小于:< ;与(且): & ; 或:| ;还有三元运算:A?B:C ——按照格式,A为判断量,满足时执行B段,不满足则C段(段内ABC 是从右往左开始运算);
      还有就是限制优先级的符号:() ——小括号;
      优先级,也就是一串东西先算什么,由高到低:
      1、优先级最高的就是小括号(),一先把小括号内的数算完再执行其他的,并排的小括号间是从左往右;
      2、乘法*,除法/ ,从左往右依次运算;
      3、加法+,减法- ,也是从左往右;
      4、大于>,大于等于>=,等于=,小于等于<=,小于<,之间也是从左往右;
      5、与&;
      6、或|;
      7、三元运算A?B:C ,优先度最低;


      IP属地:天津3楼2020-08-10 23:34
      收起回复
        三、各种数学函数
        abs(x) ——绝对值,x可以是飞行数据也可以是常数,由于绝对值比较常见所以就不举例介绍了
        ceil(x) ——往正方向取整,正数小数点后面有值就直接进一,负数去掉小数。举例:ceil(Throttle) ——只要油门不为零则输出1。
        floor(x) ——往负方向取整,正数去掉小数,负数小数点后有值则进一。举例:floor(Throttle) ——满油门输出1。
        round(x) ——正经的四舍五入,现实常用所以不举例。
        clamp(x,min,max) ——x小于min时输出为min,大于max时输出为max,只有x在区间内时输出才是x。举例:clamp(Roll+Pitch,-1,1) ——用在机翼的转轴上时可以限制机翼转动的最大角度不会受叠加影响。
        clamp01(x) ——上面那条的min取0max取1,比较近似所以不举例了,不过与逻辑运算符搭配后用得更多。
        min(a,b) ——a与b两个数谁小输出就是谁,可以当单向约束的clamp用,比如:min(Pitch,0) ——Pitch只有往负方向拉动时才会有输出
        max(a,b) ——a与b两个数谁大输出就是谁,与min类似,就不举例了。
        deltaangle(a,b) ——角b的度数减去角a的度数,当输出角度大于180°时自动变为-180°方向,反之亦然(输出度数,判断一向量在另一向量的哪侧与计算两向量角度差时用;转换坐标系),虽然需要用到时会特别好用但平时用得少所以不举例了。


        IP属地:天津4楼2020-08-10 23:35
        收起回复
          sign(x) ——x的正负号为正时出1(包括零),负时出-1。
          exp(x) ——自然常数e的x次方,单纯数学运算,没有例子。
          pow(x,p) ——x的p次方,也没啥好说的。
          sqrt(x) ——x的平方根
          log(x,p) ——以p为底x的对数
          log10(x) ——就是lg,以10为底x的对数
          sin(x) ——三角函数sin
          cos(x) ——三角函数cos
          tan(x) ——三角函数tan
          asin(x) ——反三角函数arcsin
          acos(x) ——反三角函数arccos
          atan(x) ——反三角函数arctan
          rate(x) ——x相对于时间的导数(变化率)
          sum(x) ——x相对于时间的积分(极短时间段与输入相乘之和)


          IP属地:天津5楼2020-08-10 23:35
          回复
            lerp(a,b,t) ——用t的比例在a和b之间做线性插值(用t在a和b之间做线性差值;参数t限制在0到1之间,当t<=0时返回值为a,当t>=1时返回值为b,当t为0.5时返回值为a到b的中间点)举例:lerp(0,180,Throttle) ——某个转轴按Throttle的比例转动多少度,最大是180度
            lerpangle(a,b,t) ——类似上面,但输入的是度数,且输出会在360°以内跳转(类似repeat或deltaangle)用得比较少。
            lerpunclamped(a,b,t) ——类似上上条,但输出不会限制在a与b之间(可以外插),也就是t不会限制在0到1的范围内
            smoothstep(a,b,t) ——类似于lerp,但在最后进行平滑处理(整段函数都可导且输出值为a到b,t从a到b输出增大)画函数图时就会发现,当t接近零或1时会把拐点的尖点给弄圆滑。
            inverselerp(a,b,x) ——计算在[a,b]范围内产生插值值的线性参数t(与lerp正好相反,该函数是计算出x值在a到b之间(所占比例)的参数)举例:inverselerp(0,280,TAS) ——指针速度表,速度等于280时输出1,也就是快爆表时。
            repeat(x,l) ——循环x值,让他大于0小于l(类似进制的进位,当l为10时只看个位数,比如x=29时输出为9但x=30是输出为0),(另一种说法,每当x大于等于l时减去一个l,x小于0时加一个l)搞数字显示屏时需要用到,且用处很广。举例:repeat(Throttle,1) ——当Throttle不为零时输出,而当满油门时关闭。
            pingpong(x,l) ——当x小于0时反转正负号,当x大于l时变成l-(x-l),相当于乒乓球在两面墙之间来回弹(匀速往返)[步行机常用]细节上的详细讲解在步行机帖子有说,例子那边也有。


            IP属地:天津6楼2020-08-10 23:35
            回复
              smooth(x,rate) ——使x的变化率不大于rate,举例:clamp01(smooth(LandingGear*2,1)-1) ——延时启动某转轴
              PID(target,current,P,I,D) ——pid控制,复杂控制的一种,target是目标值,current是当前值,P是比例,I是积分,D是微分,简飞玩车的人多,拿悬挂当例子target就是期望的底盘与地面距离,current就是目前地盘与地面的距离,P可以说是弹簧强度,设定的值越大、target与current的差越大,弹力就越大。D就是阻尼,限制了弹簧伸长的速度,增加平稳性,但太大了会让悬挂反应变慢。而I就是消除静差,也就是加上液压,当车里坐了一个大胖子,底盘想必会下降,这时候没理由换个更硬的弹簧,毕竟已经装好了,这时候用液压活塞也就是I来使底盘上升就可以弥补这段差值,但I不宜过大,因为PID的I是只要目标与当前不一样时少多少就加多少,如果调大了可能会加剧晃动。举个例子:PID(15,AltitudeAgl,1,0.01,0.6) ——某个悬浮车的悬浮系统设定了悬浮高度是15m,必须装载在某个可以正面影响离地高度的元件,比如向着地面的涡扇发动机,道理很简单,如果装载在不会影响current的元件上输出是多少都没什么用。


              IP属地:天津7楼2020-08-10 23:36
              回复
                四、一般格式
                对于简单控制,比如满足什么条件时执行什么动作,比如离地低于多少时打开起落架(转轴做的),高于时收回:
                clamp01(AltitudeAgl>=300)*1 ——这里边的“AltitudeAgl>=300”就是判断(开关),但大于等于时也就是满足输出是1,但小于也就是不满足时输出是-1,所以得用clamp01括住把-1变为零。当条件不满足时不输出后面的值1(动作),也就是input输出0,此时转轴没有动作,起落架是放下的就是放下,当条件满足时,“AltitudeAgl>=300”输出是1,此时1*(动作)也就是执行动作本身了,例子里的动作就是1(可以略去),此时转轴开始转动,收起起落架。
                一般格式就是clamp01(开关)*(动作) ;或直接把开关写在激活组栏。


                IP属地:天津8楼2020-08-10 23:36
                回复
                  2025-05-15 01:04:45
                  广告
                  五、其他常用函数(省时间原理就不说了)
                  水稳(只能在平地用版本):sum(Yaw*60-clamp01(rate(Heading)<720)*rate(Heading))/设定的角度 转轴
                  延时启动:clamp01(smooth(2*clamp01(x),1)-1) 转轴,x为按键
                  延时关闭:clamp01(smooth(2*clamp01(x),1)) 转轴,x为按键
                  某飞控:PID(Pitch*20,AngleOfAttack,1,0.02,0.5) 转轴,与机翼相连
                  四分三圆指针表:inverselerp(min,max,x)*720/设定的角度 min为表的最小值max为表的最大值,x为要显示的数据
                  整圆指针表:x/每圈的数值*360/设定的角度 转轴
                  转速表:clamp01(发动机开关)*(sin(Time*(1+abs(Pitch))*810)*(0.22-abs(Pitch)*0.1)+abs(Pitch*0.8)+0.15)*最大角度/设定角度 式中的0.15是怠速速时的指示值,0.8是前进时加的值,可适当调整。
                  单激活组多用:a=repeat(sum(rate(abs(clamp01(开关)))),x) a就是按下多少次某激活组按钮多少次后激活,x是按下第几次后清零。
                  选定某武器后激活元件(比如炮,但有bug):ammo(SelectedWeapon)=ammo(“武器的名字”) 写在激活组
                  其他的想到再补充


                  IP属地:天津9楼2020-08-10 23:36
                  收起回复
                    好!


                    IP属地:中国澳门来自Android客户端10楼2020-08-11 00:06
                    回复