Direct3D学习笔记二

(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轴重合。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值