direct学习笔记-数学基础

 以下的大部分内容来源于Introduction.To.Direct3D9中文版(翁云兵版),《3D图形与数学基础》和网上的一些资料,本人根据这些内容作了一些笔记。


1.数学基础

1.1坐标系

坐标系主要分2种,左手坐标系和右手坐标系。

左手坐标系

 

右手坐标系

注:directx3d使用左手坐标系,opengl使用右手坐标系。

 

1.2向量

既有大小又有方向的量叫做向量 ,向量的大小,也就是向量的长度(或称模)。向量a的模记作|a|。 长度为单位1的向量,叫做单位向量.长度相等且方向相同的向量叫做相等向量.向量a与b相等,记作a=b。

 

 

 

 

 3维向量:

头文件:D3dx9math.h

1.2.1计算向量的值
头文件:D3dx9math.h
FLOAT  D3DXVec3Length(
  __in  const D3DXVECTOR3 *pVa
);

1.2.2规范化向量让向量为1.

调用的函数为:

头文件:D3dx9math.h
D3DXVECTOR3 * D3DXVec3Normalize(
  __inout  D3DXVECTOR3 *pOut,
  __in     const D3DXVECTOR3 *pV
);
1.2.3向量点乘dot product

点乘,也叫向量的内积、数量积。顾名思义,求下来的结果是一个数。

向量向量b=|a||b|cos<a,b>,|a|,|b|皆不为0时,cos<a,b>0 也即向量a与向量b互相垂直。

要实现点乘,调用的函数为

头文件:D3dx9math.h
FLOAT  D3DXVec3Dot(
  __in  const D3DXVECTOR3 *pV1,
  __in  const D3DXVECTOR3 *pV2
);

1.2.4叉乘 cross product
叉乘,也叫向量的外积、向量积。顾名思义,求下来的结果是一个向量,记这个向量为c。
向量c|=|向量a×向量b|=|a||b|sin<a,b>   向量c的方向与a,b所在的平面垂直,且方向要用“右手法则”判断(用右手的四指先表示向量a的方向,然后手指朝着手心的方向摆动到向量b的方向,大拇指所指的方向就是向量c的方向)。
头文件:D3dx9math.h
D3DXVECTOR3 * D3DXVec3Cross(
  __inout  D3DXVECTOR3 *pOut,
  __in     const D3DXVECTOR3 *pV1,
  __in     const D3DXVECTOR3 *pV2);

1.3矩阵

由mn个数排成的m行n列的矩形表   

矩阵

称为m×n矩阵,记作A矩阵,也可记作(αij)或矩阵。数矩阵称为矩阵的第i行第j列的元素。

direct3d中表示矩阵的结构:

typedef struct D3DXMATRIX {
  FLOAT _ij;
} D3DXMATRIX, *LPD3DXMATRIX;

1.3.2 下面是矩阵的几种常用运算的函数。
矩阵转置:
D3DXMATRIX * D3DXMatrixTranspose(
  __inout  D3DXMATRIX *pOut,
  __in     const D3DXMATRIX *pM
);
D3DXMatrixTranspose(&B,&A)
B= D3DXMatrixTranspose(&B,&A)
矩阵求逆:
D3DXMATRIX * D3DXMatrixInverse(
  __inout  D3DXMATRIX *pOut,
  __inout  FLOAT *pDeterminant,
  __in     const D3DXMATRIX *pM
);
第二个参数可以忽略。
转为单位矩阵:
D3DXMATRIX * D3DXMatrixIdentity(
  __inout  D3DXMATRIX *pOut
);
1.3.3 行向量和列向量

矩阵的行数和列数可以是任意正整数,当然也包括 1。

一个n 维向量能被当作  1 x n 矩阵或  n x 1 矩阵。1 x n 矩阵称作行向量,n x 1 矩阵称作列向量。行向量平着写,列向量竖着写。对于向量来说,转置将使行向量变成列向量,使列向量成为行向量.
一个 r x n 矩阵A 能够乘以一个n x c 矩阵B,结果是一个 r x c 矩阵,记作AB。矩阵乘法计算如下:记r x n 矩阵A 与n x c 矩阵B 的积r x c 矩阵 AB 为C。 C的任意元素 Cij等于A 的第i 行向量与B 的第j列向量的点乘结果。
向量在几何上能被解释成一系列与轴平行的位移,一般来说,任意向量 v 都能写成“扩展”形式:

pqr 定义为指向+x+y +z 方向的单位向量,如下所示:

v  = xp  + yq  + zr

现在,向量 v 就被表示成向量pqr 的线性变换了,向量pqr称作基向量。这里基向量是笛卡尔坐标轴,但事实上,一个坐标系能用任意 3

