在D3D中从屏幕坐标投射3D矢量似乎违反直觉

时间:2012-03-10 15:55:06

标签: direct3d linear-algebra

我用来计算基于鼠标点击的3D矢量的数学运算正常,但它工作的事实让我困扰 - 具体来说,我正在缩放视野,在垂直轴上表示方面水平轴的比率,而不是基于水平轴的视野计算新的比率 - 这让我烦恼的原因是我正在线性缩放视野,而重新计算水平轴的fov正切不是线性 - 所以我想知道在一天结束时我的相机中是否有一个稍微有点变态的镜头

这是代码,它工作正常(请注意,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 个答案:

答案 0 :(得分:1)

我同意这是投影的一个方面,起初不直观。

你眼睛的视野主要投射在球体上。因此,无论您是直视它还是在周边视觉中看到它,对着某个角度的物体看起来都具有相同的大小。对象的两个边缘之间的角度差异是定义大小的角度差异,因此与对象的角度是定义其在视野中的位置的好方法。

投影到平面时,规则略有不同。看看这张图片:

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)