Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
erp5
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Labels
Merge Requests
137
Merge Requests
137
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Jobs
Commits
Open sidebar
nexedi
erp5
Commits
37d0a9bd
Commit
37d0a9bd
authored
Jul 30, 2024
by
Léo-Paul Géneau
👾
Browse files
Options
Browse Files
Download
Plain Diff
erp5_officejs_drone_capture_flag: fix projection proportionality
See merge request
nexedi/erp5!1959
parents
40aad952
3c4eeac8
Pipeline
#36156
failed with stage
in 0 seconds
Changes
8
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
352 additions
and
266 deletions
+352
-266
bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/drone_capture_flag_logic_js.js
...mplateItem/web_page_module/drone_capture_flag_logic_js.js
+26
-26
bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/drone_capture_flag_logic_js.xml
...plateItem/web_page_module/drone_capture_flag_logic_js.xml
+2
-2
bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/drone_capture_flag_map_utils_js.js
...teItem/web_page_module/drone_capture_flag_map_utils_js.js
+149
-137
bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/drone_capture_flag_map_utils_js.xml
...eItem/web_page_module/drone_capture_flag_map_utils_js.xml
+2
-2
bt5/erp5_officejs_drone_capture_flag_test/PathTemplateItem/portal_tests/drone_capture_flag_ui_site_zuite/testDroneCaptureFlagFlight.zpt
...capture_flag_ui_site_zuite/testDroneCaptureFlagFlight.zpt
+5
-5
bt5/erp5_officejs_drone_simulator/PathTemplateItem/web_page_module/drone_simulator_logic_js.js
...hTemplateItem/web_page_module/drone_simulator_logic_js.js
+161
-87
bt5/erp5_officejs_drone_simulator/PathTemplateItem/web_page_module/drone_simulator_logic_js.xml
...TemplateItem/web_page_module/drone_simulator_logic_js.xml
+2
-2
bt5/erp5_officejs_drone_simulator_test/PathTemplateItem/portal_tests/drone_simulator_ui_site_zuite/testDroneSimulatorFlight.zpt
...rone_simulator_ui_site_zuite/testDroneSimulatorFlight.zpt
+5
-5
No files found.
bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/drone_capture_flag_logic_js.js
View file @
37d0a9bd
...
...
@@ -524,14 +524,11 @@ var MapManager = /** @class */ (function () {
_this
.
map_info
.
initial_position
.
longitude
,
_this
.
map_info
.
initial_position
.
altitude
);
max
=
_this
.
map_info
.
width
;
if
(
_this
.
map_info
.
depth
>
max
)
{
max
=
_this
.
map_info
.
depth
;
}
if
(
_this
.
map_info
.
height
>
max
)
{
max
=
_this
.
map_info
.
height
;
}
max
=
max
<
_this
.
map_info
.
depth
?
_this
.
map_info
.
depth
:
max
;
max
=
Math
.
max
(
_this
.
map_info
.
depth
,
_this
.
map_info
.
height
,
_this
.
map_info
.
width
);
// Skybox
max_sky
=
(
max
*
15
<
20000
)
?
max
*
15
:
20000
;
//skybox scene limit
skybox
=
BABYLON
.
MeshBuilder
.
CreateBox
(
"
skyBox
"
,
{
size
:
max_sky
},
scene
);
...
...
@@ -558,13 +555,13 @@ var MapManager = /** @class */ (function () {
largeGroundBottom
.
renderingGroupId
=
1
;
// Terrain
// Give map some margin from the flight limits
width
=
_this
.
map_info
.
width
*
1.
1
0
;
depth
=
_this
.
map_info
.
depth
*
1.
1
0
;
width
=
_this
.
map_info
.
width
*
1.
3
0
;
depth
=
_this
.
map_info
.
depth
*
1.
3
0
;
//height = _this.map_info.height;
terrain
=
scene
.
getMeshByName
(
"
terrain001
"
);
terrain
.
isVisible
=
true
;
terrain
.
position
=
BABYLON
.
Vector3
.
Zero
();
terrain
.
scaling
=
new
BABYLON
.
Vector3
(
depth
/
50000
,
depth
/
50000
,
terrain
.
scaling
=
new
BABYLON
.
Vector3
(
depth
/
50000
,
_this
.
map_info
.
height
/
50000
,
width
/
50000
);
// Enemies
_this
.
_enemy_list
=
[];
...
...
@@ -697,12 +694,6 @@ var MapManager = /** @class */ (function () {
MapManager
.
prototype
.
latLonDistance
=
function
(
c1
,
c2
)
{
return
this
.
mapUtils
.
latLonDistance
(
c1
,
c2
);
};
MapManager
.
prototype
.
longitudToX
=
function
(
lon
)
{
return
this
.
mapUtils
.
longitudToX
(
lon
);
};
MapManager
.
prototype
.
latitudeToY
=
function
(
lat
)
{
return
this
.
mapUtils
.
latitudeToY
(
lat
);
};
MapManager
.
prototype
.
convertToLocalCoordinates
=
function
(
latitude
,
longitude
,
altitude
)
{
return
this
.
mapUtils
.
convertToLocalCoordinates
(
...
...
@@ -862,12 +853,14 @@ var GameManager = /** @class */ (function () {
GameManager
.
prototype
.
_checkDroneOut
=
function
(
drone
)
{
if
(
drone
.
position
)
{
var
map_limit
=
this
.
_mapManager
.
getMapInfo
().
map_size
/
2
;
return
(
drone
.
position
.
z
>
this
.
_mapManager
.
getMapInfo
().
height
)
||
(
drone
.
position
.
x
<
-
map_limit
)
||
(
drone
.
position
.
x
>
map_limit
)
||
(
drone
.
position
.
y
<
-
map_limit
)
||
(
drone
.
position
.
y
>
map_limit
);
var
map_info
=
this
.
_mapManager
.
getMapInfo
(),
width_limit
=
map_info
.
width
/
2
,
depth_limit
=
map_info
.
depth
/
2
;
return
(
drone
.
position
.
z
>
map_info
.
height
)
||
(
drone
.
position
.
x
<
-
width_limit
)
||
(
drone
.
position
.
x
>
width_limit
)
||
(
drone
.
position
.
y
<
-
depth_limit
)
||
(
drone
.
position
.
y
>
depth_limit
);
}
};
...
...
@@ -1159,7 +1152,12 @@ var GameManager = /** @class */ (function () {
GameManager
.
prototype
.
_init
=
function
()
{
var
_this
=
this
,
canvas
,
hemi_north
,
hemi_south
,
camera
,
cam_radius
,
on3DmodelsReady
,
map_size
=
900
;
//GAMEPARAMETERS.map.map_size
on3DmodelsReady
,
mapUtils
=
new
MapUtils
(
GAMEPARAMETERS
.
map
),
map_size
=
Math
.
max
(
mapUtils
.
map_info
.
depth
,
mapUtils
.
map_info
.
height
,
mapUtils
.
map_info
.
width
);
canvas
=
this
.
_canvas
;
this
.
_delayed_defer_list
=
[];
this
.
_dispose
();
...
...
@@ -1196,9 +1194,11 @@ var GameManager = /** @class */ (function () {
this
.
_scene
);
hemi_south
.
intensity
=
0.75
;
//HARDCODE camera to a hardcoded map_size
//skybox scene limit
cam_radius
=
(
map_size
*
1.10
<
6000
)
?
map_size
*
1.10
:
6000
;
cam_radius
=
Math
.
min
(
1.10
*
Math
.
sqrt
(
mapUtils
.
map_info
.
width
*
mapUtils
.
map_info
.
depth
),
6000
);
camera
=
new
BABYLON
.
ArcRotateCamera
(
"
camera
"
,
0
,
1.25
,
cam_radius
,
BABYLON
.
Vector3
.
Zero
(),
this
.
_scene
);
camera
.
wheelPrecision
=
10
;
...
...
bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/drone_capture_flag_logic_js.xml
View file @
37d0a9bd
...
...
@@ -246,7 +246,7 @@
</item>
<item>
<key>
<string>
serial
</string>
</key>
<value>
<string>
101
6.21978.22579.46609
</string>
</value>
<value>
<string>
101
7.22735.36044.31948
</string>
</value>
</item>
<item>
<key>
<string>
state
</string>
</key>
...
...
@@ -266,7 +266,7 @@
</tuple>
<state>
<tuple>
<float>
171
4742387.62
</float>
<float>
171
8719762.65
</float>
<string>
UTC
</string>
</tuple>
</state>
...
...
bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/drone_capture_flag_map_utils_js.js
View file @
37d0a9bd
/*jslint nomen: true, indent: 2, maxlen: 80, todo: true, unparam: true */
/******************************* MAP UTILS ************************************/
var
MapUtils
=
/** @class */
(
function
()
{
...
...
@@ -7,13 +9,7 @@ var MapUtils = /** @class */ (function () {
//** CONSTRUCTOR
function
MapUtils
(
map_param
)
{
var
_this
=
this
,
max_width
=
_this
.
latLonDistance
(
[
map_param
.
min_lat
,
map_param
.
min_lon
],
[
map_param
.
min_lat
,
map_param
.
max_lon
]),
max_depth
=
_this
.
latLonDistance
(
[
map_param
.
min_lat
,
map_param
.
min_lon
],
[
map_param
.
max_lat
,
map_param
.
min_lon
]),
map_size
=
Math
.
ceil
(
Math
.
max
(
max_width
,
max_depth
));
var
_this
=
this
;
_this
.
map_param
=
{};
_this
.
map_param
.
height
=
map_param
.
height
;
_this
.
map_param
.
start_AMSL
=
map_param
.
start_AMSL
;
...
...
@@ -21,15 +17,19 @@ var MapUtils = /** @class */ (function () {
_this
.
map_param
.
max_lat
=
map_param
.
max_lat
;
_this
.
map_param
.
min_lon
=
map_param
.
min_lon
;
_this
.
map_param
.
max_lon
=
map_param
.
max_lon
;
_this
.
map_param
.
depth
=
map_size
;
_this
.
map_param
.
width
=
map_size
;
_this
.
map_param
.
map_size
=
map_size
;
_this
.
map_param
.
depth
=
_this
.
latLonDistance
(
[
map_param
.
min_lat
,
map_param
.
min_lon
],
[
map_param
.
max_lat
,
map_param
.
min_lon
]
);
_this
.
map_param
.
width
=
_this
.
latLonDistance
(
[
map_param
.
min_lat
,
map_param
.
min_lon
],
[
map_param
.
min_lat
,
map_param
.
max_lon
]
);
_this
.
map_info
=
{
"
depth
"
:
_this
.
map_param
.
depth
,
"
width
"
:
_this
.
map_param
.
width
,
"
flag_distance_epsilon
"
:
map_param
.
flag_distance_epsilon
||
FLAG_EPSILON
};
_this
.
map_info
.
map_size
=
_this
.
map_param
.
map_size
;
_this
.
map_info
.
height
=
_this
.
map_param
.
height
;
_this
.
map_info
.
start_AMSL
=
_this
.
map_param
.
start_AMSL
;
_this
.
map_info
.
min_x
=
_this
.
longitudToX
(
map_param
.
min_lon
);
...
...
@@ -50,10 +50,10 @@ var MapUtils = /** @class */ (function () {
return
R
*
c
;
};
MapUtils
.
prototype
.
longitudToX
=
function
(
lon
)
{
return
(
this
.
map_info
.
map_size
/
360.0
)
*
(
180
+
lon
);
return
(
this
.
map_info
.
width
/
360.0
)
*
(
180
+
lon
);
};
MapUtils
.
prototype
.
latitudeToY
=
function
(
lat
)
{
return
(
this
.
map_info
.
map_size
/
180.0
)
*
(
90
-
lat
);
return
(
this
.
map_info
.
depth
/
180.0
)
*
(
90
-
lat
);
};
MapUtils
.
prototype
.
convertToLocalCoordinates
=
function
(
latitude
,
longitude
,
altitude
)
{
...
...
@@ -61,24 +61,22 @@ var MapUtils = /** @class */ (function () {
x
=
this
.
longitudToX
(
longitude
),
y
=
this
.
latitudeToY
(
latitude
);
return
{
x
:
((
x
-
map_info
.
min_x
)
/
(
map_info
.
max_x
-
map_info
.
min_x
))
*
1000
-
map_info
.
width
/
2
,
y
:
((
y
-
map_info
.
min_y
)
/
(
map_info
.
max_y
-
map_info
.
min_y
))
*
1000
-
map_info
.
depth
/
2
,
x
:
((
(
x
-
map_info
.
min_x
)
/
(
map_info
.
max_x
-
map_info
.
min_x
))
-
0.5
)
*
map_info
.
width
,
y
:
((
(
y
-
map_info
.
min_y
)
/
(
map_info
.
max_y
-
map_info
.
min_y
))
-
0.5
)
*
map_info
.
depth
,
z
:
altitude
};
};
MapUtils
.
prototype
.
convertToGeoCoordinates
=
function
(
x
,
y
,
z
)
{
var
lon
=
x
+
this
.
map_info
.
width
/
2
,
lat
=
y
+
this
.
map_info
.
depth
/
2
;
lon
=
lon
/
1000
;
var
lon
=
(
x
/
this
.
map_info
.
width
)
+
0.5
,
lat
=
(
y
/
this
.
map_info
.
depth
)
+
0.5
;
lon
=
lon
*
(
this
.
map_info
.
max_x
-
this
.
map_info
.
min_x
)
+
this
.
map_info
.
min_x
;
lon
=
lon
/
(
this
.
map_info
.
map_size
/
360.0
)
-
180
;
lat
=
lat
/
1000
;
lon
=
lon
/
(
this
.
map_info
.
width
/
360.0
)
-
180
;
lat
=
lat
*
(
this
.
map_info
.
max_y
-
this
.
map_info
.
min_y
)
+
this
.
map_info
.
min_y
;
lat
=
90
-
lat
/
(
this
.
map_info
.
map_size
/
180.0
);
lat
=
90
-
lat
/
(
this
.
map_info
.
depth
/
180.0
);
return
{
latitude
:
lat
,
longitude
:
lon
,
...
...
@@ -127,11 +125,11 @@ var MapUtils = /** @class */ (function () {
function
fillObstacleList
(
list
,
min_x
,
min_y
,
max_x
,
max_y
)
{
var
i
,
el
,
result_list
=
[];
for
(
i
=
0
;
i
<
list
.
length
;
i
+=
1
)
{
el
=
{
"
position
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
z
"
:
0
},
"
scale
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
z
"
:
0
},
"
type
"
:
list
[
i
].
type
};
el
=
{
"
position
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
z
"
:
0
},
"
scale
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
z
"
:
0
},
"
type
"
:
list
[
i
].
type
};
if
(
list
[
i
].
rotation
)
{
el
.
rotation
=
{
"
x
"
:
list
[
i
].
rotation
.
x
,
"
y
"
:
list
[
i
].
rotation
.
y
,
"
z
"
:
list
[
i
].
rotation
.
z
};
...
...
@@ -149,133 +147,142 @@ var MapUtils = /** @class */ (function () {
return
result_list
;
}
return
{
"
flag_list
"
:
fillFlagList
(
template
.
flag_list
,
min_x
,
min_y
,
max_x
,
max_y
),
"
obstacle_list
"
:
fillObstacleList
(
template
.
obstacle_list
,
min_x
,
min_y
,
max_x
,
max_y
),
"
enemy_list
"
:
fillEnemyList
(
template
.
enemy_list
,
min_x
,
min_y
,
max_x
,
max_y
)
"
flag_list
"
:
fillFlagList
(
template
.
flag_list
,
min_x
,
min_y
,
max_x
,
max_y
),
"
obstacle_list
"
:
fillObstacleList
(
template
.
obstacle_list
,
min_x
,
min_y
,
max_x
,
max_y
),
"
enemy_list
"
:
fillEnemyList
(
template
.
enemy_list
,
min_x
,
min_y
,
max_x
,
max_y
)
};
}
// 4x4 grid
var
GRID
=
4
,
i
,
j
,
map_size
=
this
.
map_info
.
map_size
,
initial_block
,
x1
,
y1
,
x2
,
y2
,
block_result
,
index
,
block_size
=
map_size
/
GRID
,
var
GRID
=
4
,
i
,
j
,
max_width
=
this
.
map_info
.
width
,
max_depth
=
this
.
map_info
.
depth
,
initial_block
,
x1
,
y1
,
x2
,
y2
,
block_result
,
index
,
block_size
=
Math
.
max
(
max_width
,
max_depth
)
/
GRID
,
result_map
,
BLOCK_TEMPLATE_LIST
=
[{
"
flag_list
"
:
[{
"
position
"
:
{
"
x
"
:
50
,
"
y
"
:
50
,
"
z
"
:
10
},
"
score
"
:
1
,
"
weight
"
:
1
}],
"
obstacle_list
"
:
[{
"
type
"
:
"
box
"
,
"
position
"
:
{
"
x
"
:
50
,
"
y
"
:
70
,
"
z
"
:
20
},
"
scale
"
:
{
"
x
"
:
80
,
"
y
"
:
4
,
"
z
"
:
40
},
"
rotation
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
z
"
:
0
}}],
"
enemy_list
"
:
[{
"
type
"
:
"
EnemyDroneAPI
"
,
"
position
"
:
{
"
x
"
:
50
,
"
y
"
:
30
,
"
z
"
:
10
}}
]
},
{
"
flag_list
"
:
[],
"
obstacle_list
"
:
[{
"
type
"
:
"
box
"
,
"
position
"
:
{
"
x
"
:
20
,
"
y
"
:
65
,
"
z
"
:
20
},
"
scale
"
:
{
"
x
"
:
4
,
"
y
"
:
70
,
"
z
"
:
40
},
"
rotation
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
z
"
:
0
}},
"
flag_list
"
:
[{
"
position
"
:
{
"
x
"
:
50
,
"
y
"
:
50
,
"
z
"
:
10
},
"
score
"
:
1
,
"
weight
"
:
1
}],
"
obstacle_list
"
:
[{
"
type
"
:
"
box
"
,
"
position
"
:
{
"
x
"
:
50
,
"
y
"
:
70
,
"
z
"
:
20
},
"
scale
"
:
{
"
x
"
:
80
,
"
y
"
:
4
,
"
z
"
:
40
},
"
rotation
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
z
"
:
0
}}],
"
enemy_list
"
:
[{
"
type
"
:
"
EnemyDroneAPI
"
,
"
position
"
:
{
"
x
"
:
50
,
"
y
"
:
30
,
"
z
"
:
10
}}
]
},
{
"
flag_list
"
:
[],
"
obstacle_list
"
:
[{
"
type
"
:
"
box
"
,
"
position
"
:
{
"
x
"
:
20
,
"
y
"
:
65
,
"
z
"
:
20
},
"
scale
"
:
{
"
x
"
:
4
,
"
y
"
:
70
,
"
z
"
:
40
},
"
rotation
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
z
"
:
0
}},
{
"
type
"
:
"
box
"
,
"
position
"
:
{
"
x
"
:
50
,
"
y
"
:
35
,
"
z
"
:
20
},
"
scale
"
:
{
"
x
"
:
4
,
"
y
"
:
70
,
"
z
"
:
40
},
"
rotation
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
z
"
:
0
}},
{
"
type
"
:
"
box
"
,
"
position
"
:
{
"
x
"
:
80
,
"
y
"
:
65
,
"
z
"
:
20
},
"
scale
"
:
{
"
x
"
:
4
,
"
y
"
:
70
,
"
z
"
:
40
},
"
rotation
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
z
"
:
0
}}],
"
enemy_list
"
:
[]
},
{
"
flag_list
"
:
[],
"
obstacle_list
"
:
[{
"
type
"
:
"
mountain
"
,
"
position
"
:
{
"
x
"
:
50
,
"
y
"
:
50
,
"
z
"
:
200
},
"
scale
"
:
{
"
x
"
:
80
,
"
y
"
:
80
,
"
z
"
:
400
}
//this.map_info.height?
}],
"
enemy_list
"
:
[]
},
{
"
flag_list
"
:
[],
"
obstacle_list
"
:
[],
"
enemy_list
"
:
[{
"
type
"
:
"
EnemyDroneAPI
"
,
"
position
"
:
{
"
x
"
:
20
,
"
y
"
:
20
,
"
z
"
:
10
}},
{
"
type
"
:
"
EnemyDroneAPI
"
,
"
position
"
:
{
"
x
"
:
20
,
"
y
"
:
80
,
"
z
"
:
10
}},
{
"
type
"
:
"
EnemyDroneAPI
"
,
"
position
"
:
{
"
x
"
:
80
,
"
y
"
:
20
,
"
z
"
:
10
}},
{
"
type
"
:
"
EnemyDroneAPI
"
,
"
position
"
:
{
"
x
"
:
80
,
"
y
"
:
80
,
"
z
"
:
10
}}]
},
{
"
flag_list
"
:
[{
"
position
"
:
{
"
x
"
:
50
,
"
y
"
:
50
,
"
z
"
:
10
},
"
score
"
:
1
,
"
weight
"
:
1
}],
"
obstacle_list
"
:
[],
"
enemy_list
"
:
[]
},
{
"
flag_list
"
:
[{
"
position
"
:
{
"
x
"
:
50
,
"
y
"
:
50
,
"
z
"
:
10
},
"
score
"
:
1
,
"
weight
"
:
1
}],
"
obstacle_list
"
:
[],
"
enemy_list
"
:
[{
"
type
"
:
"
EnemyDroneAPI
"
,
"
position
"
:
{
"
x
"
:
50
,
"
y
"
:
20
,
"
z
"
:
10
}},
{
"
type
"
:
"
EnemyDroneAPI
"
,
"
position
"
:
{
"
x
"
:
50
,
"
y
"
:
80
,
"
z
"
:
10
}}]
},
{
"
flag_list
"
:
[{
"
position
"
:
{
"
x
"
:
50
,
"
y
"
:
50
,
"
z
"
:
10
},
"
score
"
:
1
,
"
weight
"
:
1
}],
"
obstacle_list
"
:
[{
"
type
"
:
"
box
"
,
"
position
"
:
{
"
x
"
:
50
,
"
y
"
:
10
,
"
z
"
:
25
},
"
scale
"
:
{
"
x
"
:
80
,
"
y
"
:
2
,
"
z
"
:
50
},
"
rotation
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
z
"
:
0
}},
{
"
type
"
:
"
box
"
,
"
position
"
:
{
"
x
"
:
10
,
"
y
"
:
50
,
"
z
"
:
25
},
"
scale
"
:
{
"
x
"
:
2
,
"
y
"
:
80
,
"
z
"
:
50
},
"
rotation
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
z
"
:
0
}},
{
"
type
"
:
"
box
"
,
"
position
"
:
{
"
x
"
:
50
,
"
y
"
:
35
,
"
z
"
:
20
},
"
scale
"
:
{
"
x
"
:
4
,
"
y
"
:
70
,
"
z
"
:
4
0
},
"
rotation
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
z
"
:
0
}},
"
position
"
:
{
"
x
"
:
50
,
"
y
"
:
90
,
"
z
"
:
25
},
"
scale
"
:
{
"
x
"
:
80
,
"
y
"
:
2
,
"
z
"
:
5
0
},
"
rotation
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
z
"
:
0
}},
{
"
type
"
:
"
box
"
,
"
position
"
:
{
"
x
"
:
80
,
"
y
"
:
65
,
"
z
"
:
20
},
"
scale
"
:
{
"
x
"
:
4
,
"
y
"
:
70
,
"
z
"
:
40
},
"
rotation
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
z
"
:
0
}}],
"
enemy_list
"
:
[]
},
{
"
flag_list
"
:
[],
"
obstacle_list
"
:
[{
"
type
"
:
"
mountain
"
,
"
position
"
:
{
"
x
"
:
50
,
"
y
"
:
50
,
"
z
"
:
200
},
"
scale
"
:
{
"
x
"
:
80
,
"
y
"
:
80
,
"
z
"
:
400
}
//this.map_info.height?
}],
"
enemy_list
"
:
[]
},
{
"
flag_list
"
:
[],
"
obstacle_list
"
:
[],
"
enemy_list
"
:
[{
"
type
"
:
"
EnemyDroneAPI
"
,
"
position
"
:
{
"
x
"
:
20
,
"
y
"
:
20
,
"
z
"
:
10
}},
{
"
type
"
:
"
EnemyDroneAPI
"
,
"
position
"
:
{
"
x
"
:
20
,
"
y
"
:
80
,
"
z
"
:
10
}},
{
"
type
"
:
"
EnemyDroneAPI
"
,
"
position
"
:
{
"
x
"
:
80
,
"
y
"
:
20
,
"
z
"
:
10
}},
{
"
type
"
:
"
EnemyDroneAPI
"
,
"
position
"
:
{
"
x
"
:
80
,
"
y
"
:
80
,
"
z
"
:
10
}}]
},
{
"
flag_list
"
:
[{
"
position
"
:
{
"
x
"
:
50
,
"
y
"
:
50
,
"
z
"
:
10
},
"
score
"
:
1
,
"
weight
"
:
1
}],
"
obstacle_list
"
:
[],
"
enemy_list
"
:
[]
},
{
"
flag_list
"
:
[{
"
position
"
:
{
"
x
"
:
50
,
"
y
"
:
50
,
"
z
"
:
10
},
"
score
"
:
1
,
"
weight
"
:
1
}],
"
obstacle_list
"
:
[],
"
enemy_list
"
:
[{
"
type
"
:
"
EnemyDroneAPI
"
,
"
position
"
:
{
"
x
"
:
50
,
"
y
"
:
20
,
"
z
"
:
10
}},
{
"
type
"
:
"
EnemyDroneAPI
"
,
"
position
"
:
{
"
x
"
:
50
,
"
y
"
:
80
,
"
z
"
:
10
}}]
},
{
"
flag_list
"
:
[{
"
position
"
:
{
"
x
"
:
50
,
"
y
"
:
50
,
"
z
"
:
10
},
"
score
"
:
1
,
"
weight
"
:
1
}],
"
obstacle_list
"
:
[{
"
type
"
:
"
box
"
,
"
position
"
:
{
"
x
"
:
50
,
"
y
"
:
10
,
"
z
"
:
25
},
"
scale
"
:
{
"
x
"
:
80
,
"
y
"
:
2
,
"
z
"
:
50
},
"
rotation
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
z
"
:
0
}},
{
"
type
"
:
"
box
"
,
"
position
"
:
{
"
x
"
:
10
,
"
y
"
:
50
,
"
z
"
:
25
},
"
scale
"
:
{
"
x
"
:
2
,
"
y
"
:
80
,
"
z
"
:
50
},
"
rotation
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
z
"
:
0
}},
{
"
type
"
:
"
box
"
,
"
position
"
:
{
"
x
"
:
50
,
"
y
"
:
90
,
"
z
"
:
25
},
"
scale
"
:
{
"
x
"
:
80
,
"
y
"
:
2
,
"
z
"
:
50
},
"
rotation
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
z
"
:
0
}},
{
"
type
"
:
"
box
"
,
"
position
"
:
{
"
x
"
:
90
,
"
y
"
:
50
,
"
z
"
:
25
},
"
scale
"
:
{
"
x
"
:
2
,
"
y
"
:
80
,
"
z
"
:
50
},
"
rotation
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
z
"
:
0
}}],
"
enemy_list
"
:
[]
},
{
"
flag_list
"
:
[],
"
obstacle_list
"
:
[],
"
enemy_list
"
:
[]
}];
"
position
"
:
{
"
x
"
:
90
,
"
y
"
:
50
,
"
z
"
:
25
},
"
scale
"
:
{
"
x
"
:
2
,
"
y
"
:
80
,
"
z
"
:
50
},
"
rotation
"
:
{
"
x
"
:
0
,
"
y
"
:
0
,
"
z
"
:
0
}}],
"
enemy_list
"
:
[]
},
{
"
flag_list
"
:
[],
"
obstacle_list
"
:
[],
"
enemy_list
"
:
[]
}];
function
getInitialBlock
(
GRID
)
{
var
x
,
y
;
do
{
x
=
Math
.
floor
(
seed
.
quick
()
*
GRID
);
y
=
Math
.
floor
(
seed
.
quick
()
*
GRID
);
//ensure intial block is in the edge of map
}
while
(
x
!==
0
&&
x
!==
GRID
-
1
&&
y
!==
0
&&
y
!==
GRID
-
1
);
}
while
(
x
!==
0
&&
x
!==
GRID
-
1
&&
y
!==
0
&&
y
!==
GRID
-
1
);
return
{
x
:
x
,
y
:
y
};
}
initial_block
=
getInitialBlock
(
GRID
);
function
checkConditions
(
json_map
,
GRID
)
{
if
(
!
json_map
)
return
false
;
var
f
,
flag
,
g
,
n_mountains
=
0
;
if
(
!
json_map
)
{
return
false
;
}
// set ~20% of the blocks with flags
if
(
json_map
.
flag_list
.
length
!==
Math
.
round
(
GRID
*
GRID
*
0.2
))
return
false
;
if
(
json_map
.
flag_list
.
length
!==
Math
.
round
(
GRID
*
GRID
*
0.2
))
{
return
false
;
}
// limit n_mountains
if
(
json_map
.
obstacle_list
.
length
>
3
)
{
var
i
,
n_mountains
=
0
;
for
(
i
=
0
;
i
<
json_map
.
obstacle_list
.
length
;
i
+=
1
)
{
if
(
json_map
.
obstacle_list
[
i
].
type
===
"
mountain
"
)
{
for
(
g
=
0
;
g
<
json_map
.
obstacle_list
.
length
;
g
+=
1
)
{
if
(
json_map
.
obstacle_list
[
g
].
type
===
"
mountain
"
)
{
n_mountains
+=
1
;
if
(
n_mountains
>
3
)
{
return
false
;
}
json_map
.
obstacle_list
[
i
].
type
=
"
box
"
;
json_map
.
obstacle_list
[
g
].
type
=
"
box
"
;
}
}
}
var
f
;
// at least one flag in the oposite side of drones initial position
for
(
f
=
0
;
f
<
json_map
.
flag_list
.
length
;
f
+=
1
)
{
if
((
json_map
.
flag_list
[
f
].
position
.
x
*
json_map
.
initial_position
.
x
)
<
0
||
(
json_map
.
flag_list
[
f
].
position
.
y
*
json_map
.
initial_position
.
y
)
<
0
)
{
flag
=
json_map
.
flag_list
[
f
];
if
((
flag
.
position
.
x
*
json_map
.
initial_position
.
x
)
<
0
||
(
flag
.
position
.
y
*
json_map
.
initial_position
.
y
)
<
0
)
{
return
true
;
}
}
...
...
@@ -284,25 +291,30 @@ var MapUtils = /** @class */ (function () {
do
{
result_map
=
{
"
flag_list
"
:
[],
"
initial_position
"
:
null
,
"
obstacle_list
"
:
[],
"
enemy_list
"
:
[]
};
for
(
i
=
0
;
i
<
GRID
;
i
+=
1
)
{
for
(
j
=
0
;
j
<
GRID
;
j
+=
1
)
{
index
=
Math
.
floor
(
seed
.
quick
()
*
BLOCK_TEMPLATE_LIST
.
length
);
x1
=
block_size
*
i
-
ma
p_size
/
2
;
y1
=
block_size
*
j
-
ma
p_size
/
2
;
x2
=
block_size
*
i
+
block_size
-
ma
p_size
/
2
;
y2
=
block_size
*
j
+
block_size
-
ma
p_size
/
2
;
x1
=
block_size
*
i
-
ma
x_width
/
2
;
y1
=
block_size
*
j
-
ma
x_depth
/
2
;
x2
=
block_size
*
i
+
block_size
-
ma
x_width
/
2
;
y2
=
block_size
*
j
+
block_size
-
ma
x_depth
/
2
;
if
(
initial_block
.
x
===
i
&&
initial_block
.
y
===
j
)
{
result_map
.
initial_position
=
{
x
:
normalize
(
50
,
x1
,
x2
),
y
:
normalize
(
50
,
y1
,
y2
),
z
:
15
};
}
else
{
block_result
=
fillTemplate
(
BLOCK_TEMPLATE_LIST
[
index
],
x1
,
y1
,
x2
,
y2
);
result_map
.
flag_list
=
result_map
.
flag_list
.
concat
(
block_result
.
flag_list
);
result_map
.
obstacle_list
=
result_map
.
obstacle_list
.
concat
(
block_result
.
obstacle_list
);
result_map
.
enemy_list
=
result_map
.
enemy_list
.
concat
(
block_result
.
enemy_list
);
block_result
=
fillTemplate
(
BLOCK_TEMPLATE_LIST
[
index
],
x1
,
y1
,
x2
,
y2
);
result_map
.
flag_list
=
result_map
.
flag_list
.
concat
(
block_result
.
flag_list
);
result_map
.
obstacle_list
=
result_map
.
obstacle_list
.
concat
(
block_result
.
obstacle_list
);
result_map
.
enemy_list
=
result_map
.
enemy_list
.
concat
(
block_result
.
enemy_list
);
}
}
}
...
...
@@ -316,7 +328,7 @@ var MapUtils = /** @class */ (function () {
MapUtils
.
prototype
.
randomize
=
function
(
seed
)
{
//TODO randomize start_ASML, map height, depth and width?
var
_this
=
this
,
flag_list
,
obstacle_list
,
enemy_list
,
geo_flag_info
,
geo_obstacle
,
geo_enemy
,
coordinates
,
geo_flag_info
,
geo_obstacle
,
geo_enemy
,
random_seed
=
new
Math
.
seedrandom
(
seed
),
randomized_map
=
_this
.
randomizeByBlockTemplates
(
random_seed
);
obstacle_list
=
randomized_map
.
obstacle_list
;
...
...
@@ -346,7 +358,7 @@ var MapUtils = /** @class */ (function () {
_this
.
map_info
.
flag_list
.
push
(
geo_flag_info
);
});
obstacle_list
.
forEach
(
function
(
obstacle_info
,
index
)
{
geo_obstacle
=
{};
geo_obstacle
=
{
position
:
null
};
Object
.
assign
(
geo_obstacle
,
obstacle_info
);
geo_obstacle
.
position
=
_this
.
convertToGeoCoordinates
(
obstacle_info
.
position
.
x
,
...
...
@@ -356,7 +368,7 @@ var MapUtils = /** @class */ (function () {
_this
.
map_info
.
obstacle_list
.
push
(
geo_obstacle
);
});
enemy_list
.
forEach
(
function
(
enemy_info
,
index
)
{
geo_enemy
=
{};
geo_enemy
=
{
position
:
null
};
Object
.
assign
(
geo_enemy
,
enemy_info
);
geo_enemy
.
position
=
_this
.
convertToGeoCoordinates
(
enemy_info
.
position
.
x
,
...
...
bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/drone_capture_flag_map_utils_js.xml
View file @
37d0a9bd
...
...
@@ -242,7 +242,7 @@
</item>
<item>
<key>
<string>
serial
</string>
</key>
<value>
<string>
101
1.57448.22674.29627
</string>
</value>
<value>
<string>
101
7.22488.12960.6280
</string>
</value>
</item>
<item>
<key>
<string>
state
</string>
</key>
...
...
@@ -262,7 +262,7 @@
</tuple>
<state>
<tuple>
<float>
1
697557365.44
</float>
<float>
1
718708011.02
</float>
<string>
UTC
</string>
</tuple>
</state>
...
...
bt5/erp5_officejs_drone_capture_flag_test/PathTemplateItem/portal_tests/drone_capture_flag_ui_site_zuite/testDroneCaptureFlagFlight.zpt
View file @
37d0a9bd
...
...
@@ -44,11 +44,6 @@
<td>
//div[contains(text(), 'CONSOLE LOG ENTRIES:')]
</td>
<td></td>
<tr>
<tr>
<td>
waitForElementPresent
</td>
<td>
//div[contains(text(), 'Simulation finished')]
</td>
<td></td>
<tr>
<tr>
<td>
assertElementPresent
</td>
<td>
//div[contains(text(), 'Initial speed: OK')]
</td>
...
...
@@ -84,6 +79,11 @@
<td>
//div[contains(text(), 'Altitude: OK')]
</td>
<td></td>
<tr>
<tr>
<td>
assertElementPresent
</td>
<td>
//div[contains(text(), 'Timeout: OK')]
</td>
<td></td>
<tr>
</tbody></table>
</body>
</html>
\ No newline at end of file
bt5/erp5_officejs_drone_simulator/PathTemplateItem/web_page_module/drone_simulator_logic_js.js
View file @
37d0a9bd
...
...
@@ -425,28 +425,140 @@ var DroneManager = /** @class */ (function () {
/******************************** MAP UTILIS **********************************/
var
MapUtils
=
/** @class */
(
function
()
{
"
use strict
"
;
var
R
=
6371
e3
;
//** CONSTRUCTOR
function
MapUtils
(
map_param
)
{
var
_this
=
this
;
_this
.
map_param
=
{};
_this
.
map_param
.
height
=
map_param
.
height
;
_this
.
map_param
.
start_AMSL
=
map_param
.
start_AMSL
;
_this
.
map_param
.
min_lat
=
map_param
.
min_lat
;
_this
.
map_param
.
max_lat
=
map_param
.
max_lat
;
_this
.
map_param
.
min_lon
=
map_param
.
min_lon
;
_this
.
map_param
.
max_lon
=
map_param
.
max_lon
;
_this
.
map_param
.
depth
=
_this
.
latLonDistance
(
[
map_param
.
min_lat
,
map_param
.
min_lon
],
[
map_param
.
max_lat
,
map_param
.
min_lon
]
);
_this
.
map_param
.
width
=
_this
.
latLonDistance
(
[
map_param
.
min_lat
,
map_param
.
min_lon
],
[
map_param
.
min_lat
,
map_param
.
max_lon
]
);
_this
.
map_info
=
{
"
depth
"
:
_this
.
map_param
.
depth
,
"
width
"
:
_this
.
map_param
.
width
};
_this
.
map_info
.
height
=
_this
.
map_param
.
height
;
_this
.
map_info
.
start_AMSL
=
_this
.
map_param
.
start_AMSL
;
_this
.
map_info
.
min_x
=
_this
.
longitudToX
(
map_param
.
min_lon
);
_this
.
map_info
.
min_y
=
_this
.
latitudeToY
(
map_param
.
min_lat
);
_this
.
map_info
.
max_x
=
_this
.
longitudToX
(
map_param
.
max_lon
);
_this
.
map_info
.
max_y
=
_this
.
latitudeToY
(
map_param
.
max_lat
);
}
MapUtils
.
prototype
.
latLonDistance
=
function
(
c1
,
c2
)
{
var
q1
=
c1
[
0
]
*
Math
.
PI
/
180
,
q2
=
c2
[
0
]
*
Math
.
PI
/
180
,
dq
=
(
c2
[
0
]
-
c1
[
0
])
*
Math
.
PI
/
180
,
dl
=
(
c2
[
1
]
-
c1
[
1
])
*
Math
.
PI
/
180
,
a
=
Math
.
sin
(
dq
/
2
)
*
Math
.
sin
(
dq
/
2
)
+
Math
.
cos
(
q1
)
*
Math
.
cos
(
q2
)
*
Math
.
sin
(
dl
/
2
)
*
Math
.
sin
(
dl
/
2
),
c
=
2
*
Math
.
atan2
(
Math
.
sqrt
(
a
),
Math
.
sqrt
(
1
-
a
));
return
R
*
c
;
};
MapUtils
.
prototype
.
longitudToX
=
function
(
lon
)
{
return
(
this
.
map_info
.
width
/
360.0
)
*
(
180
+
lon
);
};
MapUtils
.
prototype
.
latitudeToY
=
function
(
lat
)
{
return
(
this
.
map_info
.
depth
/
180.0
)
*
(
90
-
lat
);
};
MapUtils
.
prototype
.
convertToLocalCoordinates
=
function
(
latitude
,
longitude
,
altitude
)
{
var
map_info
=
this
.
map_info
,
x
=
this
.
longitudToX
(
longitude
),
y
=
this
.
latitudeToY
(
latitude
);
return
{
x
:
(((
x
-
map_info
.
min_x
)
/
(
map_info
.
max_x
-
map_info
.
min_x
))
-
0.5
)
*
map_info
.
width
,
y
:
(((
y
-
map_info
.
min_y
)
/
(
map_info
.
max_y
-
map_info
.
min_y
))
-
0.5
)
*
map_info
.
depth
,
z
:
altitude
};
};
MapUtils
.
prototype
.
convertToGeoCoordinates
=
function
(
x
,
y
,
z
)
{
var
lon
=
(
x
/
this
.
map_info
.
width
)
+
0.5
,
lat
=
(
y
/
this
.
map_info
.
depth
)
+
0.5
;
lon
=
lon
*
(
this
.
map_info
.
max_x
-
this
.
map_info
.
min_x
)
+
this
.
map_info
.
min_x
;
lon
=
lon
/
(
this
.
map_info
.
width
/
360.0
)
-
180
;
lat
=
lat
*
(
this
.
map_info
.
max_y
-
this
.
map_info
.
min_y
)
+
this
.
map_info
.
min_y
;
lat
=
90
-
lat
/
(
this
.
map_info
.
depth
/
180.0
);
return
{
latitude
:
lat
,
longitude
:
lon
,
altitude
:
z
};
};
return
MapUtils
;
}());
/******************************************************************************/
/******************************** MAP MANAGER *********************************/
var
MapManager
=
/** @class */
(
function
()
{
"
use strict
"
;
//default square map
var
MAP_HEIGHT
=
700
,
START_AMSL
=
595
,
MIN_LAT
=
45.6419
,
MAX_LAT
=
45.65
,
MIN_LON
=
14.265
,
MAX_LON
=
14.2766
,
MAP
=
{
"
height
"
:
MAP_HEIGHT
,
"
start_AMSL
"
:
START_AMSL
,
"
min_lat
"
:
MIN_LAT
,
"
max_lat
"
:
MAX_LAT
,
"
min_lon
"
:
MIN_LON
,
"
max_lon
"
:
MAX_LON
};
//** CONSTRUCTOR
function
MapManager
(
scene
)
{
function
MapManager
(
scene
,
map_param
,
initial_position
)
{
var
_this
=
this
,
max_sky
,
skybox
,
skyboxMat
,
largeGroundMat
,
largeGroundBottom
,
width
,
depth
,
terrain
,
max
;
this
.
setMapInfo
(
GAMEPARAMETERS
.
map
,
GAMEPARAMETERS
.
initialPosition
);
max
=
_this
.
map_info
.
width
;
if
(
_this
.
map_info
.
depth
>
max
)
{
max
=
_this
.
map_info
.
depth
;
if
(
!
map_param
)
{
// Use default map base parameters
map_param
=
MAP
;
}
if
(
_this
.
map_info
.
height
>
max
)
{
max
=
_this
.
map_info
.
height
;
}
max
=
max
<
_this
.
map_info
.
depth
?
_this
.
map_info
.
depth
:
max
;
_this
.
mapUtils
=
new
MapUtils
(
map_param
);
_this
.
map_info
=
map_param
;
Object
.
assign
(
_this
.
map_info
,
_this
.
mapUtils
.
map_info
);
_this
.
map_info
.
initial_position
=
_this
.
mapUtils
.
convertToLocalCoordinates
(
initial_position
.
latitude
,
initial_position
.
longitude
,
initial_position
.
altitude
);
max
=
Math
.
max
(
_this
.
map_info
.
depth
,
_this
.
map_info
.
height
,
_this
.
map_info
.
width
);
// Skybox
max_sky
=
(
max
*
10
<
20000
)
?
max
*
10
:
20000
;
skybox
=
BABYLON
.
Mesh
.
CreateBox
(
"
skyBox
"
,
max_sky
,
scene
);
skybox
.
infiniteDistance
=
true
;
skybox
.
renderingGroupId
=
0
;
max_sky
=
(
max
*
15
<
20000
)
?
max
*
15
:
20000
;
//skybox scene limit
skybox
=
BABYLON
.
MeshBuilder
.
CreateBox
(
"
skyBox
"
,
{
size
:
max_sky
},
scene
);
skyboxMat
=
new
BABYLON
.
StandardMaterial
(
"
skybox
"
,
scene
);
skyboxMat
.
backFaceCulling
=
false
;
skyboxMat
.
disableLighting
=
true
;
...
...
@@ -455,102 +567,50 @@ var MapManager = /** @class */ (function () {
skyboxMat
.
reflectionTexture
.
coordinatesMode
=
BABYLON
.
Texture
.
SKYBOX_MODE
;
skyboxMat
.
infiniteDistance
=
true
;
skybox
.
material
=
skyboxMat
;
skybox
.
infiniteDistance
=
true
;
skyboxMat
.
disableLighting
=
true
;
skyboxMat
.
reflectionTexture
=
new
BABYLON
.
CubeTexture
(
"
./assets/skybox/sky
"
,
scene
);
skyboxMat
.
reflectionTexture
.
coordinatesMode
=
BABYLON
.
Texture
.
SKYBOX_MODE
;
skybox
.
renderingGroupId
=
0
;
// Plane from bottom
largeGroundMat
=
new
BABYLON
.
StandardMaterial
(
"
largeGroundMat
"
,
scene
);
largeGroundMat
.
specularColor
=
BABYLON
.
Color3
.
Black
();
largeGroundMat
.
alpha
=
0.4
;
largeGroundBottom
=
BABYLON
.
Mesh
.
CreatePlane
(
"
largeGroundBottom
"
,
max
*
11
,
scene
);
max
*
11
,
scene
);
largeGroundBottom
.
position
.
y
=
-
0.01
;
largeGroundBottom
.
rotation
.
x
=
-
Math
.
PI
/
2
;
largeGroundBottom
.
rotation
.
y
=
Math
.
PI
;
largeGroundBottom
.
material
=
largeGroundMat
;
// Camera
scene
.
activeCamera
.
upperRadiusLimit
=
max
*
4
;
largeGroundBottom
.
renderingGroupId
=
1
;
// Terrain
// Give map some margin from the flight limits
width
=
_this
.
map_info
.
width
*
1.
1
0
;
depth
=
_this
.
map_info
.
depth
*
1.
1
0
;
width
=
_this
.
map_info
.
width
*
1.
3
0
;
depth
=
_this
.
map_info
.
depth
*
1.
3
0
;
//height = _this.map_info.height;
terrain
=
scene
.
getMeshByName
(
"
terrain001
"
);
terrain
.
isVisible
=
true
;
terrain
.
position
=
BABYLON
.
Vector3
.
Zero
();
terrain
.
scaling
=
new
BABYLON
.
Vector3
(
depth
/
50000
,
depth
/
50000
,
terrain
.
scaling
=
new
BABYLON
.
Vector3
(
depth
/
50000
,
_this
.
map_info
.
height
/
50000
,
width
/
50000
);
}
MapManager
.
prototype
.
setMapInfo
=
function
(
map_dict
,
initial_position
)
{
var
max_width
=
this
.
latLonDistance
([
map_dict
.
min_lat
,
map_dict
.
min_lon
],
[
map_dict
.
min_lat
,
map_dict
.
max_lon
]),
max_height
=
this
.
latLonDistance
([
map_dict
.
min_lat
,
map_dict
.
min_lon
],
[
map_dict
.
max_lat
,
map_dict
.
min_lon
]),
map_size
=
Math
.
ceil
(
Math
.
max
(
max_width
,
max_height
));
this
.
map_info
=
{
"
depth
"
:
map_size
,
"
height
"
:
map_dict
.
height
,
"
width
"
:
map_size
,
"
map_size
"
:
map_size
,
"
start_AMSL
"
:
map_dict
.
start_AMSL
};
this
.
map_info
.
min_x
=
this
.
longitudToX
(
map_dict
.
min_lon
);
this
.
map_info
.
min_y
=
this
.
latitudeToY
(
map_dict
.
min_lat
);
this
.
map_info
.
max_x
=
this
.
longitudToX
(
map_dict
.
max_lon
);
this
.
map_info
.
max_y
=
this
.
latitudeToY
(
map_dict
.
max_lat
);
this
.
map_info
.
initial_position
=
this
.
convertToLocalCoordinates
(
initial_position
.
latitude
,
initial_position
.
longitude
,
initial_position
.
altitude
);
};
MapManager
.
prototype
.
getMapInfo
=
function
()
{
return
this
.
map_info
;
};
MapManager
.
prototype
.
longitudToX
=
function
(
lon
)
{
return
(
this
.
map_info
.
map_size
/
360.0
)
*
(
180
+
lon
);
};
MapManager
.
prototype
.
latitudeToY
=
function
(
lat
)
{
return
(
this
.
map_info
.
map_size
/
180.0
)
*
(
90
-
lat
);
};
MapManager
.
prototype
.
latLonDistance
=
function
(
c1
,
c2
)
{
var
R
=
6371
e3
,
q1
=
c1
[
0
]
*
Math
.
PI
/
180
,
q2
=
c2
[
0
]
*
Math
.
PI
/
180
,
dq
=
(
c2
[
0
]
-
c1
[
0
])
*
Math
.
PI
/
180
,
dl
=
(
c2
[
1
]
-
c1
[
1
])
*
Math
.
PI
/
180
,
a
=
Math
.
sin
(
dq
/
2
)
*
Math
.
sin
(
dq
/
2
)
+
Math
.
cos
(
q1
)
*
Math
.
cos
(
q2
)
*
Math
.
sin
(
dl
/
2
)
*
Math
.
sin
(
dl
/
2
),
c
=
2
*
Math
.
atan2
(
Math
.
sqrt
(
a
),
Math
.
sqrt
(
1
-
a
));
return
R
*
c
;
return
this
.
mapUtils
.
latLonDistance
(
c1
,
c2
);
};
MapManager
.
prototype
.
convertToLocalCoordinates
=
function
(
latitude
,
longitude
,
altitude
)
{
var
map_info
=
this
.
map_info
,
x
=
this
.
longitudToX
(
longitude
),
y
=
this
.
latitudeToY
(
latitude
);
return
{
x
:
((
x
-
map_info
.
min_x
)
/
(
map_info
.
max_x
-
map_info
.
min_x
))
*
1000
-
map_info
.
width
/
2
,
y
:
((
y
-
map_info
.
min_y
)
/
(
map_info
.
max_y
-
map_info
.
min_y
))
*
1000
-
map_info
.
depth
/
2
,
z
:
altitude
};
return
this
.
mapUtils
.
convertToLocalCoordinates
(
latitude
,
longitude
,
altitude
);
};
MapManager
.
prototype
.
convertToGeoCoordinates
=
function
(
x
,
y
,
z
)
{
var
lon
=
x
+
this
.
map_info
.
width
/
2
,
lat
=
y
+
this
.
map_info
.
depth
/
2
;
lon
=
lon
/
1000
;
lon
=
lon
*
(
this
.
map_info
.
max_x
-
this
.
map_info
.
min_x
)
+
this
.
map_info
.
min_x
;
lon
=
lon
/
(
this
.
map_info
.
map_size
/
360.0
)
-
180
;
lat
=
lat
/
1000
;
lat
=
lat
*
(
this
.
map_info
.
max_y
-
this
.
map_info
.
min_y
)
+
this
.
map_info
.
min_y
;
lat
=
90
-
lat
/
(
this
.
map_info
.
map_size
/
180.0
);
return
{
latitude
:
lat
,
longitude
:
lon
,
altitude
:
z
};
return
this
.
mapUtils
.
convertToGeoCoordinates
(
x
,
y
,
z
);
};
return
MapManager
;
}());
...
...
@@ -856,7 +916,14 @@ var GameManager = /** @class */ (function () {
};
GameManager
.
prototype
.
_init
=
function
()
{
var
_this
=
this
,
canvas
,
hemi_north
,
hemi_south
,
camera
,
on3DmodelsReady
;
var
_this
=
this
,
canvas
,
hemi_north
,
hemi_south
,
camera
,
cam_radius
,
on3DmodelsReady
,
mapUtils
=
new
MapUtils
(
GAMEPARAMETERS
.
map
),
map_size
=
Math
.
max
(
mapUtils
.
map_info
.
depth
,
mapUtils
.
map_info
.
height
,
mapUtils
.
map_info
.
width
);
canvas
=
this
.
_canvas
;
this
.
_delayed_defer_list
=
[];
this
.
_dispose
();
...
...
@@ -890,9 +957,15 @@ var GameManager = /** @class */ (function () {
this
.
_scene
);
hemi_south
.
intensity
=
0.75
;
camera
=
new
BABYLON
.
ArcRotateCamera
(
"
camera
"
,
0
,
1.25
,
800
,
cam_radius
=
Math
.
min
(
1.10
*
Math
.
sqrt
(
mapUtils
.
map_info
.
width
*
mapUtils
.
map_info
.
depth
),
6000
);
camera
=
new
BABYLON
.
ArcRotateCamera
(
"
camera
"
,
0
,
1.25
,
cam_radius
,
BABYLON
.
Vector3
.
Zero
(),
this
.
_scene
);
camera
.
wheelPrecision
=
10
;
//zoom out limit
camera
.
upperRadiusLimit
=
map_size
*
10
;
//changed for event handling
//camera.attachControl(this._scene.getEngine().getRenderingCanvas()); //orig
camera
.
attachControl
(
canvas
,
true
);
...
...
@@ -911,8 +984,9 @@ var GameManager = /** @class */ (function () {
ctx
.
_map_swapped
=
true
;
}
// Init the map
_this
.
_mapManager
=
new
MapManager
(
ctx
.
_scene
);
ctx
.
_spawnDrones
(
_this
.
_mapManager
.
map_info
.
initial_position
,
_this
.
_mapManager
=
new
MapManager
(
ctx
.
_scene
,
GAMEPARAMETERS
.
map
,
GAMEPARAMETERS
.
initialPosition
);
ctx
.
_spawnDrones
(
_this
.
_mapManager
.
getMapInfo
().
initial_position
,
GAMEPARAMETERS
.
droneList
,
ctx
);
// Hide the drone prefab
DroneManager
.
Prefab
.
isVisible
=
false
;
...
...
bt5/erp5_officejs_drone_simulator/PathTemplateItem/web_page_module/drone_simulator_logic_js.xml
View file @
37d0a9bd
...
...
@@ -240,7 +240,7 @@
</item>
<item>
<key>
<string>
serial
</string>
</key>
<value>
<string>
101
6.21987.28184.16844
</string>
</value>
<value>
<string>
101
7.22776.49981.4147
</string>
</value>
</item>
<item>
<key>
<string>
state
</string>
</key>
...
...
@@ -260,7 +260,7 @@
</tuple>
<state>
<tuple>
<float>
171
4742619.34
</float>
<float>
171
8722284.77
</float>
<string>
UTC
</string>
</tuple>
</state>
...
...
bt5/erp5_officejs_drone_simulator_test/PathTemplateItem/portal_tests/drone_simulator_ui_site_zuite/testDroneSimulatorFlight.zpt
View file @
37d0a9bd
...
...
@@ -54,11 +54,6 @@
<td>
//div[contains(text(), 'CONSOLE LOG ENTRIES:')]
</td>
<td></td>
<tr>
<tr>
<td>
waitForElementPresent
</td>
<td>
//div[contains(text(), 'Simulation finished')]
</td>
<td></td>
<tr>
<tr>
<td>
assertElementPresent
</td>
<td>
//div[contains(text(), 'Initial speed: OK')]
</td>
...
...
@@ -94,6 +89,11 @@
<td>
//div[contains(text(), 'Altitude: OK')]
</td>
<td></td>
<tr>
<tr>
<td>
assertElementPresent
</td>
<td>
//div[contains(text(), 'Timeout: OK')]
</td>
<td></td>
<tr>
</tbody></table>
</body>
</html>
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment