float fov = camera()->fieldOfView(); if (fov != 0.0f) camera()->setFieldOfView(2*scale); else camera()->setViewSize(scale2F);
void EarthView::mouseDoubleClickEvent(QMouseEvent *e){ QVector3D pick = mapPoint(e->pos());...
pick.normalized() * 0.5
// длина вектораqreal norm(QVector3D v){ return sqrt(v.x()*v.x()+v.y()*v.y()+v.z()*v.z());}// скалярное произведение 2х векторовqreal sprod(QVector3D v1, QVector3D v2){ return v1.x()*v2.x()+v1.y()*v2.y()+v1.z()*v2.z();}// знак числа// x>0 : 1// x=0 : 0// x<0 : -1int Sign(float x){ return (x>0)-(x<0);}/* *p - начальная точка луча *l - направляющий вектор луча, необяз. единичный *c - центр сферы *r - радиус сферы */float Ray2Sphere(QVector3D p, QVector3D l, QVector3D c, float r){ // квадрат радиуса r*=r; // квадрат расстояния от точки до центра сферы float d=qPow(norm(c-p),2); // проекция центра сферы на луч float s=sprod(c-p,l)/norm(l); if(d>r && s<0) // точка снаружи сферы и луч направлен от сферы return -1; // нет пересечения // квадрат расстояния от прямой до центра сферы по теореме Пифагора float h=d-s*s; if(h>r) // луч не пересекает сферу return -1; return s+sqrt(r-h)*Sign(r-d); // расстояние до пересечения}