作者:Akagi_Zen

修订日志

2026.2.24——修订完成 “一:流程控制 program flow”。

2026.2.25——修订完成 “二:运算符 operators”。

2026.2.26——修订至 “三:控制指令 Craft Instructions” - “9:设置摄像机参数 set camera [ ] to ( )”

2026.2.28——修订至“四:信息指令 Craft Information” - “6:导航信息 nav [ ]”

壹 基本介绍

Vizzy 是一个可视化的编程系统,相较于其他编程引擎有跟高的可读性,但是效率欠佳,总的来讲凑合可用,而且对于这个游戏里来讲已经完全够用了。

Vizzy 不仅能写在芯片里,同样也可以写在任意一个零件里面。vizzy 只会在玩家操控的飞船的物理距离内运行,如果太远会被优化掉,不用担心,靠近了又会继续运行。

一:基本结构

Vizzy 跟其他编程引擎类似,自上而下依次运行,只是更加直观和便利,它没有严格点的格式要求,在菜单栏里有很多模块,可以被拖出来链接到对应的地方。

效果如图此类型的模块都可以上下串联起来,并依次运行

二:程序的运行

待附图

貳 翻译及注释

在 Vizzy 中可以被执行的程序和数据被称为模块,可以拖动某些,模块使其从上到下排列,系统会根据排列顺序以一定速度依次对模块做出相应的反馈,并进入下一个模块直到 结束,以此来完成用户所编辑的vizzy程序

一:流程控制 program flow

此目录下的模块可以连接原本独立的模块片段而形成一个连续完整的模块,更好的使用能帮你完成更大更复杂的模块组。

1:定时等待 wait ( ) seconds

如图,在 wait( )seconds 上面的模块运行完毕后,等待( )秒,再开始运行下一个模块片段,如果上面的模块没有完成运行,则不激活。

定时操作下的一秒并非现实世界的一秒,会受到游戏程序运行物理帧影响。

注:假设游戏运行默认物理帧为60帧/s,即每秒进行60次物理模拟。在帧数稳定时游戏内1秒和现实1秒几乎没有区别,因为游戏内置计时器直接假定模拟执行60次即为1秒。在出现明显掉帧时,物理帧会下降(注意,物理帧和玩家看到的渲染帧不完全一样,但是物理帧大多数时候不会高于渲染帧,所以画面出现掉帧时物理帧绝大多数情况也都会降低),例如降低到了30帧/s,那么完成60次运算就需要现实里的2s,这会导致游戏内定时操作将在现实里延迟1s。由于大多情况物理帧不会降低太多,所以影响很小但不可忽视。同时需要注意,在执行时间加速(Time Warp)的时候,物理帧会大量降低,可能导致严重错误。

2:条件等待 wait until < >

等待直到菱形方框内执行或达成则开始运下一行模块

例:wait until <AGL≦5000>,意思就是等到距地面高度小于等于 5000m 时,运行下一步

注:如果未达成 wait until < >里面的条件后面的模块是无法执行的,即使后面的判定是达成的

3:重复 repeat ( )

可以在( )内填入需要重复的次数X,此模块段所包含的模块将会运行X次,重复完成后会自动跳出循环。

4:条件循环 while < >

当< >为真命题时无限循环运行所包含的模块,直到< >内不再为真命题才会中断,如< >为否命题则直接跳过此模块和所有包含的子模块直接运行下面的模块

例:while <AGL≦5000>,意思是,在距离地面高度小于等于 5000m 时,始终运行该模块段内的所有模块。使用while <true>可以实现无限循环。所有时候都可以使用 break 退出循环。

5:计数循环 for (i) from (A) to (B) by (C)

此模块将通过 by 后面的数字或公式运算来对变量 i 进行操作,每进行一次操作,该模块段内的模块便会被依次执行一次,然后重复对变量 i 进行操作,直到变量 i 大于等于数 B,完成后会自动跳出循环,执行下面的模块。变量 i 的值不会超过数 B,即使最后一次计算变量 i 暂时超出了数 B,在完成该程序块是变量 i 的值会被赋值成数 B。

注:数值不能存在明显错误,如变量 i 的初始值设置为1,公式 C 设置为-1,数 B 设置为10,由于变量 i 永远无法通过 -1 运算来得到数 B 的值,程序会停止运行,并不会无限循环。

6:条件判断 if < > then

与 while 类似,只有< >为真命题时才运行被包涵的模块,若为假命题则直接跳过以及被包涵的模块直接运行下面的模块,和 while 不同的是此模块只会运行一次判断。

如果< >内条件达成,则运行包含的模块,完成后自动跳出循环运行下面的模块。

7:否则判断/追加条件判断 else if < > then

与 if < > then 性质相同且相反,当满足< >条件时,跳过此模块段,反之则运行包含的模块。

8:否则执行 else

此模块需要和 if < > then 或 else if < > then 连用,达到和以上模块相反的效果,其他性质一致,如以上模块条件达成则自动跳过 else 模块段,反之则执行 else 程序段。

注:必须连用,且不能间隔。

9:文本输出 display ( )

可以显示文字或者数字,( ) 内可以直接填写文字,填入矢量模块会显示矢量 (x,y,z),也可以填入计算公式如 (1)+(1) 等,如果公式有错会显示 NaN 意思是No a number,表示结果非法或未定义。

注:NaN 不等于任何值,包括它自己,也无法正常参与计算。

10:日志输出 log ( )

log( ) 可以将 ( ) 内变量的值记录在 View Log 里,方便查看某一时刻的数值。

11:跳出循环 break

image-nSxa.png

该模块被执行时,将会中断所有包含他的循环,直接执行最外层循环以下的模块。

注:Vizzy语言使用的应该是执行栈模式,不同于常见的如C++使用的地址表跳转,Vizzy多层嵌套的循环程序会被视为一整个循环栈,而break就是栈中断,会中断整个循环栈。(该部分内容为编者推测,可以解释结果,但是不代表完全正确)

12:注释 # ( )

该模块不会运行,也不参与运行,可以将它放在任何位置用于记录任何东西,包括但不限于程序注解、笔记、批注。

注:正版游戏不支持任何的中文文本。

二:运算符 operators

这些模块包括了几乎所有的运算符号,可以进行几乎所有的物理学运算,让你可以用 Vizzy 完成玩家几乎不可能完成的任务。

1:基础运算

/是除,^是次方,%是取余(N%D)就是将N 分解为如下两部分之和,N=k*D+R 其中 R 就是余数。

2:随机运算 random ( ) to ( )

image-YiFn.png

随机的数几乎不可能是整数。

注:矢量不可用。

3:最小/大值运算 min/max ( ) and ( )

取的是两个 ( ) 内的其中一个值。

注:矢量不可用。

4:和/或运算 ( ) and/or ( )

注意包含关系,vizzy 会首先判断最内的模块。

5:否运算 not ( )

当圆框内为否命题时整个(not( ))输出为真命题。

6:等于运算 ( ) = ( )

“=”不仅可以用于数学,还可以用于逻辑判断。

例:(part (0) Activited) =(ture),的意思就 id 为 0 的部分(零件)的活动(开关)为是(开),则整个等于模块输出为真命题。

注:由于游戏系统限制,程序刷新速度有限,如在游戏中 (AGL) = (1000) 的情况可能很难实现,因为上一次运算可能是999.9下一次运算就是1000.5了。

