-
Notifications
You must be signed in to change notification settings - Fork 1
/
car.js
121 lines (92 loc) · 3.3 KB
/
car.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// STATO DELLA MACCHINA
// (DoStep fa evolvere queste variabili nel tempo)
var px,py,pz,facing; // posizione e orientamento
var mozzoA, mozzoP, sterzo; // stato interno
var vx,vy,vz; // velocita' attuale
//queste di solito rimangono costanti
var velSterzo, velRitornoSterzo, accMax, attrito,raggioRuotaA, raggioRuotaP, grip,attritoX, attritoY, attritoZ;
//DoStep: facciamo un passo di fisica (a delta-t costante)
function CarDoStep(){
//computiamo l'evolversi della macchina
var vxm, vym, vzm; // velocita' in spazio macchina
//da vel frame mondo a vel frame macchina
var cosf = Math.cos(facing*Math.PI/180.0);
var sinf = Math.sin(facing*Math.PI/180.0);
vxm = +cosf*vx - sinf*vz;
vym = vy;
vzm = +sinf*vx + cosf*vz;
//console.log(gamepad);
if(!gamepad){
// gestione dello sterzo
if (key[1]) sterzo+=velSterzo;
if (key[3]) sterzo-=velSterzo;
sterzo*=velRitornoSterzo; //ritorno a volante fermo
if (key[0]) vzm-=accMax; //accelerazione in avanti
if (key[2]) vzm+=accMax; //accelerazione indietro
}else{
gp = navigator.getGamepads()[0];
//console.log(gp.axes[0]);
if(gp!=null){
//analogico
sterzo-=gp.axes[0];
sterzo-=gp.axes[2];
sterzo*=velRitornoSterzo; // ritorno a volante fermo
if(gp.axes[1]==gp_start && gp.axes[5]==gp_start){
vzm+=0;
}else{
if((gp.axes[1]+gp.axes[5]-gp_start)<=1 && (gp.axes[1]+gp.axes[5]-gp_start)>=-1){
vzm+=accMax*gp.axes[1];
vzm+=accMax*gp.axes[5];
}
}
//freccette
if(gp.buttons[12].value==1)vzm-=accMax;
if(gp.buttons[14].value==1)vzm+=accMax;
if(gp.buttons[13].value==1)sterzo-=velSterzo;
if(gp.buttons[15].value==1)sterzo+=velSterzo;
}
}
// attriti (semplificando)
vxm*=attritoX;
vym*=attritoY;
vzm*=attritoZ;
// l'orientamento della macchina segue quello dello sterzo
// (a seconda della velocita' sulla z)
facing = facing - (vzm*grip)*sterzo;
// rotazione mozzo ruote (a seconda della velocita' sulla z)
var da ; //delta angolo
da=(180.0*vzm)/(Math.PI*raggioRuotaA);
mozzoA+=da;
da=(180.0*vzm)/(Math.PI*raggioRuotaP);
mozzoP+=da;
//ritorno a vel coord mondo
vx = +cosf*vxm + sinf*vzm;
vy = vym;
vz = -sinf*vxm + cosf*vzm;
//posizione = posizione + velocita * delta t (ma e' delta t costante)
px+=vx;
py+=vy;
pz+=vz;
}
function CarInit(){
// inizializzo lo stato della macchina
px=py=pz=facing=0; // posizione e orientamento
mozzoA=mozzoP=sterzo=0; // stato
vx=vy=vz=0; // velocita' attuale
key=[false,false,false,false]; // inizializzo la struttura di controllo
//velSterzo=3.4; // A
velSterzo=1.0; // A
velRitornoSterzo=0.93; // B, sterzo massimo = A*B / (1-B)
accMax = 0.0022;
//accMax = 0.0055;
// attriti: percentuale di velocita' che viene mantenuta
// 1 = no attrito
// <<1 = attrito grande
attritoZ = 0.991; //piccolo attrito sulla Z (nel senso di rotolamento delle ruote)
attritoX = 0.8; //grande attrito sulla X (per non fare slittare la macchina)
attritoY = 1.0; //attrito sulla y nullo
// Nota: vel max = accMax*attritoZ / (1-attritoZ)
raggioRuotaA = 0.25;
raggioRuotaP = 0.30;
grip = 0.2; //quanto il facing macchina si adegua velocemente allo sterzo
}