个基向量定义,当然这三个基向量要线性无关(也就是不在同一平面上)。以 pqr 为行构建一个3 x 3 矩阵M,可得到如下矩阵:

 

用一个向量乘以该矩阵,得到:

基向量[1, 0, 0], [0, 1, 0], [0, 0, 1]乘以任意矩阵 M

用基向量[1, 0, 0]乘以M 时,结果是M 的第1行。其他两行也有同样的结果即:矩阵的每一行都能解释为转换后的基向量。

因此可以得到:

1、有了一种简单的方法来形象化解释矩阵所代表的变换。

2、有了反向建立矩阵的可能  ---- 给出一个期望的变换(如旋转、缩放等),能够构造一个矩阵代表此变换。我们所要做的一切就是计算基向量的变换,然后将变换后的基向量填入矩阵。

包含平移的线性变换称作仿射变换,3D 中的仿射变换不能用  3 x 3 矩阵表达,必须使用 4 x 4矩阵。

 

1.3.4变换矩阵

在线性代数中,线性变换能够用矩阵表示。如果T是一个把R映射到R的线性变换,且x是一个具有n个元素的列向量 。 

那么我们把m×n的矩阵A,称为T的变换矩阵

一般来说,变换物体相当于以相反的量变换描述这个物体的坐标系。当有多个变换时,则需要以相反的顺序变换相反的量。例如,将物体顺时针旋转20度,扩大 200%,等价于将坐标系缩小 200%,再逆时针旋转20度。

1.3.4.1平移矩阵:

可以把向量(x,y,z,1)分别平移x+pxy+pyz+pz

 

 

 

平移函数:

 D3DXMATRIX * D3DXMatrixTranslation(
  __inout  D3DXMATRIX *pOut,
  __in     FLOAT x,
  __in     FLOAT y,
  __in     FLOAT z
);

1.3.4.2旋转矩阵(俯视原点是角度是顺时针方向的角度)

绕x轴旋转

y轴旋转

z轴旋转

旋转函数:

D3DXMATRIX * D3DXMatrixRotationX(
  __inout  D3DXMATRIX *pOut,
  __in     FLOAT Angle
);
D3DXMATRIX * D3DXMatrixRotationY(
  __inout  D3DXMATRIX *pOut,
  __in     FLOAT Angle
);
D3DXMATRIX * D3DXMatrixRotationZ(
  __inout  D3DXMATRIX *pOut,
  __in     FLOAT Angle
);
1.3.4.3缩放矩阵

缩放矩阵求逆:

 

D3DXMATRIX * D3DXMatrixScaling(
  __inout  D3DXMATRIX *pOut,
  __in     FLOAT sx,
  __in     FLOAT sy,
  __in     FLOAT sz
);

综合变换:

多种变换一起使用时,可以先把各种变换矩阵乘起来得到的矩阵就是综合变换的矩阵。这样可以减少矩阵的相乘数。

 

 

1.4 面

平面(plane

一个平面可以由一个法向量n和一个点p来描述,假设p1p2是平面上的任意两个点,则有n(p1-p2)=0

又有:

N*p+d=0

D3D的平面
typedef struct D3DXPLANE
{
#ifdef __cplusplus
public:
    D3DXPLANE() {}
    D3DXPLANE( CONST FLOAT* );
    D3DXPLANE( CONST D3DXFLOAT16* );
    D3DXPLANE( FLOAT a, FLOAT b, FLOAT c, FLOAT d );

    // casting
    operator FLOAT* ();
    operator CONST FLOAT* () const;

    // assignment operators
    D3DXPLANE& operator *= ( FLOAT );
    D3DXPLANE& operator /= ( FLOAT );

    // unary operators
    D3DXPLANE operator + () const;
    D3DXPLANE operator - () const;

    // binary operators
    D3DXPLANE operator * ( FLOAT ) const;
    D3DXPLANE operator / ( FLOAT ) const;

    friend D3DXPLANE operator * ( FLOAT, CONST D3DXPLANE& );

    BOOL operator == ( CONST D3DXPLANE& ) const;
    BOOL operator != ( CONST D3DXPLANE& ) const;

#endif //__cplusplus
    FLOAT a, b, c, d;
} D3DXPLANE, *LPD3DXPLANE;

创建平面:
1)1个点和一个法向量确定一个平面
D3DXPLANE * D3DXPlaneFromPointNormal(
  __inout  D3DXPLANE *pOut,
  __in     const D3DXVECTOR3 *pPoint,
  __in     const D3DXVECTOR3 *pNormal
);
2)3个点确定一个平面
D3DXPLANE * D3DXPlaneFromPoints(
  __inout  D3DXPLANE *pOut,
  __in     const D3DXVECTOR3 *pV1,
  __in     const D3DXVECTOR3 *pV2,
  __in     const D3DXVECTOR3 *pV3
);

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值