7:比较运算

简单的大于/小于/大于等于/小于等于运算,如果满足大小条件则为真命题。

8:函数运算 [ ] of ( )

(1):abs 绝对值。

(2):floor 取小于这个数的整数,也就是直接去掉小数点。

(3):ceiling 取大于这个数的整数,直接去掉小数点再加一。

(4):round 四舍五入去整数。

(5):sqrt 算数平方根。

(6):sin cos tan 三角函数,输入为弧度制输出为三角函数值的大小,如现有的是角度需要先转化为弧度制。

(7):asin acos stan 反三角函数,和(6,7,8)相反,输入为三角函数值输出为弧度制。

(8):ln 自然对数。

(9):log 以 10 为底数的对数。

(10):deg2rad 角度制转弧度制。

(11):rad2deg 弧度制转角度制,两个不要记反了。

9:反三角函数 atan2 of (y) and (x)

 用来计算从 X 轴正方向到向量 (x, y) 的夹角,可以用来计算航向角和目标方向。

注:atan2模块输出的是α的弧度,结合上面函数运算的 rad2deg 便可得到相应的角度

注:不同与atan,atan2不直接做除法,可以自动判断象限,可以处理 x = 0 的情况,可以返回完整的 -π ~ π 范围。数学上,atan2是反正切函数的改进形式。atan和atan2的区别如图。

10:条件分支结构 if < > then ( ) else ( )

如果 < > 内的命题为真则输出为第一个 ( ),如果 < > 为假命题则输出为后一个 ( ) ,( ) 里可以可以填写 true 或者 false。

11:字符串拼接 join (alpha) (bravo)

可以拼接文本,将前后两个文本组成一个无空格的整体,如图输出的便是“alphabravo”,由于无法输入单独的空格所以只能用英文负号隔开。可以用回车键换行,支持富文字。

12:长度获取 length of ( )

获得输入字符的长度,如输入 (1,1,1) 输出的不是 3,而是 7 因 为有 7 个字符。

13:按位取字符 letter ( ) of ( )

前一个 ( ) 输入位号,后一个 ( ) 输入文本,模块的作用是获得文本的第X位的字符。如图,输出就是字母“a”。

14:字符串截取 letter from ( ) to ( ) fo ( )

同 按位取字符,输出文本从第X位到第Y位的字符。如图,输出为字符串“lph”。

15:包含判断 ( ) contains ( )

如后面的框内包含前面文本的字符则输出为真命题,反之为假命题。

16:格式化字符串 format ( ) ( )

(1):{0:n1},普通数字格式,四舍五入。n = number,1 = 保留 1 位小数。如1234.567 - 1234.6

(2):{0:e1},科学计数法。e = exponential,1 = 保留 1 位小数。如123456 - 1.2e+005。

(3):{0:f2},固定小数格式。f = fixed,2 = 两位小数。

(4):{0:p1},百分比。

(5):{0:n0},保留整数。

注:(3)-(5)理论上可行,但是目前没有经过验证。

17:友好显示 friendly [ ] ( )

以对用户友好的方式表示这个数,即给这个数字添加单位。

(1):Acceleration,加速度,m/s²

(2):Angle Velocity,角速度,rad/s

(3):density,大气密度,kg/m³

(4):distance,离目标的距离,m

(5):energy,能量,j

(6):force,力,N

(7):specific impulse,比冲,S

(8):Mass,质量,kg

(9):Power,电量,W

(10):pressure,气压,Pa

(11):Temperature,温度,k

(12):time,时间,s

(13):Velocity,速度,m/s

18:向量构造 vec ( ) ( ) ( )

将标量转化为矢量,图中三个空位分别对应 xyz,如图将创建矢量 (0,0,0)

19:矢量处理

对矢量进行处理。

(1):X,Y,Z 分别是选取矢量的第一个,第二个和第三个。

(2):length 模长。

(3):norm 取同方向上的单位长度,即模长等于 1。

20:矢量计算

进行矢量计算。

(1):angle,夹角,计算两个向量之间的夹角,以角度制输出浮点数,范围 0-180。

(2):clamp,限制限制前面括号内矢量的模长不超过后面的值,在前面函数内填入矢量 (x,y,z) ,在后面的 (a) 内填入模长,若矢量模长大于后面的值输出的则是模长为 a的和 (x,y,z) 同向的矢量,若小于则输出本身,后面的括号内只能填纯数字。

(3):cross,叉乘,计算两个向量的叉积。

(4):dot,点乘,计算两个向量的点积。

(5):dist,距离,计算两个空间坐标之间的距离。

(6):min/mix,输出最小/大值 。

(7):project,投影,计算将向量 A 投影到向量 B 上的长度。

(8):scale,比例缩放,将向量按比例缩放。

21:表达式求值 funk ( )

表达式求值,用于在运行时解析并计算文本形式的表达式,常用于扩展输入能力。如从 ag 1~10 和下面 input 模块的内容扩展到具体数学运算和你在零件 input 选项里见到的那些东西。

使用此函数注意两点:

(1):后面括号内只能填入纯文本,但函数本身会对文本内容进行计算并输出。比如:set slider1 to funk (0.1+0.2+0.3),运行时程序会对文本 (0.1+0.2+0.3) 进行计算得到 0.6,然后把 slider1 设置为 0.6。

(2):此函数只是拓展了动作的输入范围,相当于一个数据接口。实际运行时还是以零件的 input 选项的内容为准。

22:真假命题 True/False

即直接输出真/假命题,可用于无限循环等。

三:控制指令 Craft Instructions

这些模块将会帮助你控制你的载具,以让你的载具更好的在太空中遨游,他们能精确的控制每一个零件,做到比手动更灵活和迅速的操作。

1:执行分级 activate stage

在激活该模块的时候,会自动执行最下层的分级。

若该模块是在部件的飞行程序中运行的,而执行分级后该部件与上级分离,设置在该部件上的飞行程序将会停止运行。

例:

如图,该程序被附加在引擎部件上。进入发射状态,计时5s后,引擎推力设置为100%,再计时5s后执 行分级,而该分级的作用是分离引擎,由于引擎与上级部件分离,程序自动停止运行,因此后续的计时2s和设定引擎推力为0%的操作不会执行。

2:设置控制滑条 set [ ] to ( )

设置选定滑条的值,可设置区间为 -1~1,对应游戏内表示则是 -100%~100%。

(1)roll 旋转

对应的是“Translation Mode Disabled 姿态控制模式”下,右摇杆的左和右,即以沿着载具向前的方向为轴旋转。

(2)pitch 俯仰

对应的是“Translation Mode Disabled 姿态控制模式”下,右摇杆的上和下,即沿着载具向前的方向俯仰。

(3)Yaw 偏航

对应的是“Translation Mode Disabled 姿态控制模式”下,左摇杆的对左和右,即沿着载具向前的方向水平偏转。

(4)throttle 节流阀

对应的是平面左端的黄色滑条或“Translation Mode Disabled 姿态控制模式”下,左摇杆的上和下,可直接控制所有已激活的、有正确种类燃料可用的引擎的油门大小。

(5)brake 刹车

对应的是“Translation Mode Disabled 姿态控制模式”下左摇杆的上和下,可控制轮子的刹车、有反推装置的涡轮引擎的反推。

