首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络游戏 >

怎么让一矩形与一斜面平行

2012-03-22 
如何让一矩形与一斜面平行有一地形斜面,我使用D3DXIntersect函数求得此斜面的三角形信息,那么我用这个三角

如何让一矩形与一斜面平行
有一地形斜面,我使用D3DXIntersect函数求得此斜面的三角形信息,那么我用这个三角形信息得到其法线,我想用此法线再利用D3DXMatrixRotationAxis函数求得与此地形平行的矩阵。

如上图:如何让透明矩阵A平行于下方的斜面。其实我想要的效果就是3D战略游戏中角色行动时显示的范围,入下图。


搜索网络上大致的思路就是
两向量叉乘得到旋转轴。(我的情况应该是以斜面的法线为旋转轴吧)
两点点乘的反余弦得到旋转角。(这个旋转角如何求出)
有了轴和角就能构造一个旋转矩阵了(有了轴和角度用D3DXMatrixRotationAxis就能得到我想要的效果了?)。

以下是思路代码,请指点:
D3DXIntersect(pMesh->GetID3DXMesh(), &Pos, &Dir, &Hit, &FaceIndex, &u, &v, &Dist, NULL, NULL);

pMesh->GetID3DXMesh()->LockVertexBuffer(0L, (LPVOID*)&pVertices);
pMesh->GetID3DXMesh()->LockIndexBuffer(0L, (LPVOID*)&pIndices);
// 面三个顶点的索引
wFace0 = (WORD)pIndices[3 * FaceIndex + 0];
wFace1 = (WORD)pIndices[3 * FaceIndex + 1];
wFace2 = (WORD)pIndices[3 * FaceIndex + 2];
// 根据顶点索引获取面三个顶点的坐标
D3DXVECTOR3 v0 = pVertices[wFace0];
D3DXVECTOR3 v1 = pVertices[wFace1];
D3DXVECTOR3 v2 = pVertices[wFace2];

// 计算当前面的法线
D3DXVECTOR3 vCross1(v2 - v0);
D3DXVECTOR3 vCross2(v1 - v0);
D3DXVECTOR3 vNormal;
D3DXVec3Cross(&vNormal, &vCross2, &vCross1);// 计算两个3-D向量叉乘
pMesh->GetID3DXMesh()->UnlockVertexBuffer();
pMesh->GetID3DXMesh()->UnlockIndexBuffer();

D3DXVECTOR3 vResult;
D3DXVec3Normalize(&vResult, &vNormal);
float Angle = acos(D3DXVec3Dot(&D3DXVECTOR3(这里应该是哪个轴?), &vResult));
// 以法线为坐标轴旋转
D3DXMatrixRotationAxis(&g_matTmp, &vNormal, Angle);

如果还有更好的办法请指教,先谢了。

[解决办法]
只谈数学:
设平面参数方程为:aX + bY + cZ = D
求的你斜面的法线(a',b',c')代入a,b,c。
[解决办法]
地形平面和法线 可以确定一个局部坐标系A。你的问题就转化成了 求 当前坐标系到坐标系A的变换矩阵M44。
[解决办法]
如果这个模型是导出来的,每个顶点的法线肯定都已经计算好过了,只要获得三个顶点法线,做个平均值就可以认为是这个三角面的法线了。没有必要去计算。
[解决办法]
你找个.X格式的模型,如果是从3dmax等导出来的肯定有这样的属性
MeshNormals {
 4;
 0.000000;0.000000;1.000000;,
 0.000000;0.000000;1.000000;,
 0.000000;0.000000;1.000000;,
 0.000000;0.000000;1.000000;,
}
这就是已经生成好的法线,


使用 ID3DXBaseMesh::CloneMeshFVF这个可以把你想要的顶点数据克隆出来,可以只克隆位置、纹理坐标、法线等。这样你不就直接得到法线了,
TN = (VN1+VN2+VN3)/3.0f。


CloneMeshFVF这个计算很慢,一定要在初始化的时间用。
[解决办法]
就算你模型不是导出来的,是自动生成的,也肯定要把顶点法线预先算出来。不可能每次用的时候临时算。所以模型里肯定已经有顶点法线了。
[解决办法]
看他们的法向量是否平行啊

热点排行