Проецирование трехмерного вектора из координат экрана в D3D кажется нелогичным - PullRequest
1 голос
/ 10 марта 2012

Математика, которую я использую для вычисления трехмерного вектора на основе щелчка мышью, работает нормально, но тот факт, что он работает, меня беспокоит - в частности, я масштабирую поле зрения, выраженное на вертикальной оси аспектом отношение для горизонтальной оси, вместо того, чтобы вычислять новое отношение на основе поля зрения для горизонтальной оси - причина, по которой меня это беспокоит, заключается в том, что я линейно масштабирую поле зрения, тогда как пересчет тангенса поля для горизонтальной оси не линейный - так что мне интересно, есть ли у меня немного аберрантный объектив в моей камере в конце дня .

Вот код, который отлично работает (обратите внимание, что 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 делает вещи, и мне просто придется с этим смириться - мне интересно, какой путь на самом деле правильный (столько, сколько что-либо может быть правильным в попытке подтолкнуть линейный алгебра через дискретную сетку) и почему

1 Ответ

1 голос
/ 10 марта 2012

Я согласен, что это аспект проекции, который на первый взгляд не интуитивен.

Поле зрения ваших глаз по существу проецируется на сферу.В результате объект, который проходит под определенным углом, кажется, имеет одинаковый размер независимо от того, смотрите ли вы прямо на него или видите его в своем периферийном зрении.Разница в углах между двумя краями объекта - это то, что определяет размер, и, следовательно, угол к объекту является хорошим способом определения его положения в поле зрения.

При проецировании на плоскую поверхностьправила немного разные.Посмотрите на это изображение:

enter image description here

Положение каждого объекта на экране не определяется углом к ​​этому объекту.Вместо этого мы используем похожие треугольники:

(distance from center of screen)     (offset from sight line to object)
________________________________  =  ___________________________________________
(distance from eye to screen)        (distance along sight line to object plane)
...