Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
X
x3domlet
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
3
Issues
3
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Elphel
x3domlet
Commits
80551632
Commit
80551632
authored
Nov 16, 2018
by
Oleg Dzhimiev
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
testing new function
parent
7af5d8cb
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
283 additions
and
33 deletions
+283
-33
x3dom_deltas.js
js/x3dom_deltas.js
+281
-33
x3dom_init.js
js/x3dom_init.js
+2
-0
No files found.
js/x3dom_deltas.js
View file @
80551632
function
Av_func
(
mark
,
pars
){
/*
mark = {
map:{ lat: 0, lng: 0, alt: 0},
model:{ x: 0, y: 0, z: 0 }
}
pars = {
lat: 0,
lng: 0,
alt: 0,
heading: 0,
tilt: 0,
roll: 0
}
*/
/*
* 'WORLD' COORDINATE SYSTEM
* X - to North
* Y - to East
* Z - to Earth center
*/
var
p0_ll
=
new
L
.
LatLng
(
pars
.
lat
,
pars
.
lng
);
var
p1_ll
=
new
L
.
LatLng
(
mark
.
map
.
lat
,
mark
.
map
.
lng
);
// get coordinates of marker in real world coorinates
// the world is
var
pi_ll
=
new
L
.
LatLng
(
p0_ll
.
lat
,
p1_ll
.
lng
);
// will need derivatives from this distanceTo
var
dx
=
pi_ll
.
distanceTo
(
p1_ll
);
var
dy
=
p0_ll
.
distanceTo
(
pi_ll
);
var
dz
=
(
mark
.
map
.
alt
-
pars
.
alt
)
*
(
-
1
);
// sign
if
(
p1_ll
.
lng
<
p0_ll
.
lng
)
dy
=
-
dy
;
if
(
p1_ll
.
lat
<
p0_ll
.
lat
)
dx
=
-
dx
;
// dx,dy,dz - coorinates map marker in 'world' coordinates
// with the center in p0
//
// which is ellipse 2 e2.
var
e2_world
=
new
x3dom
.
fields
.
SFVec3f
(
dx
,
dy
,
dz
);
console
.
log
(
"MARK-on-MAP in WORLD: "
+
e2_world
.
toString
());
var
heading
=
pars
.
heading
*
Math
.
PI
/
180
;
var
tilt
=
(
pars
.
tilt
-
90
)
*
Math
.
PI
/
180
;
var
roll
=
pars
.
roll
*
Math
.
PI
/
180
;
// Heading,Tilt,Roll
var
Mh
=
x3dom
.
fields
.
SFMatrix4f
.
rotationZ
(
heading
);
var
Mt
=
x3dom
.
fields
.
SFMatrix4f
.
rotationY
(
tilt
);
var
Mr
=
x3dom
.
fields
.
SFMatrix4f
.
rotationX
(
roll
);
// I'll need R'
var
R
=
Mh
.
mult
(
Mt
).
mult
(
Mr
);
// T is constant
var
T
=
x3dom_toYawPitchRoll
();
var
M2W
=
R
.
mult
(
T
);
var
W2M
=
R
.
mult
(
T
).
inverse
();
var
e1_model
=
new
x3dom
.
fields
.
SFVec3f
(
mark
.
model
.
x
,
mark
.
model
.
y
,
mark
.
model
.
z
);
var
e1_world
=
M2W
.
multMatrixVec
(
e1_model
);
var
e2_model
=
W2M
.
multMatrixVec
(
e2_world
);
x3dom_draw_line
(
"soup0"
,
"white"
,
new
x3dom
.
fields
.
SFVec3f
(
0
,
0
,
0
),
e1_model
);
x3dom_draw_line
(
"soup1"
,
"white"
,
new
x3dom
.
fields
.
SFVec3f
(
0
,
0
,
0
),
e2_model
);
x3dom_draw_line
(
"soup2"
,
"white"
,
e1_model
,
e2_model
);
console
.
log
(
"MARK-on-MODEL in WORLD: "
+
e1_world
.
toString
());
// pointing from model mark to map mark
var
v
=
e1_world
.
subtract
(
e2_world
);
// Need to find A
// point in Model
// from 0,0,0
var
e1_d
=
x3dom_3d_distance
(
e1_world
.
x
,
e1_world
.
y
,
e1_world
.
z
,
false
);
var
e1_k
=
20
;
//var e1_k = 1;
var
e1_abc
=
[
e1_k
*
0.00038
*
e1_d
,
e1_k
*
0.00038
*
e1_d
,
2
*
e1_k
*
e1_d
*
e1_d
/
10000
];
//var e1_abc = [e1_k*0.00038*e1_d, e1_k*0.00038*e1_d, e1_k*e1_d*e1_d/25000];
var
e1_dir
=
e1_world
.
normalize
();
// -z look upwards in world coordinates
//var xa1 = e1_dir.cross(new x3dom.fields.SFVec3f(0,0,-1));
var
xa1
=
e1_dir
.
cross
(
new
x3dom
.
fields
.
SFVec3f
(
0
,
1
,
0
));
var
ya1
=
xa1
.
cross
(
e1_dir
);
var
za1
=
e1_dir
.
negate
();
/*
x3dom_draw_ellipsoid_by_semiaxes_and_center("e1","green",{
O: W2M.multMatrixVec(e2_world),
Ox: W2M.multMatrixVec(xa1.multiply(e1_abc[0])),
Oy: W2M.multMatrixVec(ya1.multiply(e1_abc[1])),
Oz: W2M.multMatrixVec(za1.multiply(e1_abc[2]))
},transparency=0.5);
*/
var
RE1
=
x3dom
.
fields
.
SFMatrix4f
.
identity
();
RE1
.
setValue
(
xa1
,
ya1
,
za1
);
// and so RE1 is in the world coordinates
var
e2_k
=
1
;
var
e2_abc
=
[
e2_k
*
1
,
e2_k
*
1
,
e2_k
*
30
];
var
xa2
=
new
x3dom
.
fields
.
SFVec3f
(
e2_abc
[
0
],
0
,
0
);
var
ya2
=
new
x3dom
.
fields
.
SFVec3f
(
0
,
e2_abc
[
1
],
0
);
var
za2
=
new
x3dom
.
fields
.
SFVec3f
(
0
,
0
,
e2_abc
[
2
]);
/*
x3dom_draw_ellipsoid_by_semiaxes_and_center("e2","green",{
O: W2M.multMatrixVec(e2_world),
Ox: W2M.multMatrixVec(xa2),
Oy: W2M.multMatrixVec(ya2),
Oz: W2M.multMatrixVec(za2)
},transparency=0.5);
*/
// it's vertical in the WORLD
var
RE2
=
x3dom
.
fields
.
SFMatrix4f
.
identity
();
// now let's get to covariance matrix
var
JE1
=
x3dom_ellipsoid_inertia_tensor_v2
(
1
,
e1_abc
[
0
],
e1_abc
[
1
],
e1_abc
[
2
]);
var
RE1xJE1
=
RE1
.
mult
(
JE1
);
var
JE2
=
x3dom_ellipsoid_inertia_tensor_v2
(
1
,
e2_abc
[
0
],
e2_abc
[
1
],
e2_abc
[
2
]);
var
RE2xJE2
=
RE2
.
mult
(
JE2
);
var
C1
=
RE1xJE1
.
mult
(
RE1xJE1
.
transpose
());
var
C2
=
RE2xJE2
.
mult
(
RE2xJE2
.
transpose
());
var
C
=
C1
.
add
(
C2
);
var
C
=
C1
.
add
(
C1
);
//var C = C2.add(C2);
Cn
=
matrix_x3dom_to_numeric
(
C
);
Bn
=
numeric
.
eig
(
Cn
);
var
es_a
=
Math
.
sqrt
(
Bn
.
lambda
.
x
[
0
]);
var
es_b
=
Math
.
sqrt
(
Bn
.
lambda
.
x
[
1
]);
var
es_c
=
Math
.
sqrt
(
Bn
.
lambda
.
x
[
2
]);
var
vec0
=
new
x3dom
.
fields
.
SFVec3f
(
Bn
.
E
.
x
[
0
][
0
],
Bn
.
E
.
x
[
0
][
1
],
Bn
.
E
.
x
[
0
][
2
]);
var
vec1
=
new
x3dom
.
fields
.
SFVec3f
(
Bn
.
E
.
x
[
1
][
0
],
Bn
.
E
.
x
[
1
][
1
],
Bn
.
E
.
x
[
1
][
2
]);
var
vec2
=
new
x3dom
.
fields
.
SFVec3f
(
Bn
.
E
.
x
[
2
][
0
],
Bn
.
E
.
x
[
2
][
1
],
Bn
.
E
.
x
[
2
][
2
]);
var
RESmatrix
=
new
x3dom
.
fields
.
SFMatrix4f
(
vec0
.
x
,
vec1
.
x
,
vec2
.
x
,
0
,
vec0
.
y
,
vec1
.
y
,
vec2
.
y
,
0
,
vec0
.
z
,
vec1
.
x
,
vec2
.
z
,
0
,
0
,
0
,
0
,
1
);
//RESmatrix = RESmatrix.transpose();
var
RESaxes
=
new
x3dom
.
fields
.
SFMatrix4f
(
es_a
,
0
,
0
,
0
,
0
,
es_b
,
0
,
0
,
0
,
0
,
es_c
,
0
,
0
,
0
,
0
,
1
);
var
A
=
RESaxes
.
inverse
().
mult
(
RESmatrix
.
transpose
());
x3dom_draw_ellipsoid_by_semiaxes_and_center
(
"ec1"
,
"gold"
,{
O
:
W2M
.
multMatrixVec
(
e2_world
),
Ox
:
W2M
.
multMatrixVec
(
RESmatrix
.
transpose
().
e0
().
multiply
(
es_a
)),
Oy
:
W2M
.
multMatrixVec
(
RESmatrix
.
transpose
().
e1
().
multiply
(
es_b
)),
Oz
:
W2M
.
multMatrixVec
(
RESmatrix
.
transpose
().
e2
().
multiply
(
es_c
))
},
transparency
=
0.7
);
}
var
theLastMovedMarker
=
null
;
function
x3dom_delta_markers
(){
...
...
@@ -8,19 +191,48 @@ function x3dom_delta_markers(){
var
index
=
theLastMovedMarker
;
var
marker
=
Data
.
markers
[
index
];
console
.
log
(
marker
);
var
Camera
=
Map
.
marker
;
// calling this function
Av_func
({
map
:
{
lat
:
marker
.
latitude
,
lng
:
marker
.
longitude
,
alt
:
marker
.
altitude
},
model
:
{
x
:
marker
.
x
,
y
:
marker
.
y
,
z
:
marker
.
z
}
},
{
lat
:
Data
.
camera
.
kml
.
latitude
,
lng
:
Data
.
camera
.
kml
.
longitude
,
alt
:
Data
.
camera
.
kml
.
altitude
,
heading
:
Data
.
camera
.
kml
.
heading
,
tilt
:
Data
.
camera
.
kml
.
tilt
,
roll
:
Data
.
camera
.
kml
.
roll
}
);
/*
var e1_c = new x3dom.fields.SFVec3f(marker.x,marker.y,marker.z);
x3dom_draw_line("x0","red", e1_c, e1_c.add(new x3dom.fields.SFVec3f(50, 0, 0)));
x3dom_draw_line("y0","green", e1_c, e1_c.add(new x3dom.fields.SFVec3f( 0,50, 0)));
x3dom_draw_line("z0","blue", e1_c, e1_c.add(new x3dom.fields.SFVec3f( 0, 0,50)));
x3dom_draw_line("x1","red", new x3dom.fields.SFVec3f(0,0,0), new x3dom.fields.SFVec3f(50, 0, 0));
x3dom_draw_line("y1","green", new x3dom.fields.SFVec3f(0,0,0), new x3dom.fields.SFVec3f( 0,50, 0));
x3dom_draw_line("z1","blue", new x3dom.fields.SFVec3f(0,0,0), new x3dom.fields.SFVec3f( 0, 0,50));
*/
return
0
;
var
p_mark_ll
=
new
L
.
LatLng
(
marker
.
latitude
,
marker
.
longitude
);
//var p_cam_ll = Camera._latlng;
var
p_cam_ll
=
new
L
.
LatLng
(
Data
.
camera
.
kml
.
latitude
,
Data
.
camera
.
kml
.
longitude
);
var
p_
w
=
x3dom_delta_map2scene
(
p_cam_ll
,
p_mark_ll
);
var
p_
model
=
x3dom_delta_map2scene
(
p_cam_ll
,
p_mark_ll
);
//p_w = x3dom_scene_to_real(p_w.x,p_w.y,p_w.z);
// vertical ellipse's center
var
e2_c
=
p_
w
;
var
e2_c
=
p_
model
;
// depth ellipse's center
var
e1_c
=
new
x3dom
.
fields
.
SFVec3f
(
marker
.
x
,
marker
.
y
,
marker
.
z
);
...
...
@@ -34,15 +246,23 @@ function x3dom_delta_markers(){
//var e2_scale = e2_abc.join(",");
//x3dom_draw_ellipsoid("e2","green",e2_c.toString(),"",e2_scale);
var
R0
=
Data
.
camera
.
Matrices
.
R0
;
var
R0i
=
Data
.
camera
.
Matrices
.
R0
.
inverse
();
var
xa2
=
new
x3dom
.
fields
.
SFVec3f
(
e2_abc
[
0
],
0
,
0
);
var
ya2
=
new
x3dom
.
fields
.
SFVec3f
(
0
,
e2_abc
[
1
],
0
);
var
za2
=
new
x3dom
.
fields
.
SFVec3f
(
0
,
0
,
e2_abc
[
2
]);
/*
x3dom_draw_ellipsoid_by_semiaxes_and_center("e2","green",{
O: e2_c,
Ox:
new x3dom.fields.SFVec3f(e2_abc[0], 0, 0
),
Oy:
new x3dom.fields.SFVec3f( 0, e2_abc[1], 0
),
Oz:
new x3dom.fields.SFVec3f( 0, 0, e2_abc[2]
)
},transparency=0.
5
);
Ox:
R0i.multMatrixVec(xa2
),
Oy:
R0i.multMatrixVec(ya2
),
Oz:
R0i.multMatrixVec(za2
)
},transparency=0.
0
);
*/
var
RE2
=
x3dom
.
fields
.
SFMatrix4f
.
identity
();
//RE2.setValue(xa,ya,za);
...
...
@@ -63,13 +283,9 @@ function x3dom_delta_markers(){
//x3dom_draw_line("test3","royalblue", new x3dom.fields.SFVec3f(0,0,0), new x3dom.fields.SFVec3f(0,0,100));
//x3dom_draw_line("test4","royalblue", e2_c.add(za.multiply(e2_abc[2])), new x3dom.fields.SFVec3f(0,0,100));
$
(
"#helper_line0"
).
remove
();
$
(
"#helper_line1"
).
remove
();
$
(
"#helper_line3"
).
remove
();
// e1 direction
//x3dom_draw_line("helper_line0","white", e1_c, new x3dom.fields.SFVec3f(0,0,0));
x3dom_draw_line
(
"helper_line0a"
,
"white"
,
e1_c
,
new
x3dom
.
fields
.
SFVec3f
(
0
,
0
,
0
));
x3dom_draw_line
(
"helper_line0b"
,
"white"
,
e2_c
,
new
x3dom
.
fields
.
SFVec3f
(
0
,
0
,
0
));
// e1 direction from e2_c
//x3dom_draw_line("helper_line1","white", e2_c.add(e1_c), e2_c.subtract(e1_c));
...
...
@@ -86,25 +302,26 @@ function x3dom_delta_markers(){
// draw ellipsoid axes
var
e1_dir
=
e1_c
;
e1_dir
=
e1_dir
.
normalize
(
);
e1_dir
=
R0
.
multMatrixVec
(
e1_dir
.
normalize
()
);
var
xa
=
e1_dir
.
cross
(
new
x3dom
.
fields
.
SFVec3f
(
0
,
1
,
0
));
var
ya
=
xa
.
cross
(
e1_dir
);
var
za
=
e1_dir
.
negate
();
var
xa
1
=
e1_dir
.
cross
(
new
x3dom
.
fields
.
SFVec3f
(
0
,
1
,
0
));
var
ya
1
=
xa1
.
cross
(
e1_dir
);
var
za
1
=
e1_dir
.
negate
();
// next construct rotation matrix
// it's in the WORLD coordinates
var
RE1
=
x3dom
.
fields
.
SFMatrix4f
.
identity
();
RE1
.
setValue
(
xa
,
ya
,
za
);
RE1
.
setValue
(
xa
1
,
ya1
,
za1
);
console
.
log
(
RE1
.
toString
());
//
console.log(RE1.toString());
/*
x3dom_draw_ellipsoid_by_semiaxes_and_center("e1b","green",{
O: e2_c,
Ox:
xa
.multiply(e1_abc[0]),
Oy:
ya
.multiply(e1_abc[1]),
Oz:
za
.multiply(e1_abc[2])
},transparency=0.
5
);
Ox:
R0i.multMatrixVec(xa1)
.multiply(e1_abc[0]),
Oy:
R0i.multMatrixVec(ya1)
.multiply(e1_abc[1]),
Oz:
R0i.multMatrixVec(za1)
.multiply(e1_abc[2])
},transparency=0.
0
);
*/
// now let's get to covariance matrix
...
...
@@ -132,21 +349,48 @@ function x3dom_delta_markers(){
console
.
log
(
"e1 restored abc: "
+
[
es_a
,
es_b
,
es_c
].
join
(
" "
));
var
RES
=
new
x3dom
.
fields
.
SFMatrix4f
(
Bn
.
E
.
x
[
0
][
0
],
Bn
.
E
.
x
[
0
][
1
],
Bn
.
E
.
x
[
0
][
2
],
0
,
Bn
.
E
.
x
[
1
][
0
],
Bn
.
E
.
x
[
1
][
1
],
Bn
.
E
.
x
[
1
][
2
],
0
,
Bn
.
E
.
x
[
2
][
0
],
Bn
.
E
.
x
[
2
][
1
],
Bn
.
E
.
x
[
2
][
2
],
0
,
var
RES
matrix
=
new
x3dom
.
fields
.
SFMatrix4f
(
Bn
.
E
.
x
[
0
][
0
],
Bn
.
E
.
x
[
1
][
0
],
Bn
.
E
.
x
[
2
][
0
],
0
,
Bn
.
E
.
x
[
0
][
1
],
Bn
.
E
.
x
[
1
][
1
],
Bn
.
E
.
x
[
2
][
1
],
0
,
Bn
.
E
.
x
[
0
][
2
],
Bn
.
E
.
x
[
1
][
2
],
Bn
.
E
.
x
[
2
][
2
],
0
,
0
,
0
,
0
,
1
);
console
.
log
(
RESmatrix
.
toString
());
var
RESaxes
=
new
x3dom
.
fields
.
SFMatrix4f
(
es_a
,
0
,
0
,
0
,
0
,
es_b
,
0
,
0
,
0
,
0
,
es_c
,
0
,
0
,
0
,
0
,
1
);
var
A
=
RESaxes
.
inverse
().
mult
(
RESmatrix
.
transpose
());
console
.
log
(
RESaxes
.
toString
());
var
RES
=
RESmatrix
.
mult
(
RESaxes
);
var
RESt
=
RES
.
transpose
();
console
.
log
(
"RES"
);
console
.
log
(
RES
.
toString
());
console
.
log
(
"RESt"
);
console
.
log
(
RESt
.
toString
());
/*
x3dom_draw_ellipsoid_by_semiaxes_and_center("e1c","red",{
O: e2_c,
Ox
:
RES
.
e0
().
multiply
(
es_a
),
Oy
:
RES
.
e1
().
multiply
(
es_b
),
Oz
:
RES
.
e2
().
multiply
(
es_c
)
},
transparency
=
0.7
);
Ox: R0i.multMatrixVec(RESmatrix.transpose().e0()).multiply(es_a),
Oy: R0i.multMatrixVec(RESmatrix.transpose().e1()).multiply(es_b),
Oz: R0i.multMatrixVec(RESmatrix.transpose().e2()).multiply(es_c)
},transparency=0.8);
*/
var
v
=
R0
.
multMatrixVec
(
e1_c
.
subtract
(
e2_c
));
var
Av
=
A
.
multMatrixVec
(
v
);
var
Av_model
=
R0i
.
multMatrixVec
(
Av
);
x3dom_draw_line
(
"helper_lineX"
,
"yellow"
,
e2_c
,
e2_c
.
add
(
Av_model
));
// now get error:
...
...
@@ -155,10 +399,9 @@ function x3dom_delta_markers(){
// 2. RES and es_a, es_b, es_c
// RES x e1_c
var
RESi
=
RES
.
inverse
();
var
E
=
RESi
.
multMatrixVec
(
e1_c
.
subtract
(
e2_c
)
);
var
E
=
RESi
.
multMatrixVec
(
v
);
console
.
log
(
"delta vector in ellipsoid:"
);
console
.
log
(
E
.
toString
());
...
...
@@ -170,15 +413,18 @@ function x3dom_delta_markers(){
// scale the result ellipsoid so it with touch another marker
// and it did - it only tests that the scale is correct
/*
x3dom_draw_ellipsoid_by_semiaxes_and_center("e1d","gold",{
O: e2_c,
Ox: RES.e0().multiply(E.length()*es_a),
Oy: RES.e1().multiply(E.length()*es_b),
Oz: RES.e2().multiply(E.length()*es_c)
},transparency=0.7);
*/
// alternative calculations where E^2 = delta^T x C^-1 x delta
var
delta
=
e1_c
.
subtract
(
e2_c
)
;
var
delta
=
v
;
var
Ci
=
C
.
inverse
();
var
Ci_x_delta
=
Ci
.
multMatrixVec
(
delta
);
...
...
@@ -264,6 +510,8 @@ function x3dom_draw_ellipsoid(id,color,transl,rotat,scale,transparency=0.5){
function
x3dom_draw_line
(
id
,
color
,
p1
,
p2
){
$
(
"#"
+
id
).
remove
();
var
coords
=
[
p1
.
x
+
" "
+
p1
.
y
+
" "
+
p1
.
z
,
p2
.
x
+
" "
+
p2
.
y
+
" "
+
p2
.
z
...
...
js/x3dom_init.js
View file @
80551632
...
...
@@ -1586,6 +1586,8 @@ X3DOMObject.createNewMarker = function(x,y,z){
// Update marker in Data
mark
.
latitude
=
map_mark
.
_latlng
.
lat
;
mark
.
longitude
=
map_mark
.
_latlng
.
lng
;
// used to be zero, but now it's not zero
mark
.
altitude
=
Data
.
camera
.
kml
.
altitude
+
xyz_real
.
y
;
// register events for a new marker in Data
X3DOMObject
.
MapMarker
.
registerEvents
(
map_mark
);
...
...
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