-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathFunctions.gd
64 lines (48 loc) · 1.75 KB
/
Functions.gd
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
var elev_data = []
static func calc_surface_normal(vert1, vert2, vert3): # calculate a normal using 3 vertices
var U = (vert2 - vert1)
var V = (vert3 - vert1)
var x = (U.y * V.z) - (U.z * V.y)
var y = (U.z * V.x) - (U.x * V.z)
var z = (U.x * V.y) - (U.y * V.x)
return Vector3(x, y, z).normalized()
static func calc_surface_normal_newell_method(vert_arr): # Newell's Method of calculating normals
var normal = Vector3(0, 0, 0)
var curr_vert = Vector3()
var next_vert = Vector3()
for i in range(0, vert_arr.size()):
curr_vert = vert_arr[i]
next_vert = vert_arr[(i + 1) % vert_arr.size()]
normal.x = normal.x + ((curr_vert.y - next_vert.y) * (curr_vert.z + next_vert.z))
normal.y = normal.y + ((curr_vert.z - next_vert.z) * (curr_vert.x + next_vert.x))
normal.z = normal.z + ((curr_vert.x - next_vert.x) * (curr_vert.y + next_vert.y))
return normal.normalized()
static func lla_to_xyz(lla): # Lon Lat Alt to x y z converter.
var lon = lla.x
var lat = lla.y
var alt = lla.z
var cosLat = cos(deg2rad(lat))
var sinLat = sin(deg2rad(lat))
var cosLon = cos(deg2rad(lon))
var sinLon = sin(deg2rad(lon))
var rad = 50.0 + alt
var x = rad * cosLat * cosLon
var y = rad * sinLat
var z = rad * cosLat * sinLon
return Vector3(x, y, z)
static func mid_point(lla1, lla2):
var lon1 = lla1.x
var lat1 = lla1.y
var lon2 = lla2.x
var lat2 = lla2.y
var dLon = deg2rad(lon2 - lon1)
# convert to radians
lat1 = deg2rad(lat1)
lat2 = deg2rad(lat2)
lon1 = deg2rad(lon1)
var Bx = cos(lat2) * cos(dLon)
var By = cos(lat2) * sin(dLon)
var lat3 = atan2(sin(lat1) + sin(lat2), sqrt((cos(lat1) + Bx) * (cos(lat1) + Bx) + By * By))
var lon3 = lon1 + atan2(By, cos(lat1) + Bx)
# return lla vector
return Vector3(rad2deg(lon3), rad2deg(lat3), (lla1.z + lla2.z) / 2)