注:需要在节流阀为0的时候 brake 才会被激活且产生读数。

(6)slider 1、2、3、4

用于操作玩家自行定义的 slider 1-4,若未定义则没有作用。

(7)translate Forward 平移向前

对应的是“Translation Mode Disabled 姿态控制模式”下右摇杆的上和下,即以沿着载具向前的方向为轴前后移动。

(8)translate right 平移向前

对应的是“Translation Mode Disabled 姿态控制模式”下左摇杆的左和右,即载具水平左右移动。

(9)translate up 水平向上

对应的是“Translation Mode Disabled 姿态控制模式”下左摇杆的左和右,即载具上下垂直移动。

(10)translate mode

设置载具控制模式。0为"Translation Mode Disabled",即姿态控制模式;1为"Translation Mode Enabled",即平移控制模式。

注:在某些版本中,如不使用平移控制模式, RCS 将不响应 Vizzy 输出的操作指令。

3:设置载具姿态 set craft [ ] to ( )

image-BEPu.png

指定载具的俯仰/航向角。

注:此处只涉及 pitch 和 heading,PID控制请查看后文程序实例。

该模块讲自动为你打开“Locked Current Heading 锁定当前航向”并自动为你调整 pitch 和 yaw,以使你的载具到达预定朝向,且不会调整roll。

4:设置目标对象 target node (name)

该模块激活后,将为你在屏幕上用白色框标出目标载具的位置和距离

5:设置动作组状态 Set activation group ( ) to ( )

在该模块前面的 ( ) 里填入动作组的序号X,游戏内默认是 1~10,但是可以在 xml 中设置更多。在后面的 ( ) 里填写 0 或 1,表示 false 或 true,即控制动作组 X 是/否被激活。

6:锁定航向模式 lock heading on [ ]

该模块可以自动控制 pitch 和 yaw 以使你的载具达到 [ ] 内所设置模式的目标,不保证 roll 是否正常。

(1):none,无锁定。关闭自动姿态控制,载具不主动调整姿态,同时动量轮,指令仓,矢量喷口也不会工作,载具将会随受力情况沿重心自由转动。

(2):prograde,速度顺向。将载具指向速度矢量的正方向。

(3):retrograde,速度逆向,将载具指向速度矢量的负方向。

(4):Target,指向目标。载具将指向所设置的目标,若未设置目标则视为无锁定模式。

(5):BurnNode,指向机动点。载具将指向所设置的机动节点,若未设置机动节点则则视为无锁定模式。

(6):current,姿态保持。载具将自动维持模块激活时的飞行姿态。

7:按向量锁定航向 lock Heading on vector (x,y,x)

在 ( ) 内输入一个方向向量,载具将自动指向该向量的方向。

注:该向量始终以载具本身为坐标原点,XYZ轴同世界坐标轴。该向量仅代表方向,例如(0,0,1)、(0,0,10)、(0,0,100)三个向量代表同一个方向,(1,2,1)、(2,4,2)、(30,60,130)三个向量代表的同一个方向。具体请参考方向向量_百度百科

8:设置时间模式 set time mode to [ ]

改变游戏全局时间流速,对所有载具都生效。在不同的时间模式下,载具的受力情况不发生改变,但由于物理帧减少,会出现对应问题。

1):paused,暂停。在此暂停下 Vizzy 也会停止。

(2):SlowMotion,慢动作。

(3):normal,正常。

(4):fastForward,快进。

(5):timeWarp1-10,时间加速(Time Warp)。

9:设置摄像机参数 set camera [ ] to ( )

控制玩家的摄像机。

(1):x rotation,x 轴旋转。改变摄像机绕 X 轴旋转角度,类似上下抬头/低头,单位:度。

(2):y rotation,y 轴旋转。摄像机水平旋转,围绕载具转动,单位:度。

(3):tilt,倾斜。摄像机画面倾斜,单位:度。

(4):zoom,变焦。改变观察距离,单位:米。

(5):camera mode,相机模式。切换观察模式。不同版本支持的模式名不同,常见如:chase、orbit、cockpit、map,注意必须填正确字符串。

(6):camera lndex,摄像机索引。通过指定摄像头序号,来切换到对应的摄像机部件,可用于实现类似多摄像机系统的操作。

10:设置零件属性 set part ( ) [ ] to ( )

image-vZjg.png

精确设置某一个部件的属性,在前面的括号里填入部件的数字ID,不可以填入零件名称。

(1):activated,激活。在后面的括号内填入 true 或 false,以表示激活与否。

(2):name,名称。改变部件的名称,后面填入需要改变成的名字。

(3):explode,爆炸。使填入的部件爆炸,后面的括号内填入爆炸等级,0-1 表示 0-100%,数字超过1,但实际效果最高100%,填入 true 等同于1。

11:切换控制载具 switch to craft ( )

将玩家切换到指定ID的载具。

12:蜂鸣器控制 beep (1000) Hzat (1) volumefor (2) seconds

用于在当前零件位置播放指定频率、大小、时长的声音。如图设置,将发出 (1000) 赫兹,声音大小为 (1) 的哔哔声,持续 (2) 秒。

注:此模块发出的声音源自于运行该 Vizzy 程序的零件位置。

