Skip to content

Commit 4dc4fd4

Browse files
committed
SplitterAdvance: YPR offset
1 parent 5a55ffb commit 4dc4fd4

5 files changed

Lines changed: 93 additions & 3 deletions

File tree

Delphi/SplitterAdvance/README.RU.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121

2222
Параметры: "OffsetX", "OffsetY", "OffsetZ" отвечают за смещение позиционного драйвера для каждого устройства.
2323

24+
25+
Параметры: "OffsetYaw", "OffsetPitch", "OffsetRoll" отвечают за смещение вращения драйвера для каждого устройства.
2426
## Примеры
2527
Например, мы хотим использовать использовать для позиционирования пинг понг шарики со светодиодом и PS3 камеру (PSMoveService), за вращение шлема у нас отвечает Arduino с датчиком вращения, а за вращение контроллеров и кнопки еще 2 ардуино, то конфигурационный файл будет следующим:
2628
```

Delphi/SplitterAdvance/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ The "Buttons" parameter is responsible for the name of the button driver. If the
2323

2424
Parameters: "OffsetX", "OffsetY", "OffsetZ" are responsible for offsetting the position driver for each device.
2525

26+
27+
Parameters: "OffsetYaw", "OffsetPitch", "OffsetRoll" are responsible for the rotation of the driver rotation for each device.
2628
## Examples
2729
For example, we want to use Ping Pong balls with LED and PS3 camera (PSMoveService) to use for positioning, for the rotation of the helmet we have Arduino with the rotation sensor, and for rotating the controllers and the buttons for 2 more arduino, the configuration file will be as follows:
2830
```

Delphi/SplitterAdvance/SplitterAdvance.dpr

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,12 @@ type TOffsetPos = record
4444
Z: double;
4545
end;
4646

47+
type TOffsetYPR = record
48+
Yaw: double;
49+
Pitch: double;
50+
Roll: double;
51+
end;
52+
4753
var
4854
DriverGetHMDPos: function(out myHMD: THMD): DWORD; stdcall;
4955
DriverGetHMDRot: function(out myHMD: THMD): DWORD; stdcall;
@@ -62,9 +68,20 @@ var
6268
HMDUseRot, CtrlsUseRot, CtrlsRotBtns, CtrlsUseBtns: boolean;
6369

6470
HMDPosOffset, Ctrl1PosOffset, Ctrl2PosOffset: TOffsetPos;
71+
HMDYPROffset, Ctrl1YPROffset, Ctrl2YPROffset: TOffsetYPR;
6572

6673
{$R *.res}
6774

75+
function fmod(x, y: double): double;
76+
begin
77+
Result:=y * Frac(x / y);
78+
end;
79+
80+
function MyOffset(f, f2: double): double;
81+
begin
82+
Result:=fmod(f - f2, 180);
83+
end;
84+
6885
function GetHMDData(out myHMD: THMD): DWORD; stdcall;
6986
var
7087
HMDRot: THMD; MyStat, StatCount: DWORD;
@@ -91,6 +108,11 @@ begin
91108
myHMD.Y:=myHMD.Y + HMDPosOffset.Y;
92109
myHMD.Z:=myHMD.Z + HMDPosOffset.Z;
93110

111+
//HMD offset ypr
112+
myHMD.Yaw:=MyOffset(myHMD.Yaw, HMDYPROffset.Yaw);
113+
myHMD.Pitch:=MyOffset(myHMD.Pitch, HMDYPROffset.Pitch);
114+
myHMD.Roll:=MyOffset(myHMD.Roll, HMDYPROffset.Roll);
115+
94116
if MyStat = StatCount then
95117
Result:=1
96118
else
@@ -174,11 +196,21 @@ begin
174196
myController.Y:=myController.Y + Ctrl1PosOffset.Y;
175197
myController.Z:=myController.Z + Ctrl1PosOffset.Z;
176198

