Математика, которую я использую для вычисления трехмерного вектора на основе щелчка мышью, работает нормально, но тот факт, что он работает, меня беспокоит - в частности, я масштабирую поле зрения, выраженное на вертикальной оси аспектом отношение для горизонтальной оси, вместо того, чтобы вычислять новое отношение на основе поля зрения для горизонтальной оси - причина, по которой меня это беспокоит, заключается в том, что я линейно масштабирую поле зрения, тогда как пересчет тангенса поля для горизонтальной оси не линейный - так что мне интересно, есть ли у меня немного аберрантный объектив в моей камере в конце дня .
Вот код, который отлично работает (обратите внимание, что FOV выражено для горизонтальной оси, а D3D хочет его для вертикальной оси)
double mouseX = ((((double) hitPt.x) / (double) vport.cx) - 0.5) * 2.0;
double mouseY = ((1.0 - (((double) hitPt.y) / (double) vport.cy)) - 0.5) * 2.0;
double tfy = tan((fov/aspr) * 0.5);
double tfx = tfy * aspr;
SFMatrix4 CM1;
this->m_renderSurface->GetRawCameraMatrix(CM1);
CM1.Invert();
origin = CM1 * SFVec3f((nearp * tfx) * mouseX,(nearp * tfy) * mouseY,nearp);
dest = CM1 * SFVec3f((farp * tfx) * mouseX,(farp * tfy) * mouseY,farp);
Я выделил строку, которая оскорбляет мою чувствительность (tfx = tfy * aspr) - Я бы предпочел сделать
tfx = tan (fov) * 0.5;
но это не работает - есть ошибка, которая увеличивается по мере удаления от центра
Я знаю, что именно так D3D делает вещи, и мне просто придется с этим смириться - мне интересно, какой путь на самом деле правильный (столько, сколько что-либо может быть правильным в попытке подтолкнуть линейный алгебра через дискретную сетку) и почему