Virtuell verklighet sport (6 / 8 steg)
Steg 6: Datorprylar
För att detta ska fungera måste den senaste versionen av GlovePIE (här), arduino programvaran om du har valt alternativ 1 (här), och ett spel att använda setup med.
Anslut först en wiimote till datorn med antingen inbyggda bluetooth eller en bluetooth dongle.
Sedan hämta GlovePIE och skapa en ny fil som heter IRloc.PIE
Mata in följande kod:
om var.loopUntil=0 {
var.startX=wiimote1. PointerX
var.startY=wiimote1. PointerY
var.SBD=wiimote1.z
var. ButtonFreezeTime = 250ms
var. PointerBump = KeepDown (tryckt (wiimote1. En), var. ButtonFreezeTime) eller KeepDown (tryckt (wiimote1. B), var. ButtonFreezeTime)
Wiimote1.Led1 = sant
Wiimote1.Led2 = sant
Wiimote1.Led3 = sant
Wiimote1.Led4 = sant
wait(10ms)
var.difX= (wiimote1. PointerX-var.startX)
var.difY= (wiimote1. PointerY-var.startY)
var.err = 15
om wiimote.dot1vis och wiimote.dot2vis och inte var. IgnoreSensorBar {
om var. UsedIR = falskt {
[var. Hold_x, var. Hold_y] = [0, 0]
[var. Recenter_x, var. Recenter_y] = [0, 0]
var. UsedIR = sant
}
var.irDot1_xy = [(512 - wiimote.dot1x) / 1024, (wiimote.dot1y - 384) / 768]
var.irDot2_xy = [(512 - wiimote.dot2x) / 1024, (wiimote.dot2y - 384) / 768]
[var.irMid_x, var.irMid_y] = (var.irDot1_xy + var.irDot2_xy) / 2
var.irMid_angle = ARCTAN2 (var.irMid_x, var.irMid_y)
var.irMid_length = [var.irMid_x, var.irMid_y]
var.irNew_angle = var.irMid_angle - var. Rulle
var.irNew_xy = [sin(var.irNew_angle), cos(var.irNew_angle)] * |var.irMid_length|
[var.ir_x, var.ir_y] = var.irNew_xy + [5, 5.]
var.irSpeed_x = var.irSpeed_x * 8 + abs(delta(var.ir_x)) * 1000
var.irSpeed_y = var.irSpeed_y * 8 + abs(delta(var.ir_y)) * 1000
var.irSpeed_xy = [var.irSpeed_x, var.irSpeed_y]
om (var.irSpeed_x < 40 och var.wmSpeed_x < 40) {
om ((var.ir_x < var.irMin_x) eller (var. MinMax_x = 2 och (var.irMax_x - var.ir_x) > =.15)) och ((var.wmMax_x-var.wm_x) >.075) {
[var.wmMin_x, var.irMin_x] = [var.wm_x, var.ir_x]
var. MinMax_x = 1
}
om ((var.ir_x > var.irMax_x) eller (var. MinMax_x = 1 och (var.ir_x - var.irMin_x) > =.15)) och ((var.wm_x-var.wmMin_x) >.075) {
[var.wmMax_x, var.irMax_x] = [var.wm_x, var.ir_x]
var. MinMax_x = 2
}
}
om (var.irSpeed_y < 40 och var.wmSpeed_y < 40) {
om ((var.ir_y < var.irMin_y) eller (var. MinMax_y = 2 och (var.irMax_y - var.ir_y) > =.15)) och ((var.wmMax_y-var.wm_y) >.075) {
[var.wmMin_y, var.irMin_y] = [var.wm_y, var.ir_y]
var. MinMax_y = 1
}
om ((var.ir_y > var.irMax_y) eller (var. MinMax_y = 1 och (var.ir_y - var.irMin_y) > =.15)) och ((var.wm_y-var.wmMin_y) >.075) {
[var.wmMax_y, var.irMax_y] = [var.wm_y, var.ir_y]
var. MinMax_y = 2
}
}
om var. WMIR_switch = 1 {
[var. IR_adj_x, var. IR_adj_y] = [var. Old_WM_x, var. Old_WM_y] - [var.ir_x, var.ir_y]
var. WMIR_switch = 0
}
om var. WMIR_switch = 0 {
[var. Rough_x, var. Rough_y] = ([var.ir_x, var.ir_y] + [var. IR_adj_x, var. IR_adj_y] - [5,.5]) * var. NewZoom + [5, 5.]
[var. WMIR_x, var. WMIR_y] = [var.wmNew_x, var.wmNew_y] - [var.ir_x, var.ir_y]
var. WMIR_xy = [var. WMIR_x, var. WMIR_y]
var. IR_adj_c = 1 - EnsureRange (|var. WMIR_xy|, 0, 5) / 5
[var. IR_adj_x, var. IR_adj_y] = [var. IR_adj_x, var. IR_adj_y] * var. IR_adj_c
}
[var. WMIR_cal_x, var. WMIR_cal_y] = [var.wm_x, var.wm_y] - [var.ir_x, var.ir_y]
annat
[var. Rough_x, var. Rough_y] = ([var.wmNew_x, var.wmNew_y] - [var. WMIR_x, var. WMIR_y] + [var. IR_adj_x, var. IR_adj_y] - [5,.5]) * var. NewZoom + [5, 5.]
[var. Old_WM_x, var. Old_WM_y] = ([var. Rough_x, var. Rough_y] - [5,.5]) / var. NewZoom + [5, 5.]
var. WMIR_switch = 1
var. WMIR_xy = [0, 0]
om var.started = true och var.wmCalON = falskt då [var.ir_x, var.ir_y] = ([var. Smooth_x, var. Smooth_y] - [5,.5]) / var. NewZoom + [5, 5.]
}
IF(var.loopCount<10) {
var.xs=var. StartX
var.ys=var. StartY
}
var.totalDistX=(var.xs-var.StartX) * 10
var.totalDistY=(var.ys-var.StartY) * 10
var. TDXS = 0
var. TDYS = 0
var.TX=var. TDXS-var.totalDistX
var.ty=var. TDYS-var.totalDistY
Felsöka = "XDist:"+ var.tx+"YDist:"+ var.ty+"BDist:" + wiimote. PointerVisible
var.loopCount=var.loopCount+1
om wiimote. PointerVisible = 0 {
var.inC=var.inC+1
}
om var.inC > 30 {
var.loopUntil=.01
}
}
}
var.LR=0
om var.tx > 1,75 {
var.LR=1
}
om var.tx <-1.75 {
var.LR=-1
}
var.UD=-1
om var.ty > 1,6
var.UD=0
}
om var.ty > 2.6
var.UD=1
}
om var.loopUntil!=0 {
Felsöka = "LR:"+ var.lr+"UD:" +var.ud
var.loopUntil=0
}
om var.inC=31 {
om var.lr=-1 och var.ud=1 {
Tryck på numpad1
vänta 1ms
release numpad1
}
om var.lr=-1 och var.ud=0 {
Tryck på numpad2
vänta 1ms
release numpad2
}
om var.lr=-1 och var.ud=-1 {
Tryck på numpad3
vänta 1ms
release numpad3
}
om var.lr=0 och var.ud=1 {
Tryck på numpad4
vänta 1ms
release numpad4
}
om var.lr=0 och var.ud=0 {
Tryck på numpad5
vänta 1ms
release numpad5
}
om var.lr=0 och var.ud=-1 {
Tryck på numpad6
vänta 1ms
release numpad6
}
om var.lr=1 och var.ud=1 {
Tryck på numpad7
vänta 1ms
release numpad7
}
om var.lr=1 och var.ud=0 {
Tryck på numpad8
vänta 1ms
release numpad8
}
om var.lr=1 och var.ud=-1 {
Tryck på numpad9
vänta 1ms
release numpad9
Tryck på SKIFT
}
}
om pressed(key.enter) {
var.loopUntil=0
var.inC=0
}
Här är en snabb förklaring av programmet och hur man använder det:
När du först köra programmet, se till den infraröda sensorn kan "se" de IR-lysdioder avger ljus. Det börjar med en visning på debug panelen ovan som lyder "XDist: 0.00 YDist: 0.00 BDist: 1.00"
Om den dubbla värdet 1,00 för BDist visar 0.00 sedan identifiera IR sensorn inte infraröd ljuskälla. När en källa har identifierats, kommer att det kalibrera förflyttning av bollen och utgång tangentbord värden 1-9 beroende på beräknad 3D-positionering. När ljuskällan kan inte längre ses av IR-sensorn, displayen debug "LR: värde UD: värde" där värdet ersättas med ett heltal mellan -1 och 1.
Detta visar den totala placering av "boll" i ett 3 x 3 kvadrat rutnät liknande den som visas i diagrammet.
Efter det är kontrollera glovePIE programvara lätt. När du kör programvaran, vänta tills BDist är på 1 och sedan sparka bollen förbi den infraröd sensorn. Detta kommer att utlösa en debug positionering och sedan i sin tur utlösa en numerisk tangentbord utgång 1-9 beroende på den beräknade positionen. Du kan nu integrera detta i en spelmiljö genom att skapa ett spel som använder en 9 värde ingång eller du kan meddelande mig för ett spel som jag skapat specifikt för detta projekt genom att klicka här.