199+
//Controller offset ypr
200+
myController.Yaw:=MyOffset(myController.Yaw, Ctrl1YPROffset.Yaw);
201+
myController.Pitch:=MyOffset(myController.Pitch, Ctrl1YPROffset.Pitch);
202+
myController.Roll:=MyOffset(myController.Roll, Ctrl1YPROffset.Roll);
203+
177204
//Controoler2 offset pos
178205
myController2.X:=myController2.X + Ctrl2PosOffset.X;
179206
myController2.Y:=myController2.Y + Ctrl2PosOffset.Y;
180207
myController2.Z:=myController2.Z + Ctrl2PosOffset.Z;
181208

209+
//Controller offset ypr
210+
myController2.Yaw:=MyOffset(myController2.Yaw, Ctrl2YPROffset.Yaw);
211+
myController2.Pitch:=MyOffset(myController2.Pitch, Ctrl2YPROffset.Pitch);
212+
myController2.Roll:=MyOffset(myController2.Roll, Ctrl2YPROffset.Roll);
213+
182214
if MyStat = StatCount then
183215
Result:=1
184216
else
@@ -235,34 +267,58 @@ begin
235267
HMDPosOffset.X:=StrToFloat(StringReplace(Ini.ReadString('HMD', 'OffsetX', '0'), '.', DecimalSeparator, [rfReplaceAll]));
236268
HMDPosOffset.Y:=StrToFloat(StringReplace(Ini.ReadString('HMD', 'OffsetY', '0'), '.', DecimalSeparator, [rfReplaceAll]));
237269
HMDPosOffset.Z:=StrToFloat(StringReplace(Ini.ReadString('HMD', 'OffsetZ', '0'), '.', DecimalSeparator, [rfReplaceAll]));
270+
271+
HMDYPROffset.Yaw:=StrToFloat(StringReplace(Ini.ReadString('HMD', 'OffsetYaw', '0'), '.', DecimalSeparator, [rfReplaceAll]));
272+
HMDYPROffset.Pitch:=StrToFloat(StringReplace(Ini.ReadString('HMD', 'OffsetPitch', '0'), '.', DecimalSeparator, [rfReplaceAll]));
273+
HMDYPROffset.Roll:=StrToFloat(StringReplace(Ini.ReadString('HMD', 'OffsetRoll', '0'), '.', DecimalSeparator, [rfReplaceAll]));
238274
except
239275
HMDPosOffset.X:=0;
240276
HMDPosOffset.Y:=0;
241277
HMDPosOffset.Z:=0;
278+
279+
HMDYPROffset.Yaw:=0;
280+
HMDYPROffset.Pitch:=0;
281+
HMDYPROffset.Roll:=0;
242282
end;
243283

244284
//Don't load the library more than once if the same
245285
if HMDPosDrvPath <> HMDRotDrvPath then HMDUseRot:=true;
246286

247-
//Controllers pos offset
287+
//Controllers pos and ypr offset
248288
try
249289
Ctrl1PosOffset.X:=StrToFloat(StringReplace(Ini.ReadString('Controller1', 'OffsetX', '0'), '.', DecimalSeparator, [rfReplaceAll]));
250290
Ctrl1PosOffset.Y:=StrToFloat(StringReplace(Ini.ReadString('Controller1', 'OffsetY', '0'), '.', DecimalSeparator, [rfReplaceAll]));
251291
Ctrl1PosOffset.Z:=StrToFloat(StringReplace(Ini.ReadString('Controller1', 'OffsetZ', '0'), '.', DecimalSeparator, [rfReplaceAll]));
292+
293+
Ctrl1YPROffset.Yaw:=StrToFloat(StringReplace(Ini.ReadString('Controller1', 'OffsetYaw', '0'), '.', DecimalSeparator, [rfReplaceAll]));
294+
Ctrl1YPROffset.Pitch:=StrToFloat(StringReplace(Ini.ReadString('Controller1', 'OffsetPitch', '0'), '.', DecimalSeparator, [rfReplaceAll]));
295+
Ctrl1YPROffset.Roll:=StrToFloat(StringReplace(Ini.ReadString('Controller1', 'OffsetRoll', '0'), '.', DecimalSeparator, [rfReplaceAll]));
252296
except
253297
Ctrl1PosOffset.X:=0;
254298
Ctrl1PosOffset.Y:=0;
255299
Ctrl1PosOffset.Z:=0;
300+
301+
Ctrl1YPROffset.Yaw:=0;
302+
Ctrl1YPROffset.Pitch:=0;
303+
Ctrl1YPROffset.Roll:=0;
256304
end;
257305

