您的位置:首页 > 新闻动态 > 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…])存进存储器部分
================================================== 

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