Hello,
I’d like to compute the direction/heading between 2 Cartesian3.
I try Cartesian3.angleBetween but it seems to always return 0.
Thank U
Hello,
I’d like to compute the direction/heading between 2 Cartesian3.
I try Cartesian3.angleBetween but it seems to always return 0.
Thank U
Perhaps you could post it to a Cesium sandcastle to help debug it.
Thanks for answering @Hyper_Sonic
Here is the sandcastle https://sandcastle.cesium.com/#c=nVlpb9tWFv0rRL6MDHjkty9JWkyapQ3g1IbrtCjqImAkOiYqiwZFJ/UE/u9zKZ7z5CWYASZF2+jovnf3cy+pz3VffW6bL01ffVetmy/Vy2bTXl/Of91is38sth9fduuhbtdN/4/96uvZuqqGpu8FOO67z+1Szj7luUXf1EPzW9evlqeTzGxv/2x9u/fsbH22/izaakFvjs6Pu007tN16I1/Uy+Vxt7pZiYbZTnAz1P3wej20w43YJjK/7ACInV+vF+Ml1b0bthZWjxTJJTDypdwjf6vXdn7ed5evmk9902xejPKzP6bD/BPm1rms476z8+iCSW5/i3nrAjDnPbAYPbCo84QFo9yERe0NMJcsMM+zISmcjSmlCYs6FEgD8pZiOcKUpGzmdQpyyWZi2lpgydC8TBVZp0zMQC5bRddS9MQ85WIgZpxmCKg3K2eAqUhbUsRZHz0xMR+Y97RPTAXmCHlG1DsNtcl5qPAmZMppqtCOKoIjpmKknNHELDGKiaGhQFDrAhOUAhPkLIsg+URsp9Ya3GeT5VmjNTFAJSQ6MNslTDYrSgXaK1hmCSjLy4Ijxoqy0cMv+TshzepxzKwNyhJLyIRkj6YEVo+VqibmUMjWBGoV2yeoFFmEApMz7Y0ZhphUylMrKDA+GAaOJWasI0YfjGYHJKlUYIppGI0kxMrR7FmjY7EkwV6pXNqbtCkqDHOjcZ8uTSH1ivt0pJw0HuVCKHmFCu1LYgOloiHkGRMdfBGLmkcNLZF+B2bzriaowinKGV2sY7JDtsiF9LglyyTNSEViY8UAY3uGYJhHw8IOnq1dAh8860RiTCwZekHykGpiBCw5MCpWsTaucKAjxIYNQbtyNBUn6Kxih0XD4hG/mDLtNTGSh6j1BaNc4U/lSxoN1BaaEOpCSJQqmc12ErM5uEJPCJPN0qBk2TCdtWlMyoR5S6xUSs4oKBtZeF4IlZjOky1e/IaOEBEBLwUSgfkYgGXviekp8EKAWRMDVXiTjX54nyXN2pBgsx9dIoZW9s4nQqg8740tYhZqgwJDjxig7CkmhTRhMSl6gboTZtOEjIPBiWQkGMagz6potRFasy/XRRRtUAo9IAEFzwQlIxkYyyKojHK0wlZTgoJUFORSQPCCTuhvSS5cC8bS22xtBhZDLsUCvVZj5Mm4TrjPyiRm7YUpBuItiVBFsK9MN84LrcyUNGlR8qo2BmclMOQLmckTJuXAFgog/RCyYucmMKZUQ+TZjOyGKERFDEUgPR8KN6CApEsLnTNU2RX6cQGhypm0ZyxGQVTGkpLkH2DWk+S5cAnVkQqtAhVGY+mutejdKBDnngcFb4uOsxDlMrJdmZlWA3NkEdGH+3xhkbE8gckRzlGkTYjVFlOgQuZuKKMV10WXH0YgZU5qZcAEEnfHACAmQZdxjojIbKBKjwEchUOLZRonoypeWUPTmDApO1qmwm5hCMBs0cqZJKYxOeNSBBeULgH2dEsz2U5hQ44y4+GXK8mWaWu5gFFtsrbsaYyILyse6UJMYW7EbboRuJaEUM6GzO1axg3Vkvblr8U1lGIyDGgM7B5pFKrV7JTsWU5lKHnFqovSv4B8piVECsAuFtLWvN+DFaRz4840T8ynkgnKGVfstdTpaFoE44tpxfvEJOYUmBzFRSDT02RQwfKwYX3JYaSKSMjQCWV5GzIto1Qn3oZx6Zl74ZIpkt6WskHqxXzGI2ksWl7mNzFWpvcOI1BuQ0PIBMLKKxhjFByri2TvQ6IdGmTgZXQUDUA4dUaXoDOWy5LFvuPHmFJn5NkUbClphChpXzCYJuXGNCdUrzxtWIplPHt5LgpyEBuVNH7JVYBW6V4yUGLVyIQrZ7FAS2HTkMRqkMGFkSjtgf4I454DzGEXkaEGDdlP9gZPUs4RS0fwXOOiED/FuLIJhl00BIWFKinFsyGDl+RZGbwk0wizSjBkQqYR9CYVkEPJKjKWtvvmFpPBSCyh48Jo+xYyHhGWlRHdILUUADksqMmCbaJUeQLk4IQ8v4MyZIPCE2DUCVUtyUfNyWKH/Uf6yELOKDyNprJSS8+C0eQONNy4+cMJz0VeZiDPBo0uFC5Cs8ruhODJKoHClprAlimVDVOEHy2gzOvkW4gJ91tg1GrxiJaENabeHGfmBAlpwA6vsYsncQx+eecoFxyxhAfelEcPt1jg/EqysBLLWH5EDoUyWkfMomXHIcuzHpM/bsl9whIoXdoeD0GyDrECUgB/y44JcpLVH3qzPPpPmLiNLXtc+Cf7RhaZdIjJYHqpLTSBYCYCI8IQC+mBEscXMtDgAlZReVLABBdSoMXjsjBhAYHK4ySbIHmkwVF5vIQK8QLGeYclQR6uaJzn9izbCGaOyGFLkDCqglFtDuWsRcGnzBdGgsGLnLGMSyryFKesFK8LGnGXaOcAzAbKeWxXOeRMOdRnlimSAWW8fhLqQYgFw3DKwhA8ivVXCgCDPpd5JWJwVpZfxaOsHpFDReXElwOCMciSNEvrKCcXBqqdBpk8TCosDoJg5xRmTMQmi0cxXifrdADmEROL9IyPpuCjPL6fA0Y+ylK/vI5DYHxIFa13X3r+Ob5b3X2c/j6+kL3qVjflfez00njejJ/bZjOvl8vZ17vnrvA+tnpafb3/TvWqvJF9+ugl7f590S/tcrgQMTdXD765rIemb+uVfHnntTVfAv+46r68g8Rx3101/XAz+7roVt2dd9Uvx4/z318fHh79drv34P7Fqr68Ou1+7Lvr9VLODP11c1fidvpwu/dsDNHtw7fR995Vb/3fRrBd/3DdrpYP37YfF3w2BX/8t2+G6379vwO9C+jjcP6h/nzg18d2tfrY1f3yUVrGP+1l/al5esfO7QvybaBm96J2cvT7i8MfDt+/3q9c2psP3at6qN+fHM4exnFbPBL+dlGvjvr2U7su8f/1Hjz/4ej09OjdN45fNO2ni+GkOW/6Zr1oyvmf7uPzl4cv3h1/OD368OPJ0fufX92/6Hb3cZez8X938raoLw+77q8XQ/kN4Zd6vVzUm2HVzJeNlETfzIrQlKkxrQtJzjal3wh/ERr6er057/rL3e8Qp4Q280aU/Nz1w8V7Kbo37d/N8k1fX4q27dVQNVWCGND09Xy1NaJcMaN/RU+J5J1C+6mpl+3603E7LC5O6vWnZqb2+Z30y8X8+O2Ho19fn3x4c/T+ZL+SB121N14z/dxSVQcH/92I3VV9+7ebv331+ufTt6e/T8fvN8n56ua0Q6C/Eebt17tmGCPYriWq9Qo+SBjVMzHoQrK/X72tvtTroRq6atFdXl0PTdVuP31squGikRKaznxshi9Ns/5Woiqx4TGu/ywWTI5PZt/5bYrkWbpped3XWw+fVrbkoDs/3zTDfbJ6nIy7mRi6E/laAju77/fefvXPb8s5L98Zpmys8+oZon62vhNiYZDTrlt9rPt3zfp6+sUL1g/N38PT6uzJWOFVPUy/wRUqP3sCfyQyzapZiGhJ52xvF4E7fYRRcrs9OP33gao3Y0D/T0WooftKpqElU+zJ/pPnm+Fm1XxP+X+1l1fSZNV1v5rN5wdDc3m1kimxOfh4vfirGeaLzYaXPT+4e/T5sv1ctcvvzp48+EH07Mk4KTYb+eb8erX6pf23GP/98wORf3R01W0TeCR0uKpvRrEL/f3hBM7n8+cH8vHbJ4cpXQ9u/g8
What I want to achieve is to make a flyTo with heading equal to the direction/heading of the first 2 positions of a polyline
Thanks
This function should give you the desired heading (angle seems just slightly off,not sure why)
function getHeading()
{
var CC3=Cesium.Cartesian3;
let pathDir=new CC3();let temp=new CC3();let GD_transform=new Cesium.Matrix4();
Cesium.Transforms.eastNorthUpToFixedFrame(viewer.scene.camera.position, viewer.scene.globe.ellipsoid, GD_transform);
let east=new CC3(GD_transform[0],GD_transform[1],GD_transform[2]);
let north=new CC3(GD_transform[4],GD_transform[5],GD_transform[6]);
let up=new CC3(GD_transform[8],GD_transform[9],GD_transform[10]);
//pathDir is 1st leg projected onto horizontal plane
CC3.subtract(arrayOfPositions[0],arrayOfPositions[1],pathDir); //seems backwards
CC3.normalize(pathDir,pathDir);
let scale=CC3.dot(up,pathDir);
CC3.multiplyByScalar(up, scale, temp);
CC3.subtract(pathDir,temp,pathDir);
//get ang from north
let ang = CC3.angleBetween(north, pathDir); //I assume always positive
if(CC3.dot(east,pathDir) < 0){ang*=-1;} //get sign of ang
return ang; //in radians
}
Awesome @Hyper_Sonic, it works !
Thank u so much !
Glad it worked! I’m still not sure about
CC3.subtract(arrayOfPositions[0],arrayOfPositions[1],pathDir);
I think it should be the other way around, [1] minus [0], which should yield a vector starting at [0] going to [1]. However for some reason that seemed to give me the reverse direction. It seems that it still gives a heading slightly to the left, I’m not sure if the hill has something to do with that, perhaps it wouldn’t on flat ground.
EDIT: I was looking at how Cesium determines camera heading
github.com/CesiumGS/cesium/blob/1.71/Source/Scene/Camera.js#L912
Saving the old transform, replacing it with ENU transform (presumably transforming the camera vectors to be in terms of this other transform) then simply does atan2 with the x&y, then setting back to the old transform (transforming the camera vectors back.)