258306
try
259307
Ctrl2PosOffset.X:=StrToFloat(StringReplace(Ini.ReadString('Controller2', 'OffsetX', '0'), '.', DecimalSeparator, [rfReplaceAll]));
260308
Ctrl2PosOffset.Y:=StrToFloat(StringReplace(Ini.ReadString('Controller2', 'OffsetY', '0'), '.', DecimalSeparator, [rfReplaceAll]));
261309
Ctrl2PosOffset.Z:=StrToFloat(StringReplace(Ini.ReadString('Controller2', 'OffsetZ', '0'), '.', DecimalSeparator, [rfReplaceAll]));
310+
311+
Ctrl2YPROffset.Yaw:=StrToFloat(StringReplace(Ini.ReadString('Controller2', 'OffsetYaw', '0'), '.', DecimalSeparator, [rfReplaceAll]));
312+
Ctrl2YPROffset.Pitch:=StrToFloat(StringReplace(Ini.ReadString('Controller2', 'OffsetPitch', '0'), '.', DecimalSeparator, [rfReplaceAll]));
313+
Ctrl2YPROffset.Roll:=StrToFloat(StringReplace(Ini.ReadString('Controller2', 'OffsetRoll', '0'), '.', DecimalSeparator, [rfReplaceAll]));
262314
except
263315
Ctrl2PosOffset.X:=0;
264316
Ctrl2PosOffset.Y:=0;
265317
Ctrl2PosOffset.Z:=0;
318+
319+
Ctrl2YPROffset.Yaw:=0;
320+
Ctrl2YPROffset.Pitch:=0;
321+
Ctrl2YPROffset.Roll:=0;
266322
end;
267323

268324
CtrlsPosDrvPath:=Reg.ReadString('Drivers') + Ini.ReadString('Controllers', 'Position', '');

Delphi/SplitterAdvance/SplitterAdvance.ini

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
[HMD]
22
Position=Emulation.dll
33
Rotation=Emulation.dll
4+
45
OffsetX=0.0
56
OffsetY=0.0
67
OffsetZ=0.0
78

9+
OffsetYaw=0.0
10+
OffsetPitch=0.0
11+
OffsetRoll=0.0
12+
13+
814
[Controllers]
915
Position=Emulation.dll
1016
Rotation=Emulation.dll
@@ -15,7 +21,16 @@ OffsetX=0.0
1521
OffsetY=0.0
1622
OffsetZ=0.0
1723

24+
OffsetYaw=0.0
25+
OffsetPitch=0.0
26+
OffsetRoll=0.0
27+
28+
1829
[Controller2]
1930
OffsetX=0.0
2031
OffsetY=0.0
21-
OffsetZ=0.0
32+
OffsetZ=0.0
33+
34+
OffsetYaw=0.0
35+
OffsetPitch=0.0
36+
OffsetRoll=0.0

Delphi/SplitterAdvance/SplitterAdvance64.ini

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
[HMD]
22
Position=Emulation64.dll
33
Rotation=Emulation64.dll
4+
45
OffsetX=0.0
56
OffsetY=0.0
67
OffsetZ=0.0
78

9+
OffsetYaw=0.0
10+
OffsetPitch=0.0
11+
OffsetRoll=0.0
12+
13+
814
[Controllers]
915
Position=Emulation64.dll
1016
Rotation=Emulation64.dll
@@ -15,7 +21,16 @@ OffsetX=0.0
1521
OffsetY=0.0
1622
OffsetZ=0.0
1723

24+
OffsetYaw=0.0
25+
OffsetPitch=0.0
26+
OffsetRoll=0.0
27+
28+
1829
[Controller2]
1930
OffsetX=0.0
2031
OffsetY=0.0
21-
OffsetZ=0.0
32+
OffsetZ=0.0
33+
34+
OffsetYaw=0.0
35+
OffsetPitch=0.0
36+
OffsetRoll=0.0

0 commit comments

Comments
 (0)