13:频率设定 frequency of (C#) octave (3)

此模块是 Juno 里“音符转频率”的接口,用于返回该音符对应的频率,比直接填 Hz 更直观。如图就是返回音符为C#、八度为3的频率。

注:常见的音符有:C、C#、D、D#、E、F、F#、G、G#、A、A#、B。八度 (octave) 表示音高层级。数字越大,音调越高,每增加 1 个八度,频率翻倍。如同样为A音,八度为4,时,频率为440Hz,而八度为5时,频率880Hz。

四:信息指令 Craft Information

这些模块将输出模块所在的整体的相应信息,可以使用这些信息进行计算,从而得到有用的参数。

1:高度信息 altitude [ ]

image-ZIfl.png

以米为单位输出对应的高度,

(1):AGL 相对于地面的高度

(2):ASL 相对于海平面的高度

2:轨道信息 orbit [ ]

这个模块将会根据飞船相对于母星的运动状况输出对应的有关于轨道的数值

(1):apoapsis,远拱点

(2):periapsis,近拱点

注:在未形成绕天体轨道时,PE点将不会显示,模块输出为 NaN。

(3):time to apoapsis,到达远拱点的时间。

(4):time to periapsis,到达近拱点的时间。

(5):eccentricity,离心率。显示轨道的离心率,输出值为 0-1。

(6):inclination,轨道倾角,轨道平面相对于主天体赤道平面的夹角。

(7):period,轨道周期,完成一圈轨道所需的时间,单位:秒。

3:大气信息 atmosphere [ ]

(1)air density,空气密度,单位:kg/m³。

(2):air pressure,气体压强,单位:Pa。

(3):speed of sound,音速,即马赫数,单位:m/s。

(4):temperature,温度,单位:K。

4:性能信息 performance [ ]

飞船有关性能的信息

(1):Engine thrust,当前推力。当前正在工作的发动机的推力之和。

注:若发动机安装存在夹角,实际推力会是各发动机推力的矢量和,小于模块输出的理论值。

(2):Mass,质量,载具此刻的总质量。

(3):Dry mass,干重,不包含燃料的载具质量,若修改了 .xml 文件,干重可能出现负数。

(4):Fuel mass,燃料质量,当前载具携带的燃料质量,燃料质量主要由燃料容量与当前剩余量决定,不会随着 .xml 文件的修改而改变,

(5):Max Engine thrust,最大可用推力,当前已激活的全部引擎在当前环境下可提供的推力之和,不会排除因缺少燃料而停机的已激活引擎。

注:若发动机安装存在夹角,实际推力会是各发动机推力的矢量和,小于模块输出的理论值。若是涡轮引擎,则是显示在当前高度和速度下的引擎推力。

(6):TWR 推重比,载具推力和质量的比值,决定了在某重力环境下载具能获得的“净加速度”水平。

(7):Current Isp,当前比冲,发动机在当前环境下的比冲。

(8):Stage Delta-V,仅用当前阶段可用燃料 + 当前阶段参与的发动机,理论上能提供的速度变化量。

注:这是理想计算:不包含空气阻力、重力损失、姿态偏差等现实损耗。

(9):Stage burn time,当前阶段所打开的引擎燃烧时间,当前阶段所打开的引擎满载的燃烧时间,会随节流阀的大小和大气情况产生变化。

5:燃料信息 fuel [ ]

以百分百的形式输出剩余所选单位的值

(1):Battery,电量,当前载具剩余的电能储量。

(2):Stage,阶段燃料百分比,当前分级剩余可用燃料的百分比。

(3):Mono,单组元推进剂,当前载具剩余的单组元推进剂储量。

(4):Allstages,所有阶段燃料比例,统计整个载具所有剩余燃料的总体百分比,若将所有空燃料箱分离,值将回到 100%

6:导航信息 nav [ ]

此模块包含有关于载具运动的信息,此模块输出为关于正在操作的飞船的质心关于所在行星的 PCI 坐标,xyz 分开几乎没有意义。

(1):position,位置坐标,载具相对于主天体中心的三维坐标向量,表示载具在太空中的绝对位置。

(2):Target position,目标坐标,当前目标载具相对于主天体中心的三维坐标向量,表示目标载具在太空中的绝对位置。

(3):heading,航向角,输出的是 0~360 度,表示载具在水平面内的运动方向角,0 度对应北面。

(4):pitch,俯仰角,载具相对于水平面的仰角,垂直于地面向上为+90 度,垂直于地面向下为-90 度。

(5):bank angle,滚转角,载具绕自身前进轴旋转的角度,本质上是 Roll 的物理角度表现。

(6):angle of attack,攻角,载具机头方向与空气相对速度方向的夹角。

(7):side slip,侧滑角,载具横轴方向与空气速度方向之间的夹角。

(8):north,北方向向量。

(9):east,东方向向量。

(10):craft roll/pitch/yaw axis,载具姿态轴向量,描述载具自身三个旋转轴方向的单位向量。以载具的原点位坐标原点,方向跟指令舱或者芯片的方向没有关系,若默认芯片为 rocket,在游戏开始时确定 roll 的方向就为垂直向上,此后随载具的运动而改变。

7:速度信息 velocity[ ]

载具有关速度的信息

(1):surface 表面的

这是相对于母星地面的速度(PCI 矢量)

(2):orbit 轨道的

这是当前的轨道的线速度(PCI 矢量)

(3):target 目标的

这是目标的地表速度,不是和目标的相对速度(PCI 矢量)

(4):gravity 重力的

相对当前母星的重力加速度,不是母星的表面的重力加速度,此模块的输出是实时计算的(PCI 矢量)

(5):acceleration 加速度

当前受力情况产生的加速度,包括重力加速度(PCI 矢量)

(6)   :angular 角速度

载具自旋的角速度,不是轨道的角速度,xyz 分别对应 pitch yaw roll(PCI 矢量)

(7)   :lateral 水平的

平行于地面的速度分量(纯数字)

(8):Vertical 竖直的

垂直于地面的速度分量(纯数字)


(9):munch number 马赫数

相对母星地面的速度的马赫数,声速会随空气密度变化而变化(纯数字)

8:输入状态 input [ ]

得到滑条的值,输出 1~-1,与 set 同理

(1):roll (旋转)对应的是“Translation Mode Disabled 禁用平移模式”下右摇杆的左和右,可以沿着载具向前的方向为轴旋转

(2):pitch (俯仰)对应的是“Translation Mode Disabled 禁用平移模式”下右摇杆的上和下,可以沿着载具向前的方向俯仰

(3):Yaw (偏航)对应的是“Translation Mode Disabled 禁用平移模式”下左摇杆的对左和右,可以沿着载具向前的方向水平偏转

(4):throttle 节流阀(油门)对应的是平面左端的黄色滑条或“Translation Mode Disabled禁用平移模式”下左摇杆的上和下,可以直接控制所开启的有油的油带正确的引擎的油门

(5):brake (刹车)对应的是“Translation Mode Disabled 禁用平移模式”下左摇杆的上和下,但是需要在 throttle 为零的时候 brake 才会有读数,brake 可以控制轮子的刹车和有反推的涡轮引擎的反推

(6):slider 1;slider 2 (滑条 1.2)这是提给玩家自愿发挥的滑条,可以在创造中调整零件的滑条

(7):translate Forward (平移向前)对应的是“Translation Mode Disabled 启用平移模式”下右摇杆的上和下,可以沿着载具向前的方向前进和后退

(8):translate right (平移向前)对应的是“Translation Mode Disabled 启用平移模式”下左摇杆的左和右,可以沿着载具向左和向右

(9):translate up (水平向上)对应的是“Translation Mode Disabled 启用平移模式”下左摇杆的左和右,可以沿着载具向上和向下

(10):translate mode (平移模式)这不是滑条,填入哈希值,表示禁用或启用false 或

true 在某些版本中如不打开平移模式rcs 将不响应vizzy 所定义的

9:其他信息 misc[ ]

判定载具的飞行状况

(1):stage (阶段)当前的阶段数,游戏开始时为 0

(2):nus stage 阶段总数

(3):grounded (触地的)输出为 false 或 true,触地则为真命题,输出为true

(4):solar radiation 太阳辐射

10:其他信息 time [ ]

以秒为单位输出相应的时间

(1):frame delta time

(2):time since launch (发射后的时间)以秒为单位,输出距离第一次点火的时间

(3):total time (总时间)从开始游戏到现在的时间

11:时间信息 name of [ ]


以文字的格式输出[ ]的名字

(1):craft 载具

(2):planet 星球

载具所在引力范围内的星球

(3):target name 目标载具名称

(4):target planet 目标星球的名字

12:动作组状态 activation group ( 1 )

在后面的括号内填入动作组序号,当动作组被激活此模块输出为真命题,反之亦然,在判定的模块中的 < > 内不用填写“activation group=true”,因为当动作组被激活时此模块输出的就已经是“true”了。

13:坐标转经纬 convert ( ) to lat/long/AGL

在 ( ) 内填入坐标矢量“position”,此模块将会以角度的形式输出所在引力范围内的星球的“lat/long”经纬,和以米为单位输出高度,海平面高度为 0,最终输出的格式为( 精度,维度,高度),的一个带括号的矢量

14:经纬转坐标 convert ( ) to position

在 ( ) 内填入经纬度和高度,将输出相应的 PCI 坐标,图像意义是星球球心到所填的经纬地度表示的位置的连线

15:经纬地形查询 get terrain [ ] at lat/long ( )

在 ( ) 内填入经纬坐标,输出的是载具所在引力范围内的行星的信息,三为坐标将会自动省略最后一个。

(1):height(高度)以米为单位输出海拔高度

(2):color(颜色)以十六进制色的形式输出地表的颜色

16:天体信息 planet ( ) [ ]

以正确的格式输出行星的信息

(1):Mass 质量,单位 kg

(2):Radius 半径,单位 m

(3):atmosphere height 大气高度,单位 m

(4):solar position 太阳坐标

以太阳为母星的矢量坐标,图像意义是一个连接太阳和行星的连线

(5):Child planets 卫星名字

以文字的格式输出行星的卫星的名

(6):Crafts 载具

以列表的形式输出引力范围内的载具的名字

(6):crafts IDs 载具 ID

以列表的形式输出引力范围内的载具的ID

(7):parent 母星

以文字的格式输出行星的母星的名字

17:零件信息 part ( ) [ ]

在( )内填入零件的ID,无法识别名称

(1):mass 质量

以 kg 为单位输出零件质量,包括燃料

(2):activated 开关状态

根据零件是否被打开,输出 false 或 true

(3):part type 零件类型以文字的格式输出零件类型

(4):position 坐标

输出单个零件的 PCI 坐标位置

(5):temperature 温度

以开尔文为单位输出零件的温度

(6-7):min/max part ID    ID 最小/大的同名零件

此模块的 ( ) 内不能直接填写ID 名称,需要插入“part ID of ( )”,在“part ID of ( )”内填入零件名称

(8):under water 在水下的

输出 0-1 以表示零件在水下的百分百

18:零件 ID 查询 part ID of ( ) 

( ) 内填入零件的名称,将输出对应的ID 号码

19:零件状态设置 part ( ) [ ] ( ) 

转化某零件或坐标的坐标系到零件或某坐标,local:本地的,以飞船作为参考系, XYZ 分别表示 yaw,pitch,roll 轴作为坐标轴,PCI:在模块中指相对于母星的 PCI 坐标,图像意义是一个从母星中心到载具零件的连线,只是转化了参考系表示的矢量不变

(1):PCI to local

(2):local to PCI

20:载具信息 craft ( ) [ ]

在( )填入载具 ID,输出载具信息

(1)altitude 海拔高度

(2)destroyed 是否被摧毁的

(3)grounded 触地的


(4):mass 质量

(5):name 名字

(6):part count 零件数量

(7):planet 行星

载具坐在的引力范围内的行星

(8):position 坐标(矢量)

(9):Velocity 速度(矢量)

21:载具 ID 查询 craft ID of ( )


在 ( ) 内填入载具的名字,输出的则为载具的 ID号码

五:events 事件

有关游戏进行的模块

1:on start 在开始的时候


万物的开头,在游戏开始的时候便只激活一次此模块下面的第一个模块

2:on(part)collide with(other)at(Velocity)and(impulse)

当以零件(part)和(other)以(velocity)的速度和(impulse)的冲量撞击


每一次撞击此模块都会激活,并赋予里面的黄色参数新的数值,里面的参数可以被拖动并调用,用法和自定义变量相同。

3:on(part)exploded   当零件(part)爆炸的时候


每一次爆炸就会激活,并刷新变量(part)为零件 ID 4:on(craftA)and(craftB)docked

当飞船 A(craftA)和飞船 B(craft)对接的时候


5:on enter(planet)SOI   进入行星(planet)的引力范围内


进入新的行星轨道便激活一次,刷新参数(planet)为行星名称

6:receive(message)with(date)    收到信息(massage)的时候


当收到特定信息(message)时激活一次,刷新参数(data)为用户所设置的文本或数


7:broadcast(message)with data(0)  在零件里广播(message)和(0)在整个零件里广播,只有此零件内的程序会做出回应

8:broadcast(massage)with data(0)to craft


在整个飞船里广播(message)和(0)

在整个飞船里广播,只有此飞船的零件内的程序会做出回应

9:braadcast (message) with data (0) to nearby crafts


在飞船周围广播 massage 伴随和(0)

可以通过这个模块实现不同载具之间的通信

 

 

 

 

 

 

 

 

六:variables 变量

设置变量以使程序变得更简洁明了,简化重复的运算以优化程序,或做到更多的复杂运算,。

建立变量,选择 variable 部分,点击左下角“create variable”在弹窗中输入变量的名称,或字母或数字只要自己认识,点击“create”完成创建,此时 variable 列表中会出现绿色的变量模块,这个模块可以被插入到( )

修改变量,每一个绿色的变量模块左边有一个笔的标志,表示修改,点击会出现弹窗,

“cancel”:返回 “rename”:重命名 “delete”删除 1:set variable( )to(0)                    设置变量( )为(0)


在第一个( )中填入变量的模块,变量模块将会变成一个输出后面(0)内的数字,或文字的模块,变量在游戏开始的时 by 候默认 0

2:change variable( )by(0)    用(0)改变变量( )


直接在变量( )添加后面的字符,例如“change variable(X)by(0)”假设变量为 0 的

话变量将会变成“00”

3:set variable( )user input(message text....)   用户输入变量( ),文本( )


在前面的括号套入变量模块,后面的(message text...)填入文本,游戏中运行至此将会

出现一个弹窗以让用户输入变量。

 

 

 

 

 

 

七:lists 列表

我们可以把列表理解为集合,首先需要说明四个概念,即列表 list元素(项目)索引

(位置)以及长度 length,我们举一个栗子,有一个班,班里有很多学生,那么我们手上的名单就是列表,名单上的人就是元素,他们的学号或者座位号就是索引,班上的总人数就是列表的长度

设置列表可以方便地对多个对象或者具有对应关系的对象进行处理,或者反过来将需要的数据按一定规则进行存储而不用用户手动记录。目前为止能明确的是列表都是单行。

列表里的元素和索引是一一对应的,列表的本质就是表格,

建立列表,首先选择lists 部分,点击左下方“Create Lists variable”进行创建,在弹出的对话框内填入你想要的列表名称,字母数字都可以,只要自己能认识就行。点击“CREATE”完成创建,创建完成后,列表部分内最下方会出现紫色的列表模块,可以被插入到()。

修改列表名称与上方修改变量名称完全一致。

另外,列表非常友好的一点是,需要填入元素的地方都会写 item,需要拖入列表的地方全部是空的,而填写列表索引的地方全部写上数字 1。,列表的位置(索引处)从 1 开始,到列表长度结束的整数。请在继续往下看时牢记这几个个规则。

注:下列凡是括号内写“列表”的都是填入列表名称,写“1”的都是填入数字,写“元素”的

都是填入元素


1:add (item) to ()               为列表( )添加元素(item)

第一个空格里填入你要添加的元素还有,元素可以是数字,矢量,字符串或者某个变量或者一个确定的字符,第二个空格里填入列表的名称。例如:

有列表[1,2,3,4,5]通过 >add (ABC) to (列表名称)< 列表将变成[1,2,3,4,5,ABC]


Add 一次只能添加一个项目,如在(item)处填写 >A,B< 之类的无论如何也只会把填入的作为一个项目处理

2:insert (item) at (1) in ()           在(列表)中的索引处(1)插入(元素)


比如列表[1,2,3,4,5]通过 >insert (item) at (3) in (列表名称) < 列表就变成[1,2,item,3,此外和 add 一样只能处理单个项目


3:remove (1) from ()               将索引为(1)的元素从(列表)移除

在有 1 的( )内填索引,后面留空的( )内拖入列表名称。比如列表[1,2,3,4,5]的索引处为 3

的元素就是 3,将其删除后,列表变成[1,2,4,5]。

4:set (1) in () to (item)               将(列表)索引处(1)设置为(元素)


就是将列表中列表位置(1)的原来的元素替换为 to 后面的东西。


5:remove all from ()               将(列表)中的所有元素清除。

字面意思,把指定的一个列表内的元素清空。

6:sort ()                          将(列表)中的所有元素按照升序序列重新排序。


字面意思,把一个列表中的元素从小到大或者 a 到 z 的顺序排列。

7:reverse ()                       前后颠倒(列表)中的所有项目。


字面意思,把指定的列表中的所有元素前后颠倒。注意,这个地方只是把元素前后颠倒,没有按从大到小排序。例如列表[a]={a,c,d,e,b,f},reverse [a]={f,b,e,d,c,a},并没有从大到小排列。 8:set list () to [create list from(a,b,c)]  通过初始值(a,b,c)来创建(列表)。

这里是通过直接指定列表内元素是什么来创建列表。一般用在已知列表内元素的情况下。注意与 add (item) to ()的区别。add (item) to ()可以不知道元素具体值就直接添加入列表,


而 set list () to [create list from(a,b,c)]则必须已经明确知道列表元素为何。 9:item (1) in ()                                  (列表)中(1)的元素


这是一个获取列表指定位置的元素的函数,与上面运算符部分一样,不能作为单独的一个步骤,而是作为参数使用。

10:length of ()                       (列表)的长度


获取列表元素个数,也就是列表长度的函数

11:index of (item) in list ()               (元素)在(列表)中的位置


获取(元素)在(列表)中的索引值,也就是某一个元素在列表中的位置。。如果在列表中找不到该项目,返回 0。比如[1,2,3,4]中元素 3 的索引值是 3,也就是第三个。元素 0 在列表中不存在,则返回值 0。

八:Custom Expressions 自定义表达式

自定义表达式作用是将程序内复杂的自定义运算或重复调用的运算等独立出程序,使程序更加整洁,更改参数更加方便。创建方式参考下面的自定义指令。

点击左下角 create Custom Expressions 会出现弹窗,并附有“enter a name of Custom

Expressions”意为,输入自定义表达式的名称,这里可以输入任何自己喜欢的字符,如图输入的是“addition”,接下来会出现一个新的弹窗,底部会出现“cancel”取消  add text”添加                                                                                                                                                             文本  “add parameter”添加变量  “create”创建,达到如图效果,便是先点击的“add parameter”添加变量,并输入字符“a”确认后,点击“add  text”添加文本,并输入字符“+”再点击“add parameter”添加变量,输入字符“b”最后点击“create”创建,系统会自动为你插入一个“return”

并生成一个圆形空位( ),可填入运算符和变量。


这样就完成了表达式的创建。调用时,变量从本栏中拖出,“0”的地方分别填入你所需要的数字,对应的变量将会被赋予对应的值,如图“a”将被赋值“3”,“b”将被赋值“4”

程序运行时会直接将数字进行运算,如图模块将输出“7”,因为 3+4=“7”


 

 

 

 

 

 

 

九:Custom Instructions 自定义指令

自定义指令可用于自定义需要执行的指令顺序,但它们只会运行一次,它们类似于由多个模块组成一个新的模块。创建之后,这个自定义模块将放置在您的 custom instructions的目录中,这样您就可以定义这个自定义指令应该执行的确切指令。另外,将在左侧的“自定义指令”面板中创建一个新的指令模块,以便您可以用于在程序中调用/执行此自定义指令

创建自定义指令,点击左下角 create Custom Instructions 会出现弹窗,在窗口中输 入自定义指令的名称,点击 create 便会出现一个新的弹窗,此时弹窗底部会出现“cancel”取消 “add text”添加文本 “add parameter”添加变量 “create”创建。

若要达到如图效果,点击“add parameter”输入自定义参数的名称,在自定义指令的模块中会出现一个黄色的椭圆形自定义参数模块,再点击“add text”输入文本,最后点击“create”完成创建,便可达到如图效果。

调用,完成创建后在 custom instructions 的目录中出现与之相对应的模块,你可以拖动并调用,在程序中会自动为你添加一个如(1)图一样的模块,拖动模块并在下面添加其他模块以合成新的模块。如(2)图的模块可以被放在程序当中来表示自定义模块,其效果和在(1)图下面接的模块等效,其中于黄色的参数模块相同的位置对应的括号可以赋予该参数值,参数可以在(1)图的模块中被拖出并调用在自定义指令中。

 

 

 

十:multi-function display 多功能显示器

在“多功能显示器”这个零件里创造部件并显示,用 vizzy 调整大小;角度;坐标;透明度等等,来显示自己想要的图形或文字内容,多功能显示器简称“mfd”,在这里你可以显示任何东西,甚至 3D 图案,MDF 默认的小部件数量上限是 99 个,像素结构的上限是 265 个像素,其原因是防止程序中出现过于巨大的数,无限的生成模块导致设备卡死或宕机,可以在 xml 中修改。

1:create [ ]widget named ( ) 创造小部件[]名字叫( )



(1)   :ellipse 圆

(2) :label 标签

(3) :line 线

(4) :radial gauge 环形仪表盘

(5) :rectangle 矩形

(6) :texture 结构

(7) :vanball 导航球

(8) :map 地图

这是显示器的核心之一,往后任何我们要定义的小部件都需要先创造它然后在设置它


2:set widget ( )[ ]to ( )     把名字为( )的小部件的[ ]设置为( )

在前面创造了小部件以后,需要设置设置小部件的一些特性,当然如果不设置这些特性他们将会是默认值,这不是必要的东西

(1)   :anchored poisition 铆定坐标

(2)   :anchor mix

(3)   :anchor min

(4)   :color (颜色)颜色是十六进制色例如#FFFFFF 将会是黑色,如果直接填写颜色将必须加上“#”,如套上(hex color ( ))在(hex color( ))内可以不加

(5)   :opacity (不透明度)在后面的的( )内填写 0-1 以表示不透明度,0 表示完全透明,1 则为完全不透明

(6)   :parent 起源

(7)   :pivot 旋转中心

(8)   :position (坐标)平面坐标,X,Y,可以不带括号,0,0 是显示器的中心

(9)   :rotation 旋转

(10)     :scale (规模)1 表示 100%大小

(11)     :size (大小)1 表示 100%大小

(12)     :visible (看得见的)Ture 或 false 1 或 0 真命题表示看得见,反之亦然

3:set widget ( )anchor to [ ] 把名为( )的小部件铆定在[ ]没什么卵用

(1)   :left 左面

(2)   :center 中间

(3)   :right 右边

(4)   :toplift 左上

(5)   :topcenter 中上

(6)   :topright 右上

(7)   :Bottomlift 左下

(8)   :bottomcenter 中下

(9)   :bottomright 右下

4:set label ( )[ ]to     ( )设置标签为[ ]填入( )



设置所创造的“label“部件以显示一些内容

(1)   :text 文字

(2)   :font size 文字大小

填入 1-0,1 表示 100%大小

(3)   :auto size 自动大小

True 或 false 启用或禁用自动大小,自动更改文本的大小,以填充标签小部件的全部区

5:set label ( )alignment to [ ]      把名字为( )的标签对齐于[ ]


(1)   :left 左面

(2)   :center 中间

(3)   :right 右边

(4)   :toplift 左上

(5)   :topcenter 中上

(6)   :topright 右上

(7)   :Bottomlift 左下

(8)   :bottomcenter 中下

(9)   :bottomright 右下

6:set texture ( )pixel x=( )y=( )to ( )


设置名为( )的结构的位于 x=( )y=( )的像素为( )

设置所创造的结构的像素,在后面的(0,0,0)中填入十六进制颜色,如果直接填写颜色将必须加上“#”,如套上(hex color ( ))在(hex color( ))内可以不加


7:initialize texture ( )width( )and height( )

初始化名为( )的结构使其宽为( )高为( )在设置所创造的结构之前需要先初始化,

8:set sprite ( )[ ]to( )


9:set gauge( )[ ]to( )


10:set line( )[ ]to( )  设置名字为( )的线的[ ]为( )


设置之前创造的小部件线的一些特性

(1)   :thickness 厚度(宽度)

0-1,1 表示 100%


(2)   :length 长度

11:set line( )from( )to( )  设置名字为( )的线从坐标( )到坐标( )


把之前创造的线设置为一个从坐标(0,0)到(1,1)线

12:set navball ()[ ]to 设置名为( )的导航球[ ]部位的颜色为( )


设置所创造的导航球,[top color]上面的颜色;[bottom color]下面的颜色为( ),( )

中填入十六进制颜色,如果直接填写颜色将必须加上“#”,如套上(hex color ( ))在(hex color( ))内可以不加

13:set map( )[ ]to


设置所创造的地图的一些特性,不必要,程序中没有这个模块将会是默认值

(1)   :North Up 以北为上

启用或禁用地图锁定向北,启用后地图将不会转动,表示用户的图标将会转动,禁用反之亦然

(2)    zoom 放缩

设置地图的缩放级别。这只能是介于 1 和 5。1 表示 100%

(3)    manual mode 手动模式

手动模式下是固定地图的,不能在游戏里面设置或改变地图

(4)    planet 行星

在手动模式下选择地图所显示的行星

(5)    coordinates 坐标

在手动模式下选择地图所显示的坐标,在( )中的填入经纬度

(6)    heading 朝向

在手动模式下条件选择地图的朝向

 


14:bring widget ( )in front of( )    把名为( )的部件带到(Target)前面

15:send widget( )behind( ) 把名为(name)的部件送到(Target)附近

16:set widget(name)to broadcast(message)on [Click] with data(data)


将名为(name)的小部件设置为在[Click]点击时广播(message)并赋值 data 为(data)

在名为(name)的小部件被点击时,广播(message)和赋予黄色的(data)模块值,此模块需要和上面的“五-6”配合使用


17:destroy widget named(name)  清除名字叫(name)的小部件


可以防止卡顿,及时把不必要的部件删除,若只为隐藏也可以把不透明度调为 0,或者设置隐藏为真命题


18:destroy all widgets 清除所有部件

防止卡顿

19:get widget(name)[position]  得到名为( )的部件的[ ]跟上面的 set 同理一个是,设置一个是得到

(1)   :anchored poisition 铆定坐标

(2)   :anchor mix

(3)   :anchor min

(4)   :color 颜色

颜色是十六进制色例如#FFFFFF 将会是黑色,如果直接填写颜色将必须加上“#”,如套上(hex color ( ))在(hex color( ))内可以不加

(5)   :exists 存在

如果具有指定名称的小部件存在,则输出为真命题

(6)   :opacity 不透明度

在后面的的( )内填写 0-1 以表示不透明度,0 表示完全透明,1 则为完全不透明

(7)   :parent 起源

(8)   :pivot 旋转中心

(9)   :position 坐标

平面坐标,X,Y,可以不带括号,0,0 是显示器的中心

(10)    :rotation 旋转

(11)    :scale 规模

1 表示 100%大小

(12)    :size 大小

1 表示 100%大小

(13)    :visible 看得见的

20:get label(name)[ ] 得到名字为( )的标签的[ ]得到

(1):text 文字输出文字信息

(2)   :font size 文字大小

输出 1-0,1 表示 100%大小

(3)   :auto size 自动大小

输出为真命题,或假命题

(4)   :alignment 对齐

输出为对齐的地方的名称


21:get sprite( )[ ] 得到名为( )的圆的[ ]


得到园的信息

(1)   :Fill method 填充方式

(2)   :icon

(3)   :fill amount 自动填充

根据是否禁用自动填充输出对应的真假命题

22:gat gauge( )[ ] 得到名为( )的仪表盘的[ ]得到所创造的仪表盘的一些特性

(1)   :background color 背景颜色

(2)   :Color 颜色

(3)   :text 文字

(4)   :text color 文字颜色

(5)   :value 值


就是仪表盘指的数值 0-1,1 表示 100% 23:convert(0,0)[ ]for( )

24:get widget ( )[ ]message 自 己 理 解


25:hex color( ) 颜色


十六进制颜色,可以不带#号

叁 程序实例

一:用 pid 让火箭悬停


pid 是一种常见的控制方式,有适应性强,响应快能通过当前状况实时调整等特点,适用范围非常广泛,但并非万能。这里以让火箭悬停为例来介绍 pid,程序如图

正如图所示,pid 分为三个部分,输出是由三个变量共同决定的的,分别是 p I 和 d ,英文的全称是 proportional-integral-derivative(放洋屁),意为偏差的比例、积分、微分,虽然这看起来很高深,其实我们可以更通俗的理解这三个变量。

p(proportional)这是误差量,如图我们定义的变量 target 是目标高度为 10 米,AGL

表示距地面高度,用目标减去当前的距地高度便得到了误差量。

I(integral),直意为积分,意思是通过 p 和 d 的输出累加得到一个相对稳定的数值,而  积分的意义是稳定当前的状态,在当我们知道如何去稳定当前状态的时候就不用大费周章的计算积分,如例所示,我们就深知只要平衡了火箭的重力便能维持运动状态,所以我们对 i的定义就是火箭的重力。

d(derivative),意为微分,顾名思义就是偏差改变的速率,若偏差改变的速率过快,换句话说就是一直加速前往目标,一定会冲过目标,冲过的量甚至会超过原来的误差,所以我们要根据误差改变的速率实时限制输出,在本例中我们要到达预计高度,误差改变的速度就是火箭竖直的速度,并在前面乘上负一,使其速度越快负得越大,对整体的抑制作用越强,便可有效避免了上述情况。

细心的你一定发现了在本例中 p 和 d 的后面乘了质量,其实这是系数,本例只是举例而选质量作为系数,在 pid 中系数尤为重要,是否合适直接决定了收束的速度,系数不仅可以是一个实数,也可以是一个表达式,这等待你自己去探索。


这是 pid 收束曲线,可以看见虽然加了积分限制输出,但是还是多多少少会冲过标准线,一些,其次显而易见蓝色线的收束速度高于红线,这便是系数不同的影响,这也提现了 pid


的局限性,越大的误差收束需要的时间成倍增长,所以 pid 只适合相对较小误差的微调。若是试图只用基础的 pid 着陆,那么火箭将重重的摔在地上!

总结来讲p 是误差量,i 是一个想方设法去稳定当前状态的量,d 是限制输出的量

一:简单的锁定程序


利用矢量计算编写一个简单的锁定程序,让你的摄像机或者灯或者其他东西朝向某个方向,本节包含了基本的矢量应用,叉乘的应用,以及一种图像思维

1:利用矢量绘图

游戏中的矢量都是有所对应的,都是可以被画出来的,请先阅读前 while 下面的前三行并试图绘制其图像(模块的翻译前面都有,涉及矢量的模块都标注了图像意义)


肆 其他有关内容

1:矢量 vizzy 用表示,可以同时表示大小和方向的量,在本游戏里以(0,0,0)的方式表

PCI 坐标系:planet central inertial 天体中心惯性系,在游戏里是一个坐标轴指向绝对坐标系,关于某个天体(你的载具也可以是天体)的中心为零点,xyz 轴方向保持绝对不变与姿态无关,如图(31.1),且相互垂直,游戏中所有 pci 坐标对应的轴都平行且与相对的物体无关如图(31.2)及原点可变;坐标轴指向不变,所以每一个 pci 坐标都可以平移并直接运算,注意:三个轴拆开来独立分析几乎没有价值


 

图(31.1)                              图(31.2)

Local 坐标系 顾名思义本地坐标系 以分别以 pitch yaw roll 为坐标轴的 x y z 轴,三者的对应关系不定,在vizzy 模块的详解里有标注

2:浮点数 vizzy 中用英文名float,含字节数为 4,32bit,数值范围为-3.4E38~3.4E38 的

数,小数点后有很多位,直接 display 可能难以看清,游戏里任何数据都是以浮点数储存的

3:角度 vizzy 中用   表示,这是 0-180 的浮点数

4:弧度 vizzy 中用   表示,弧度就是我们常说的几兀(兀≈3.1415…),1 兀=180 度

5:Dv:dv 是Δv 的简称,表示速度的变化量,例如从静止变得以 10m/s 的速度位移,则此

过程中的 dv 就是 10m/s。

5:列表 纯数字 文字 在vizzy 中这是三个不同的概念,不可混用,处理文字的模块不能处理列表,处理

7:http://digitalnativestudios.com/textmeshpro/docs/rich-text/


伍 Vizzy 的 XML

游戏内自带的编译器虽然编程方便但 bug 巨多可读性极差,在程序数量更多的情况下掉帧严重,一个核有难七核观战,面对这种情况我们就不得不直接在 xml 里面编写程序。

一:程序的储存和信息

 

 

 

 

 

 

如图,所有程序被放在了FlightProgram 块里面,其中 variable 被放在 program 的最开头里面储存的是程序变量,后面的 number=0 是初始化值,但不能改。

二:事件类

1:事件触发语句

文本框: <Instructions> #当游戏开始的时候
<Event event="FlightStart" id="0" style="flight-start" pos="0,0" />
</Instructions>
<Instructions> #当飞行器发生碰撞的时候
<Event event="PartCollision" id="0" style="part-collision" pos="0,0" />
</Instructions>
<Instructions> #当飞行器其有一个零件爆炸的时候
<Event event=”PartExplode” id=”0” style=”part-explode” pos=”0,0”/>
</Instructions>
<Instructions> #当两个飞行器成功对接的时候
<Event event="Docked" id="0" style="craft-docked" pos="0,0" />
</Instructions>
<Instructions>
<Event event="ReceiveMessage" id="0" style="receive-msg" pos="0,0">
<Constant canReplace="false" text="message" />
</Event>
</Instructions>

6:正如上面所写的,每一个event 类型的代码都被包涵在一个 instructions 中,这相当于


java 中的一个类或者方法,在 vizzy 中每一条程序都由一个 event 引导所以 event 类型通常放在 instructions 下面的第一个,后面的 pos 是坐标,是 position 的简写,只有 event 和独立的模块会带有坐标,其他的代码可能会也有坐标,是因为程序抽风删掉即可不影响。,

二:变量和计算

1:在读写变量之前需要先创建变量,用于储存变量的位置位于 program 下的第一个


2:给变量赋值改变和让用户输入


3:计算π的近似值

 


1 2            1 2

()  + ()

1             2


1 2

+ ()

3


1 2

+ ()

4


1 2

+ ()

5


1 2

+ ()

6


+ ⋯ =


𝜋2

 

6


<FlightProgram                           powerConsumptionPerInstruction=”0.01” broadcastPowerConsumptionPerByte=”0.1”>

<Program name=”New Program”>

<Variables> #创建变量

<Variable name=”π” number=”0” />

<Variable name=”num1” number=”0” />

<Variable name=”num2” number=”0” />

<Variable name=”num3” number=”0” />

</Variables>

<Instructions>

<Event event=”FlightStart” id=”0” style=”flight-start” pos=”0,0” />

<While id=”1” style=”while”>

<Constant style=”true” bool=”true” />

<Instructions> #典中典的 while true 循环

<SetVariable id=”2” style=”set-variable”> #num1 每个循环都+1

<Variable list=”false” local=”false” variableName=”num1” />

<BinaryOp op=”+” style=”op-add”>

<Variable list=”false” local=”false” variableName=”num1” />

<Constant text=”1” />

</BinaryOp>

</SetVariable>

<SetVariable id=”3” style=”set-variable”> #(1/num1)^2

<Variable list=”false” local=”false” variableName=”num2” />

<BinaryOp op=”^” style=”op-exp”>

<BinaryOp op=”/” style=”op-div”>

<Constant text=”1” />

<Variable list=”false” local=”false” variableName=”num1” />

</BinaryOp>

<Constant text=”2” />

</BinaryOp>

</SetVariable>

<SetVariable id=”4” style=”set-variable”> #把所有 num2 都加起来得 num3

<Variable list=”false” local=”false” variableName=”num3” />

<BinaryOp op=”+” style=”op-add”>

<Variable list=”false” local=”false” variableName=”num3” />

<Variable list=”false” local=”false” variableName=”num2” />

</BinaryOp>

</SetVariable>

<SetVariable id=”5” style=”set-variable”> #num3 乘 6 开根号便是π

<Variable list=”false” local=”false” variableName=”π” />

<MathFunction function=”sqrt” style=”op-math”>

<BinaryOp op=”*” style=”op-mul”>

<Variable list=”false” local=”false” variableName=”num3” />

<Constant text=”6” />

</BinaryOp>


三:循

文本框: <For var="i" id="1" style="for">
<Constant number="1" />
<Constant number="10" />
<Constant number="1" />
<Instructions>
<DisplayMessage id="2" style="display">
<Constant text="hellow world" />
<Constant number="7" />
</DisplayMessage>
</Instructions>
</For>


1:在每一个循环内部必须加 instruction 再写入循环内的程序主体 例如 for 循环 display。 Hellowworld

本教程基于vizzy编辑从入门到入坟 V3.7.15(作者-老狗).pdf修改而来,完善了部分细节,修订了诸多错误和过时的表述。

本教程已获得“所罗门老狗”的重编许可,将按照网站规定开源,于此感谢原作者的付出和支持。