• 您的位置:首页 > 新闻动态 > VR专题

    模拟转换输入设备的软件GlovePIE 编程文档的部分中文翻译

    2017/3/9      点击:

    GlovePIE是一个模拟和转换输入设备的软件。例如可以让Wii手柄信号模拟为键盘、鼠标或游戏手柄在电脑上打游戏,可以用Wii手柄控制Midi输出,不过这需要编写一些脚本实现。GlovePIE现在能接受的设备有鼠标、键盘、游戏手柄、PPJoy(一种虚拟游戏手柄)、P5数据手套、Wii Remote、MIDI和语音识别输入。

    GlovePIE编程文档的部分中文翻译

    文内符号说明:“[]”内是可用可不用的项,“|”两边是单选项。
    注释可以为以下几种
    // 注释
    ' 注释
    REM 注释
    % 注释
    /* 多行
    注释 */

    建议用“//”

    debug=变量
    就能在调试窗口实时显示变量值
    ---------------------------------------
    赋值语句
    有向前赋值和向后赋值两种形式,等价的。
    向前赋值语句如下
    变量名 = 表达式 [;]

    变量名 := 表达式 [;]
    向后赋值语句如下
    表达式 => 变量名 [;]
    例如
    Ctrl = var.a
    Ctrl = var.b
    它有类似的效果: Ctrl = var.a or var.b
    ------------------------------------------
    IF语句
    有以下句法
    if 条件 then 语句 [;]
    if (条件) [then] 语句 [;]
    if 条件 [then] [begin] [{]
    语句 [;]
    语句 [;]
    ...
    [}] [end [if]] [;]

    if 条件 [then] [begin] [{]
    语句 [;]
    语句 [;]
    ...
    [}] [end] else [begin] [{]
    语句 [;]
    语句 [;]
    ...
    [}] [end [if]] [;]

    if 条件 [then] [begin] [{]
    语句 [;]
    语句 [;]
    ...
    [}] [end] (else if|elseif) 条件2 [then] [begin] [{]
    语句 [;]
    语句 [;]
    ...
    [}] [end] (else if|elseif) 条件3 [then] [begin] [{]
    语句 [;]
    语句 [;]
    ...
    [}] [end] else [begin] [{]
    语句 [;]
    语句 [;]
    ...
    [}] [end [if]] [;]
    --------------------------------------------
    WHILE循环语句
    当条件为真则循环
    有以下句法
    while 条件 do 语句 [;]

    while (条件) [do] 语句 [;]

    while 条件 [do] [begin] [{]
    语句 [;]
    语句 [;]
    ...
    [}] [end [while]] [;]

    任何循环*多只运行0.2秒,超过就强制中止。
    --------------------------------------------
    FOR循环语句
    有以下句法
    for 变量 (=|:=) 初始量 (to|downto) 结束量 [step 步长] do 语句 [;]

    for 变量 (=|:=) 初始量 (to|downto) 结束量 [step 步长] [do] [begin] [{]
    语句 [;]
    语句 [;]
    ...
    [}] [end [for]]

    for (赋初值 ; 条件 ; 增量) [do] 语句 [;]

    for (赋初值 ; 条件 ; 增量) [do] [begin] [{]
    语句 [;]
    语句 [;]
    ...
    [}] [end [for]]

    任何循环*多只运行0.2秒,超过就强制中止。
    --------------------------------------------
    等待命令
    有以下句法
    wait 持续时间 [;]

    wait(持续时间) [;]

    通常为持续时间指定单位。有效的单位是:ms, s, minutes, hours, days
    --------------------------------------------
    增减语句
    有以下句法
    var.x++
    ++var.x
    Inc(var.x)

    var.x--
    --var.x
    Dec(var.x)
    --------------------------------------------
    位移语句
    有以下句法
    左移变量N位
    shl var.x, N
    右移变量N位
    shr var.x, N
    --------------------------------------------
    “说”命令

    Say "句子"

    Say("句子")
    发出合成语音
    --------------------------------------------
    其他命令
    ExitScript
    退出当前脚本运行
    ExitPIE
    退出GlovePIE软件

    FlashPieWindow
    闪GlovePIE的窗口
    HidePie
    隐藏GlovePIE
    ShowPie
    显示GlovePIE
    RestorePie
    复位GlovePIE的窗口
    MinimizePie
    *小化GlovePIE的窗口
    MaximizePie
    *大化GlovePIE的窗口
    UnMinimizePie
    反*小化GlovePIE的窗口
    UnMaximizePie
    反*大化GlovePIE的窗口

    Execute(文件名)
    执行外部程序
    Chain(文件名)
    调用运行另一脚本

    PlaySound(文件名)
    播放音频文件
    Beep([频率, 持续时间])
    响单频率声
    BeepAsterisk
    响*音效
    BeepExclamation
    响!音效
    BeepHand
    响!音效
    BeepQuestion
    响?音效BeepDefault
    响缺省音效

    Display(text)
    输出信息
    DebugPrint(text)
    调试窗口输出信息
    OutputToFile(text)
    输出信息到文件里
    AddCode(text)
    不知道

    Type(字符串)
    模拟键盘打入字符串
    TypeUnicode(字符串)
    模拟键盘打入Unicode字符串
    Press(键)
    按下键
    Release(键)
    释放键
    Toggle(键)
    如果键当前是按下状态,则释放键,如果键当前是释放状态,则按下键。

    SendOsc(ip, port, address, [p1, p2, p3…])
    BroadcastOsc(port, address, [p1, p2, p3…])
    这两个是网络发送信息的函数

    ControlPanel, ControlPanelKeyboard, ControlPanelJoystick, ControlPanelMouse, ControlPanelP5, ControlPanelPPJoy, ControlPanelSpeech, ControlPanelMidi, ControlPanelDisplay这些都是打开各个设备的控制面板。
    ================================================================
    GlovePIE内置函数

    三角函数
    单位是度
    Standard trig functions: sin(x), cos(x), tan(x), sec(x), cosec(x), cotan(x)
    Hyperbolic trig functions: SinH(x), CosH(x), TanH(x), SecH(x), CosecH(x), CotH(x)

    Inverse trig functions: aSin(x), aCos(x), aTan(x), aSec(x), aCosec(x), aCotan(x)
    Inverse Hyperbolic trig functions: aSinH(x), aCosH(x), aTanH(x), aSecH(x), aCosecH(x), aCotanH(x)

    2D inverse tan function: atan2(x)
    ----------------------------------------------
    舍入函数

    ceil(x): 向正无穷方向取整
    floor(x): 向负无穷方向取整
    trunc(x), int: 向零方向取整
    round(x): 四舍五入法取整 .5取*接近的偶数(银行家舍入法)
    frac(x): 取小数部分。 例如 Frac(-1.32) = -0.32

    RoundTo(x, 位): 如果“位”是负或零,则按位数使用银行家舍入法。如果“位”是正,则(rounds to that power of ten using Banker's Rounding.)

    SimpleRoundTo(x [,位]): 和RoundTo函数基本一样,除了只四舍五入,不用银行家舍入法。位缺省值是-2。
    --------------------------------------------------
    正负函数
    Sign(x): 如果x是正返回1,如果x是零返回0,如果x是负返回-1。
    Abs(x): 返回x的绝对值。
    --------------------------------------------------
    指数和开方函数

    sqr(x): x^2
    sqrt(x): x^(1/2)
    power(x,y): calculates x^y
    intPower(x,y): x和y取整后算 x^y
    exp(x): e^x. e is 2.71828
    Ldexp(s,p): s * (2^p)

    Poly(x, a0, [a1, [a2, [a3, [a4, [a5, [a6]]]]]]): a0 + a1*x + a2*(x^2) + a3*(x^3) + a4*(x^4) + ...

    Log10(x): 10为底数的对数
    Log2(x): 2为底数的对数
    LogN(N, x): N为底数的对数
    Ln(x): 自然对数
    LnXP1(x): x+1的自然对数
    --------------------------------------------------
    比较函数
    IsZero(x): 如果是0返回真
    IsInfinite(x): returns true if x is infinite
    IsNaN(x): 如果不是数字返回真

    SameValue(a, b [, epsilon]): 如果a和b相等返回真, or differ by no more than epsilon
    InSet(x,a,b,c,d,e,f,g,...): 如果x匹配后面任意一值,则返回真

    max(a,b): 返回较大的值
    min(a,b): 返回较小的值
    --------------------------------------------------
    范围函数
    EnsureRange(x, a, b): 如果x在[a,b]区间,返回x,如果小于a则返回a,大于b则返回b。
    InRange(x, a, b): 如果x在[a, b]区间内返回真

    MapRange(x, a, b, c, d): 根据x在[a, b]范围的比例映射[c, d]范围。例如MapRange(2, 1, 3, 10, 30)返回20

    EnsureMapRange(x, a, b, c, d): 和MapRange类似,只是当x超出[a,b]区间按EnsureRange反应。例如EnsureMapRange(4, 1, 3, 10, 30)返回30
    --------------------------------------------------
    随机函数
    Random: 返回0到1间的随机数
    Random(n): 返回0到n-1的随机整数
    RandomRange(a,b): 返回a到b-1的随机整数
    RandG(mean, StandDev): 返回高斯分布随机数
    --------------------------------------------------
    序数函数
    odd(n): 如果是奇数返回真
    pred(n): 返回 n-1
    succ(n): 返回 n+1
    --------------------------------------------------
    时间函数
    Now: 返回当前时间日期在1899.12.30之后多少天(非整数)
    Time: 返回Now函数的小数部分
    Date: 返回Now函数的整数部分

    Tomorrow: 等于Date+1
    Yesterday: 等于Date-1

    CurrentYear: 返回当前年份

    DateOf(x): 返回日单位。例如 DateOf(1999)返回1999 days
    TimeOf(x): 返回日单位。例如 TimeOf(0.2)返回0.2 days


    Dayofthemonth(x), dayoftheweek(x), dayoftheyear(x), dayofweek(x),
    Daysbetween(x, y),
    Daysinamonth(x, y), daysinayear(x), daysinmonth(x), daysinyear(x), DaySpan(x, y),
    HourOfTheDay(x), HourOfTheMonth(x), HourOfTheWeek(x), HourOfTheYear(x),
    HoursBetween(x, y), HourSpan(x, y),
    IncDay(x, [y])
    --------------------------------------------------
    时序函数
    Smooth(x, [额外桢数, [不工作区]])
    根据x之前的额外桢数平滑之。不工作区缺省是0.

    Pressed(键)按下就返回true。
    Clicked(键)点击(压下松开算一次点击)就返回true,不论单击双击。
    SingleClicked(键)单击返回true。
    DoubleClicked(键)双击返回true。

    HeldDown(x, MinTime)
    x为真持续时间大于MinTime时返回true。

    KeepDown(x, MinTime)
    当x为真后,持续保持true输出MinTime时间。
    ================================================================
    运算符

    不同类型的量运算会自动转换

    a%
    百分比号

    -b
    负号

    |b|
    取绝对值,b可以是数字、向量或矩阵。

    a + b

    a plus b
    如果a和b是数就加运算;如果a和b是字符串就连接起来;如果a和b是布尔量就等同于and运算符;如果a是向量,b不是,它将扩展长度但不改变方向。

    a - b
    a minus b
    如果a和b是数就减运算;如果a和b是字符串就连接起来;如果a和b是布尔量就等同于and运算符;如果a是向量,b不是,它将扩展长度但不改变方向。

    a x b

    a * b

    a times b

    a multiplied by b

    a cross b
    乘运算

    a . b

    a dot b
    如果a和b是向量就 点乘运算,其他数则等同普通乘运算。

    a% of b

    a % of b
    a%乘以b

    a / b

    a divided by b
    普通除法运算。如果a和b是布尔量就等同于or运算符

    a div b
    整数除法。(a或b可以是非整数)

    a mod b

    a % b
    取模运算。(注意这是可以非整取模。例如7.5 mod 3.5返回0.5)

    a ^ b

    a ** b
    指数运算

    a ^^ b
    反复指数运算。例如2^^4就是2^(2^(2^2))

    b!
    阶乘

    b!!
    当b为奇数,则等于从1到b的所有奇数的乘积。当b为偶数,则等于从2到b的所有偶数的乘积

    a & b
    如果a和b是整数,进行逐位与运算,如果是非整数,先取整再运算,如果是字符串则连接起来。

    a | b
    如果a和b是整数,进行逐位或运算,如果是非整数,先取整再运算,如果是字符串则连接起来。

    a shl b

    a << b
    a左位移b位,等于a * (2^b)

    a shr b

    a >> b
    a右位移b位,等于a div (2^b)

    not b
    逻辑取反

    a and b

    a but b
    a和b都为真返回真(如果为数,则>-0.5到<0.5的范围内算假)。这只是逻辑运算,不是位运算符。

    a or b

    either a or b
    a或b任意是真则返回真(如果为数,则>-0.5到<0.5的范围内算假)。这只是逻辑运算,不是位运算符。

    neither a nor b
    a和b都为假返回真

    a xor b
    当且仅当a或b有一为真,则返回真。

    a = b

    a == b
    当a等于b,则返回真

    a != b

    a <> b

    a isn't b

    a is not b
    当a不等于b,则返回真

    a ~= b
    如果a近似等于b,则返回真。(近似相等就是,字符串字母和顺序都一样,除了大小写和空格不算。数字就是当把a转化成b相同的单位制,两者的差的绝对值小于一个很小的值。)

    a !~= b

    a ~!= b
    如果a不近似等于b,则返回真。

    a > b
    a大于b则返回真

    a < b
    a小于b则返回真

    a >= b
    a大于等于b则返回真

    a <= b
    a小于等于b则返回真

    b < a < c

    c > a > b
    如果a大于b并且小于c,则返回真

    b <= a < c

    c > a >= b
    如果a大于等于b并且小于c,则返回真

    b < a <= c

    c >= a > b
    如果a大于b并且小于等于c,则返回真

    b <= a <= c

    c >= a >= b
    如果a大于等于b并且小于等于c,则返回真
    ==================================================
    键盘

    直接键名就可以读或设置。但不推荐
    例如F1有以下三种形式
    F1

    Key.F1 (推荐形式)

    Keyboard.F1

    还有控制键联合用的写法
    ^C
    Ctrl+C (推荐)
    Ctrl and C

    用Key.ScanCode或Key.VK读取键扫描码。
    Key.Row返回第几行(键盘*上面为第一行)的按键被按下。无键被按时返回-1。
    任意键被按下Key.AnyKey返回true。
    设置Key.RawInput为true,用来强制GlovePIE使用RawInput直读键盘,而非用默认的DirectInput方式。

    当有多个键盘,使用KeyN.键的形式会自动强制使用RawInput直读键盘。
    读Key.Count的值可知正连着几个键盘。
    读KeyN.Exists的值可知第N号键盘是否连着。

    以下键不能在GlovePIE中使用
    F Lock;My Documents;Messenger;LogOff;Power。

    非标准的多媒体键和应用程序键能使用,但不能知道被按下多久。

    GlovePIE也能模拟输入Unicode字符。Key.Unicode后跟4位16进制数。如Key.Unicode03B1

    字母上方数字键除可以Key.1,Key.2,Key.3……(推荐形式),也可以Key.one,Key.two,Key.three……。数字小键盘用Key.NumPad1,Key.NumPad2,Key.NumPad3……形式。数字小键盘上的“+”用Key.NumPadPlus,“-”用 Key.NumPadMinus,“*”用Key.NumPadMultiply,“/”用Key.NumPadDivide,“.”用 Key.NumPadDot,回车用Key.NumPadEnter。

    “`”用Key.Console,“\”用Key.Backslash,“-”用Key.Minus,“=”用Key.Equals,“[”用 Key.LeftBracket,“]”用Key.RightBracket,“;”用Key.Semicolon,“'”用 Key.Apostrophe,左换档键用Key.LeftShift,右换档键用Key.RightShift,“,”用Key.Comma,“.”用 Key.Dot,“/”用Key.Slash,左Ctrl键用Key.LeftCtrl,左窗口键用Key.LeftWindows,左Alt键用 Key.LeftAlt,空格键用Key.Space,右Alt键用Key.RightAlt,右窗口键用Key.RightWindows,应用菜单键用Key.AppMenu,右Ctrl键用Key.RightCtrl,上箭头键用Key.Up,下箭头键用Key.Down,左箭头键用 Key.Left,右箭头键用Key.Right。

    有左右两键的Shift、Ctrl、Alt、Windows都可用Key.Shift,Key.Ctrl,Key.Alt,Key.Windows。

    键都可以用Key.Scan后跟十六进制键扫描码表示。例如Key.Scan5B。
    ==================================================
    鼠标

    有点长,懒了。谁给补上吧。
    ==================================================
    Wiimote

    Wiimote支持8个Wiimote1到Wiimote8。用Wiimote等于默认Wiimote1。

    支持除电源和同步按钮以外的所有按钮。如下:
    Wiimote.Up, Wiimote.Down, Wiimote.Left, Wiimote.Right,
    Wiimote.A, Wiimote.B,
    Wiimote.Minus, Wiimote.Home, Wiimote.Plus
    Wiimote.One, Wiimote.Two

    Wiimote的加速度测量,X轴向右,Y轴向上,Z轴向前。
    Wiimote.gx, Wiimote.gy, Wiimote.gz
    Wiimote.g的值是gx,gy,gz的集合。
    Wiimote.RawAccX, Wiimote.RawAccY, Wiimote.RawAccZ
    Wiimote.RelAccX, Wiimote.RelAccY, Wiimote.RelAccZ
    是带单位的加速度值。
    Wiimote.RawForceX,Wiimote.RawForceY,Wiimote.RawForceZ是过时的函数,只为向后兼容保留,不建议再用。RawForce可以用固定比例转换到RawAcc。RawForce=RawAcc*2.633

    旋转
    Wiimote.Pitch, Wiimote.Roll
    Wiimote.SmoothPitch, Wiimote.SmoothRoll(平滑值)
    Pitch是垂直的角度。正面向上水平放置数值是0,红外头垂直向天花板数值是90,红外头垂直向地面数值是-90。
    Roll是水平滚动角度。正面向上水平放置数值是0,向+按钮方向滚动180度数值是180,向-按钮方向滚动180度数值是-180。

    定位条
    wiimote.dot1x, wiimote.dot1y

    wiimote.dot4x, wiimote.dot4y
    返回4个红外灯的坐标
    Wiimote.dot1vis, Wiimote.dot2vis, Wiimote.dot3vis, Wiimote.dot4vis
    返回4个红外灯点是否被看到。
    Wiimote.dot1size, Wiimote.dot2size, Wiimote.dot3size, Wiimote.dot4size
    返回4个红外灯点的大小(数值0到15之间)

    Wiimote.Leds赋值0到15之间的数,控制Wiimote上的4个LED灯亮灭。
    Wiimote.Led1, Wiimote.Led2, Wiimote.Led3, and Wiimote.Led4赋值true或false单独控制Led灯亮灭。

    Wiimote.Rumble赋值true,Wiimote力反馈开始震动。

    Wiimote.Frequency发出所赋值频率的声音。
    Wiimote.Volume赋值0到2之间数调节音量0%到200%。
    Wiimote.Speaker赋值true或false控制喇叭发声与否。
    Wiimote.Mute赋值true或false,和Speaker功能一样,只是逻辑值正好相反。
    Wiimote.SampleRate赋值采样频率。采样率必须是280的整数倍。当前GlovePIE仅支持3640Hz采样率。

    Wiimote.Battery读出电量(满电是192)。

    读Wiimote.Count的值可知正连着几个Wiimote。
    读WiimoteN.Exists的值可知WiimoteN是否连着。

    Wiimote中的存储器部分
    Wiimote.InByteString读出整个存储器的串。
    或分别读
    var.a = Wiimote.InReport
    var.b1 = Wiimote.InByte1
    ...
    var.bN = Wiimote.InByteN
    WiimotePoke([wiimote number], address, value)读Wiimote中的存储器部分
    WiimoteSend(wiimote number, report number, [p1, p2, p3…])存进存储器部分
    ================================================== 

    声明:本文来自网络,版权属于原作者。