-
世界/本地空间中的拾取射线-python实现pdf转换成word/txt纯文本文件下载
资源介绍
图 16.4 由相似三角形可知
1
v vy y
d
′
= 和
1
v vx x
d
′
= 。
回忆一下,在投影矩阵中 00
1
=
tan
2
r
α
P 和 11
1
=
tan
2
α
P 。我们可以将上述方程改写为:
00
11
2
1 /
2
1 /
s
v
s
v
x
x
w
y
y
h
′ = −
′ = − +
P
P
这样,我们可以引出一条穿过点(xvʹ , yvʹ ,1)的拾取射线,它与穿过点(xv , yv ,d)的拾取射
线是同一条射线。下面给出了在观察空间中计算拾取射线的代码:
void PickingApp::pick(int sx, int sy)
{
XMMATRIX P = mCam.Proj();
// 在视空间中计算拾取射线
float vx = (+2.0f*sx/mClientWidth - 1.0f)/P(0,0);
float vy = (-2.0f*sy/mClientHeight + 1.0f)/P(1,1);
// 视空间中的射线定义
XMVECTOR rayOrigin = XMVectorSet(0.0f, 0.0f, 0.0f,1.0f);
XMVECTOR rayDir = XMVectorSet (vx, vy, 1.0f,0.0f);
注意,该射线的起点是观察空间的原点,因为观察点位于观察空间的原点上。
16.2 世界/本地空间中的拾取射线
现在,我们已经知道了如何计算观察空间中的拾取射线,但是它的用途非常有限,因
324 / 351