(1)
#pragmacomment(lib,"d3dx9.lib") //不用再在工程里加入这个
单个头文件#programaonce比#ifndef……#define……#endif方便点,不过有些编译器不支持,还有就是如果你#ifndef AAA ……, 而你这个AAA在另一个头文件已经有过宏定义,那么你这个头文件下面的内容就包含不进去了。
编程时,考虑哪些东西可以成为一个类,方便调用。哪些东西要经常修改,就改为头文件。
(2)
//旋转物体用
#define ROTATEPERFRAME D3DX_PI/720.0f
static float RotateAngelX=0.0f;
static float RotateAngelY=0.0f;
//旋转矩阵
D3DXMATRIXrotation_x,rotation_y;
//绕x轴旋转45度
D3DXMatrixRotationX(&rotation_x,RotateAngelX);
// 每一帧中增加y轴的弧度
D3DXMatrixRotationY(&rotation_y,RotateAngelY);
if(::GetAsyncKeyState('W')& 0x8000f)
{ RotateAngelX+=ROTATEPERFRAME; }
if(::GetAsyncKeyState('S')& 0x8000f)
{ RotateAngelX-=ROTATEPERFRAME; }
if(::GetAsyncKeyState('D')& 0x8000f)
{ RotateAngelY+=ROTATEPERFRAME; }
if(::GetAsyncKeyState('A')& 0x8000f)
{ RotateAngelY-=ROTATEPERFRAME; }
//将两个旋转矩阵合并
D3DXMATRIXrotation=rotation_x*rotation_y;
//在世界坐标系中进行旋转,此例中物体坐标直接对应的为世界坐标系,并没有物体坐标系的存在
g_pDev3D9->SetTransform(D3DTS_WORLD,&rotation);
/*GetAsyncKeyState用于得到当前键盘、鼠标等按键的状态,因此,如果一个key它是一直处于down的状态,那么调用这个函数都可以获得它的状态。这在游戏控制中是非常有用的。*/
(3)
旋转照相机用
//
//Update the scene: update camera position.
//
staticfloat angle = (3.0f * D3DX_PI) / 2.0f;
staticfloat height = 2.0f;
if(::GetAsyncKeyState(VK_LEFT) & 0x8000f )
angle-= 0.5f * timeDelta; //旋转不了时timeDelta取0.01f
if(::GetAsyncKeyState(VK_RIGHT) & 0x8000f )
angle+= 0.5f * timeDelta;
if(::GetAsyncKeyState(VK_UP) & 0x8000f )
height+= 5.0f * timeDelta;
if(::GetAsyncKeyState(VK_DOWN) & 0x8000f )
height-= 5.0f * timeDelta;
D3DXVECTOR3position( cosf(angle) * 3.0f, height, sinf(angle) * 3.0f );
D3DXVECTOR3target(0.0f, 0.0f, 0.0f);
D3DXVECTOR3up(0.0f, 1.0f, 0.0f);
D3DXMATRIXV;
D3DXMatrixLookAtLH(&V,&position, &target, &up);
Device->SetTransform(D3DTS_VIEW,&V);
(4)
到目前为止,常用到的3D数据类型:
IDirect3D9 //用来设备枚举和创建接口IDirectDevice9
IDirectDevice9 //设备接口,一般设为全局变量
LPDIRECT3DDEVICE9 //设备接口的指针形式
D3DXMATERIAL9 //材质
D3DXMATERIAL //包含材质和纹理名,用于载入.X文件
IDirect3DTexture9 //纹理
ID3DXMesh //网格
ID3DXPMesh //渐进网格,运用ECT简化网格
D3DXMATRIX //矩阵
D3DXVECTOR3 //向量
(5)
实验十三:
关于.X动画,从3DSMAX2010导出小蛮、玄霄的动画各种问题,解决不了,看来.X这不是很好的选择。但是“飞天狐”本来的动画导出来没有问题。看来是我绘制骨骼的方法问题。
( 6 )
把功能编成一个类的面向对象思想很好用。今天发现,定义一个Vertex.h头文件时不用包含其他头文件,才知道原来#include<stdio.h>之前是用在输入输出函数上的,类型定义int,float等VC++建立一个头文件本身就有。
( 7 )
深度测试:当你在UT那里启用了深度缓存后,默认是开启的,然后根据深度值Z更小,判断哪个物体显示在前面。当然你也可以修改它的深度测试函数,判断深度值大小绘制。
( 8 )
今天用了两节课解决一个问题:
const DWORD Vertex::FVF=D3DFVF_XYZ |D3DFVF_NORMAL | D3DFVF_TEX1;
//静态不能在Vertex.h头文件里定义
D3DXVECTOR3 xiaoPosition(0.0f, 3.0f,-5.0f);
不能在baseScene.h里baseScene类的外面定义,因为想给baseScene.cpp和MyD3dApp.cpp用的,后来
想到了把它变为成员变量D3DXVECTOR3xiaoPosition;却发现不能在baseScene.cpp调用构造函数,后来才知道,要用xiaoPosition = newD3DXVECTOR3(0.0f, 3.0f, -5.0f);就必须定义为D3DXVECTOR3*
xiaoPosition的指针形式。尼玛,C++忘记了一大半!!!
( 9 )
Crystle::Release<IDirect3DTexture9*>(MirrorTex);
Crystle::Delete<D3DXVECTOR3*>(xiaoPosition); //为什么不能用上面的?
Release 是对象的引用数减一,减到零对象就over了。
delete 是直接干掉对象。
进程间的组件才要release 。进程内的可以直接delete。印象中书上是这么说的.
涛哥的这个代码应该是用来自动识别一般"指针和COM指针"用的。什么是COM指针呢?-0 -
( 9 )
::ZeroMemory(&msg, sizeof(MSG)); //内存块清0
对于有些结构,比如MSG ,如果你不清空,那么它的值也是未知的,所以可能有意想不到的结果,
为了安全,所以ZeroMemory
(10)
Camera TheCamera(Camera::LANDOBJECT); //枚举常量
像上面那样,如何调用类里面的枚举类型呢?
(11)
一直搞不懂摄像机LANDOBJECT模式和AIRCRAFT模式下的yaw的区别,后来明白当up != Y(0,1,0)时,旋转就不同了。还有明白当取景变换后,摄像机Y轴与世界坐标Y轴重合。