Commit 43da7d62 authored by Oleg Dzhimiev's avatar Oleg Dzhimiev

subbing INIT_HEADING to matrix mults

parent 233e7e28
......@@ -289,22 +289,30 @@ function x3d_initial_camera_placement(){
// rw = real world with North
// w = virtual world = x3dom frame reference
var R_rw2w = T.inverse().mult(R).mult(T);
var Rw_rw = T.inverse().mult(R).mult(T);
var M_rw2w = R_rw2w.inverse();
var M_rw2w = Rw_rw.inverse();
var Rmap_rw = T.inverse().mult(Mh).mult(T);
// _rw - real world
// _w - virt world
var Rc_rw = T.inverse().mult(Mh).mult(T);
var Rc_w = M_rw2w.mult(T.inverse()).mult(Mh).mult(T);
var Rc_w = M_rw2w.mult(Rc_rw);
//var Rm_w = M_rw2w.mult(Rm_rw);
// store matrices
Data.camera.Matrices = {
Ah: heading,
At: tilt,
Ar: roll,
R_h_eul: Mh,
R_t_eul: Mt,
R_r_eul: Mr,
R_rw2w : R_rw2w,
Rw_rw : Rw_rw,
M_rw2w : M_rw2w,
V_trueUp_w: Rc_w.e1()
V_trueUp_w: Rc_w.e1(),
Rc_w: Rc_w,
//Rm_w: Rm_w
};
// set view
......@@ -317,6 +325,9 @@ function x3d_initial_camera_placement(){
viewpoint.attr("position",Rc_w.e3().toString());
viewpoint.attr("centerOfRotation",Rc_w.e3().toString());
// update every time
Data.camera.Matrices.Rc_w = Rc_w;
}
function x3d_events(){
......@@ -493,9 +504,9 @@ function leaf_events(){
//var azimuth = getAzimuth(p1_ll,p2_ll);
var azimuth = getAzimuth(p1_ll,p2_ll);
var initial_heading = INIT_HEADING;
//var initial_heading = Data.camera.Matrices.Ah*180/Math.PI;
var angle = azimuth - initial_heading;
var angle = azimuth - Data.camera.Matrices.Ah*180/Math.PI;
var distance = p1_ll.distanceTo(p2_ll);
//console.log("angle from lat lng: "+angle);
......@@ -595,7 +606,7 @@ function leaf_mousemove_nohc(e){
var newheading = Data.camera.heading - INIT_HEADING;
if ((p0.lat!=p1.lat)||(p0.lng!=p1.lng)){
console.log("translation");
//console.log("translation");
leaf_translation_v1(p0,p1);
}else{
//leaf_rotation_v1(newheading,dh);
......@@ -626,14 +637,12 @@ function leaf_drag_marker(){
mark.latitude = p2_ll.lat;
mark.longitude = p2_ll.lng;
var azimuth = getAzimuth(p1_ll,p2_ll);
//var initial_heading = Data.camera.heading;
var angle = azimuth - INIT_HEADING;
var distance = p1_ll.distanceTo(p2_ll);
mark.x = distance*Math.sin(Math.PI/180*angle);
mark.z = -distance*Math.cos(Math.PI/180*angle);
var dp_w = x3dom_delta_map2scene(p1_ll,p2_ll);
mark.x = dp_w.x;
mark.z = dp_w.z;
mark.d_map = distance;
......@@ -647,36 +656,9 @@ function leaf_drag_marker(){
function leaf_translation_v1(p0,p1){
var pi = new L.LatLng(p0.lat,p1.lng);
var dx = p0.distanceTo(pi);
var dy = 0;
var dz = p1.distanceTo(pi);
var dl = p0.distanceTo(p1);
//console.log(dx+" "+dz+" "+dl);
var dp_w = x3dom_delta_map2scene(p0,p1);
if (p1.lng<p0.lng){
dx = -dx;
}
if (p1.lat<p0.lat){
dz = -dz;
}
//transform to camera coordinates
var A = Math.PI/180*INIT_HEADING;
var a = Math.atan2(dx,dz);
console.log(A);
dx = -dl*Math.sin(A-a);
dz = -dl*Math.cos(A-a);
console.log("dx="+dx+" dy="+dy+" dz="+dz);
// translation over map = xz
x3dom_translation(dx,dy,dz);
x3dom_translation(dp_w.x,dp_w.y,dp_w.z);
// if not updated then moving in 3D scene will make it jump
Scene.old_view_translation = x3dom_getViewTranslation(Scene.element);
......@@ -687,7 +669,7 @@ function x3d_mouseMove(){
var Camera = Map.marker;
var initial_heading = Data.camera.heading;
//var initial_heading = Data.camera.heading;
//var initial_heading = INIT_HEADING;
var heading = x3dom_getViewDirection(Scene.element);
......
......@@ -162,6 +162,8 @@ function x3dom_getXYPosOr(cnvx,cnvy,round){
*/
function x3dom_getCameraPosOr(round){
//console.log("Getting PosOr");
var elem = Scene.element;
var vm = elem.runtime.viewMatrix().inverse();
......@@ -174,13 +176,25 @@ function x3dom_getCameraPosOr(round){
var R = vm;
var az = Math.atan2(R._02,R._22)*180/Math.PI;
// double check below, random correct result?
az = (az+INIT_HEADING+360)%360;
//var mat = Data.camera.Matrices.Rw_rw;
var mat = Data.camera.Matrices.M_rw2w;
var T = x3dom_C2E();
var el = -Math.asin(R._12)*180/Math.PI;
mat = T.mult(mat).mult(vm).mult(T.inverse());
var test = x3dom_YawPitchRoll(mat);
var sk = Math.atan2(R._10,R._11);
test.yaw = (-180/Math.PI*test.yaw+360)%360;
test.pitch *= 180/Math.PI;
test.roll *= 180/Math.PI;
//console.log(test);
az = test.yaw;
el = test.pitch;
sk = test.roll;
if (!round){
return {
......@@ -239,6 +253,8 @@ function x3dom_setUpRight(){
viewpoint.attr("centerOfRotation",mat.e3().toString());
viewpoint.attr("orientation",AA[0].toString()+" "+AA[1]);
Data.camera.Matrices.Rc_w = mat;
}
function x3dom_rotation(delta_a){
......@@ -284,6 +300,8 @@ function x3dom_rotation(delta_a){
viewpoint.attr("position",from.toString());
viewpoint.attr("centerOfRotation",from.toString());
Data.camera.Matrices.Rc_w = newmat;
}
// horizontal?
......@@ -297,11 +315,11 @@ function x3dom_translation(dx,dy,dz){
var from = mat.e3();
var at = from.subtract(mat.e2());
console.log(from.toString());
//console.log(from.toString());
var newfrom = from.add(delta);
console.log(newfrom.toString());
//console.log(newfrom.toString());
var newat = newfrom.subtract(mat.e2());
......@@ -319,6 +337,8 @@ function x3dom_translation(dx,dy,dz){
viewpoint.attr("position",newfrom.toString());
viewpoint.attr("centerOfRotation",newfrom.toString());
Data.camera.Matrices.Rc_w = newmat;
}
function x3dom_altelev(alt,elev){
......@@ -352,6 +372,7 @@ function x3dom_altelev(alt,elev){
viewpoint.attr("centerOfRotation",newmat.e3().toString());
viewpoint.attr("orientation",AA[0].toString()+" "+AA[1]);
Data.camera.Matrices.Rc_w = newmat;
}
/**
......@@ -420,7 +441,7 @@ function x3dom_C2E(){
}
function x3dom_E2C(){
return x3dom_W2C().inverse();
return x3dom_C2E().inverse();
}
function x3dom_YawPitchRoll(m){
......@@ -435,3 +456,24 @@ function x3dom_YawPitchRoll(m){
roll: roll
};
}
function x3dom_delta_map2scene(p0,p1){
var pi = new L.LatLng(p0.lat,p1.lng);
var dx = p0.distanceTo(pi);
var dy = 0;
var dz = p1.distanceTo(pi);
var dp_rw = new x3dom.fields.SFVec3f(dx,dy,dz);
if (p1.lng<p0.lng) dp_rw.x = -dp_rw.x;
if (p1.lat>p0.lat) dp_rw.z = -dp_rw.z;
// rotate, not transform - because rotated is the camera
var mat = Data.camera.Matrices.Rw_rw;
var dp_w = mat.multMatrixVec(dp_rw);
return dp_w;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment