D3D开发中你必须知道的一些函数和数学知识

一、角度和弧度

一个圆为360度,一个圆周长弧为2πR当R为1时的单位圆周长为2π


则360度的单位圆弧度为2π则:


360 = 2π则:


180 = π则:


一弧的度数180/π下面记作:度每弧


一度的弧长π/180下面记作:弧每度


则:


角度 = 已知的弧长 / 弧每度 或者 角度 = 已知弧长 * 度每弧


弧长 = 已知角度 / 度每弧 或者 弧长 = 已知角度 * 弧每度


注意别弄混了!!(三角函数全部都是通过弧长计算)


sin()正弦函数


数学中三角函数,直角三角形中 对边与斜边的比值


例子1:


直角三角形中已知角A的度数为30度求该角度的正玄值


由于sin函数需要知道角度的弧度才能计算,则先把30度转成弧长


根据上面的公式则30度的弧长为30 * 弧每度 = 30 * π / 180 = π / 6


则30度的正弦值为sin( π / 6 ) = 0.5


例子2:


直角三角形中已知一个角C的弧度为1.57求该角C的角度


已知弧度为1.57则根据上面的公式得出角度为 = 1.57 * 度每弧 = 1.57 * 180 / π = 90度


cos()余弦函数


数学中三角函数,直角三角形中 邻边与斜边的比值




二、向量Vector




既有大小又有方向的量,向量在游戏里面非常重要


人物的移动,模型的移动旋转等都离不开它


D3DXVec3Length()向量长度


求一个向量的模


D3DXVec3LengthSq()向量长度平方


求一个向量模的平方,由于开方比较耗时,有时候只需要判断模是否相等的一些情况下,直接比较模的平方即可,没有必要求出真正的模


D3DXVec3Normalize()单位化向量函数


让向量只保留方向,此时向量的模为1


D3DXVec3Dot()向量点乘函数


传入两个向量求,函数返回的是一个标量常数,一般通过这个函数可以求这两个向量的夹角


根据数学知识cos(角度) = v1和v2的点乘值/v1和v2的模相乘


则:


角度 = acos( v1和v2的点乘值/v1和v2的模相乘 )


D3DXVec3Cross()向量叉乘函数


传入两个向量可以求出垂直于这两个向量的向量,即:已知v1和v2求v3垂直v1和v2组成的平面


一般通过求出的垂直向量可以实现鼠标拖动模型,模型绕这个轴旋转,鼠标拖动可以求得这时拖动的及时方向,再求得鼠标在世界坐标系的射线方向,根据这两个向量


垂直向量即可实现模型拖动,或者FPS游戏里面的鼠标调整武器位置。


D3DXVec3Project()


3D空间坐标转2D屏幕坐标


D3DXVec3Unproject()


2D屏幕坐标转3D空间坐标

D3DXVec3Lerp()向量线性插值


根据一个0-1的浮点数,计算两个点之间的位置,实现物体从v1移动到v2,移动的轨迹为一条直线


浮点为0时物体保持不变浮点为1表示物体移动到终点的位置,0-1之间表示物体还在v1和v2之间的某个点。


D3DXVec3Hermite()向量哈米特插值


根据一个0-1的浮点数,计算两个点之间的位置,实现物体从v1移动到v2,移动轨迹为一条曲线


现在市面上大部分捉鱼捕鱼的游戏中,鱼游动的算法就是使用这个算法或者类似算法实现的。


D3DXVec3CatmullRom()


也是求曲线和米特插值类似


D3DXVec3BaryCentric()


求根据权重求三个向量组成的三角形重心坐标


D3DXVec3Transform()


坐标变换使用



D3DXVec3TransformCoord()


坐标变换使用


VOut.x = V1.x * M.11 + V1.y * M.21 + V1.z * M.31 + M.41

VOut.y = V1.x * M.12 + V1.y * M.22 + V1.z * M.32 + M.42

VOut.z = V1.x * M.13 + V1.y * M.23 + V1.z * M.33 + M.43


D3DXVec3TransformNormal()


向量变换使用,注意向量与坐标的区别


向量是两个坐标的差值


坐标是具体的点


VOut.x = V1.x * M.11 + V1.y * M.21 + V1.z * M.31 

VOut.y = V1.x * M.12 + V1.y * M.22 + V1.z * M.32 

VOut.z = V1.x * M.13 + V1.y * M.23 + V1.z * M.33




三、矩阵Matrix




D3DXMatrixRotationX( D3DXMATRIX* pOut, FLOAT Angle )


输入角度输出绕X轴旋转的旋转矩阵


D3DXMatrixRotationY()


输入角度输出绕Y轴旋转的旋转矩阵


D3DXMatrixRotationZ()


输入角度输出绕Z轴旋转的旋转矩阵


D3DXMatrixRotationAxis()


输入角度和任意旋转轴向量输出绕任意轴旋转的矩阵


这个函数比较重要,游戏中可能会经常用到


D3DXMatrixTranslation()


输出移动矩阵


D3DXMatrixScaling()


输出放大或者缩小矩阵


D3DXMatrixIdentity()


单位化矩阵


D3DXMatrixTranspose()


输出转置矩阵,即行和列交换


D3DXMatrixInverse()


输出逆矩阵




四、齐次坐标




所谓齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示。例如,二维点(x,y)的齐次坐标表示为(hx,hy,h)。


由此可以看出,一个向量的齐次表示是不唯一的,齐次坐标的h取不同的值都表示的是同一个点,比如齐次坐标(8,4,2)、(4,2,1)表示的都是二维点(4,2)。


许多图形应用涉及到几何变换,主要包括平移、旋转、缩放。以矩阵表达式来计算这些变换时,平移是矩阵相加,旋转和缩放则是矩阵相乘,综合起来可以表示为p' = p *m1+ 


m2(m1旋转缩放矩阵, m2为平移矩阵, p为原向量 ,p'为变换后的向量)。引入齐次坐标的目的主要是合并矩阵运算中的乘法和加法,表示为p' = p*M的形式。即它提供了用矩


阵运算把二维、三维甚至高维空间中的一个点集从一个坐标系变换到另一个坐标系的有效方法。




五、阴影

--------------------- 

作者:freeangeles 

来源:CSDN 

原文:https://blog.csdn.net/f_r_e_e_x/article/details/36883627 

版权声明:本文为博主原创文章,转载请附上博文链接!


转载记录2018-12-27浏览(1526评论(8544)