1:如何判断一条射线是否穿过一个多边形区域
刚才看到一个 Intersection test 算法"
假设射线为V,V.Origin表示射线源的坐标(x,y,z),V.Direction表示射线的方向(v1,v2,v3);
三角形为T,T的3个顶点分别为P1,P2,P3。
首先计算V.Origin到T的3个顶点的向量VP1,VP2,VP3,然后组成矩阵
VP1.X, VP2.X, VP3.X,
VP1.Y, VP2.Y, VP3.Y,
VP1.Z, VP2.Z, VP3.Z,
下来对上面的矩阵求转置,最后左乘V.Direction的到一个3维向量,
如果这个3维向量的每个值都在[0,1]范围内,则 Intersection test 返回 true
我有点搞不清楚,最后[0,1]的范围判定表示什么意思…
D3DXIntersectTri()这个函数已经可以了吧!
2:如何计算向量与矩阵的乘积?
DX8有三个(组)函数用来计算向量和矩阵的乘积:(以下都以三维向量为例)
D3DXVec3Transform 计算一个三维向量的齐次坐标与一个4x4矩阵的乘积,返回一个4维向量
D3DXVec3TransformCoord 计算一个三维向量的齐次坐标与一个4x4矩阵的乘积,然后把得到的4维向量的前三个分量分别除以第四个分量,得到一个变换后的三维坐标
D3DXVec3TransformNormal 同样是计算三维向量与4x4矩阵的积,但是扩展成齐次坐标的时候,第四维不是1而是0,其他与前一个函数相同
3:关于D3DXVec3Project 函数的说明:
得到的应该是你在 backbuffer 里的位置,如果你的 backbuffer 大小跟窗口不一致,那你还需要做相应的变换,
4:D3DXVec2CatmullRom 函数的含义?
进行Catmull-Rom插值计算。这里是2-D向量插值。
定义:
D3DXVECTOR2 *WINAPI D3DXVec2CatmullRom( D3DXVECTOR2 *pOut,
const D3DXVECTOR2 *pV0,
const D3DXVECTOR2 *pV1,
const D3DXVECTOR2 *pV2,
const D3DXVECTOR2 *pV3,
FLOAT s
);
参数:
pOut
[in, out] 指向 D3DXVECTOR2 结构的操作结果。
pV0
[in] 指向 D3DXVECTOR2 结构的位置向量。
pV1
[in] 指向 D3DXVECTOR2 结构的位置向量。
pV2
[in] 指向 D3DXVECTOR2 结构的位置向量。
pV3
[in] 指向 D3DXVECTOR2 结构的位置向量。
s
[in] 权重因数。看说明。
返回值:
指向 D3DXVECTOR2 结构的Catmull-Rom插值结果。
说明:
如果有四个点 (p1, p2, p3, p4),找出一个函数Q(s)满足下面的条件:
Q(s)是三次函数方程。
当s的范围从0到1时,Q(s)值在p2和p3之间。
当s为0时,Q(s)的直线平行连接p1 和 p3的直线
当s为1时,Q(s)直线平行于连接p2 和p4的直线。
Catmull-Rom样条也可以从Hermite样条取得:
v1 = p2
v2 = p3
t1 = (p3 - p1) / 2
t2 = (p4 - p2) / 2
其中:v1 是 pV0。v2 是pV1。p3 是 pV2。p4 是 pV3。
用Hermite公式:
Q(s) = (2s3 - 3s2 + 1)v1 + (-2s3 + 3s2)v2 + (s3 - 2s2 + s)t1 + (s3 - s2)t2
用上面的变量代换,上面公式就变换为:
Q(s) = (2s3 - 3s2 + 1)p2 + (-2s3 + 3s2)p3 + (s3 - 2s2 + s)(p3 - p1) / 2 + (s3 - s2)(p4 - p2)/2
再整理为:
Q(s) = [(-s3 + 2s2 - s)p1 + (3s3 - 5s2 + 2)p2 + (-3s3 + 4s2 + s)p3 + (s3 - s2)p4] / 2
5:D3DXQuaternionToAxisAngle 函数的含义?
用一个向量和绕着这个向量旋转角度来计算一个四元数。