一.向量(vector)
向量(vector)是一种同时具有方向和大小的物理量,而在DirectX10中,我们主要把精力放在D3DX向量上,D3DXVECTOR3类主要用于在代码中存储相对于某个坐标系的点和向量的坐标,这其中有很多非常有用的向量处理函数:
FLOAT D3DXVec3Length( //return || v || CONST D3DXVECTOR3 *pV); FLOAT D3DXVec3Length3q( //return || v || * || v || CONST D3DXVECTOR3 *pV); FLOAT D3DXVec3Dot( //return v1 . v2 CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2, ); D3DXVECTOR3 D3DXVec3Cross( //return v1 x v2 CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2, } D3DXVECTOR3 *WINAPI D3DXVec3Normalize( D3DXVECTOR3 *pOut, //return v / ||v|| CONST D3DXVECTOR3 *pV );
当需要使用D3DX的程序都必须链接到d3dx10.lib库文件(当使用调试模式进行编译时,应链接到d3d10d.lib
我们可以来试一试这几个函数:
#include <iostream> //#include <D3DX10.h> #include <D3DX10math.h> using namespace std; ostream& operator<<(ostream& os,D3DXVECTOR3& v) { os<<"{"<<v.x<<","<<v.y<<","<<v.z<<"}"; return os; } int main() { D3DXVECTOR3 u(1.0f,2.0f,3.0f); float x[3] = {-2.0f,1.0,-3.0f}; D3DXVECTOR3 v(x); D3DXVECTOR3 a,b,c,d,e; a = u+v; b = u-v; c = u*10; float length = D3DXVec3Length(&u); D3DXVec3Normalize(&d,&u); float s = D3DXVec3Dot(&u,&v); D3DXVec3Cross(&e,&u,&v); ////////////////////////////////////////// cout<<" u = "<<u<<endl; cout<<" v = "<<v<<endl; cout<<"a = u + v ="<<a<<endl; cout<<"b = u - v ="<<b<<endl; cout<<"c = u * 10 ="<<c<<endl; cout<<"d = u / ||u|| = "<<d<<endl; cout<<"e = u x v ="<<e<<endl; cout<<"length = ||u|| = "<<length<<endl; cout<<"s = u.v = "<<s<<endl; system("pause"); return 0; }结果如下:
有几个地方我们需要注意:
1,我们需要使用到的D3DXVECTOR3以及各操作函数是在头文件D3DX10math.h中定义的,因此需要包含该头文件
2.在配置链接库的时候最好是添加上库的debug库,一般是结尾多加个d,比如d3dx10.lib和d3dx10d.lib
3.不建议使用using namespace std;这种形式,当需要使用不同域的变量或函数时容易造成干扰,产生错误,建议直接使用(域::变量),本文程序简单,为简化起见,故才这样做。
4.重载操作符的时候一定要注意参数形式、
5.当出现error LNK2019: 无法解析的外部符号_D3DXVec3Normalize@8,该符号在函数_main中被引用这种错误的时候,注意看看你的链接库,是不是链接到X64的lib去了,改回X86的库就好了,不要因为你是64位机器就链接到X64的库,因为你创建的是Win32项目,所以只能链接到X86的库。关于这一点,后面有时间在深入探究。