DirectX11 学习笔记2 - 加入关键事件 实现视角转换 旋转

上的程序的的基础上。在基类D3DBase添加摄像头功能

//录影机
void D3DBase::setCamera()
{
	//关键事件
	//假定A,S,D,W,Q,E,Z,X,C键被按下。动摄像机
	if(GetAsyncKeyState('W') & 0x8000)	//前
		vZ+=0.001f;
	if(GetAsyncKeyState('S') & 0x8000)	//后
		vZ-=0.001f;
	if(GetAsyncKeyState('A') & 0x8000)  //左
		vX-=0.001f;
	if(GetAsyncKeyState('D') & 0x8000)   //右
		vX+=0.001f;
	if(GetAsyncKeyState('Q') & 0x8000)    //上
		vY+=0.001f;
	if(GetAsyncKeyState('E') & 0x8000)    //下
		vY-=0.001f;
	//旋转
	if(GetAsyncKeyState('Z') & 0x8000)    //x轴
		rX+=0.001f;
	if(GetAsyncKeyState('X') & 0x8000)    //y轴
		rY+=0.001f;
	if(GetAsyncKeyState('C') & 0x8000)    //z轴
		rZ+=0.001f;
	// 世界矩阵
	g_World = XMMatrixIdentity();

	// 观察矩阵
	XMVECTOR Eye = XMVectorSet( 0.0f+vX, 1.0f+vY, -5.0f+vZ, 0.0f );
	XMVECTOR At = XMVectorSet( 0.0f+vX, 1.0f+vY, 0.0f, 0.0f );
	XMVECTOR Up = XMVectorSet( 0.0f, 1.0f, 0.0f, 0.0f );
	g_View = XMMatrixLookAtLH( Eye, At, Up );
	g_View*=XMMatrixRotationX(rX)*XMMatrixRotationY(rY)*XMMatrixRotationZ(rZ);
	// 投影矩阵
	g_Projection = XMMatrixPerspectiveFovLH( XM_PIDIV2, width / (FLOAT)height, 0.01f, 100.0f );

}

下面写在类声明里面public:

D3DBase():vX(0),vY(0),vZ(0),rX(0),rY(0),rZ(0){};//初始化
float vX,vY,vZ;// 观察矩阵 Eye的坐标
	float rX,rY,rZ;// 旋转的角度

然后直接在渲染函数调用就可以

//渲染
void D3DProgam::Render()
{

	setCamera();//这里
	// Update our time
	static float t = 0.0f;
	if( g_driverType == D3D_DRIVER_TYPE_REFERENCE )
	{
		t += ( float )XM_PI * 0.0125f;
	}

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-08-08 09:33:28

DirectX11 学习笔记2 - 加入关键事件 实现视角转换 旋转的相关文章

DirectX11 学习笔记2 - 添加按键事件 实现视角平移 旋转

在上一个程序的基础上.在基类D3DBase添加一个摄像机函数 //摄像机 void D3DBase::setCamera() { //按键事件 //如果A,S,D,W,Q,E,Z,X,C键按下,移动摄像机 if(GetAsyncKeyState('W') & 0x8000) //前 vZ+=0.001f; if(GetAsyncKeyState('S') & 0x8000) //后 vZ-=0.001f; if(GetAsyncKeyState('A') & 0x8000) //左

Directx11学习笔记【二十二】 用高度图实现地形

本文由zhangbaochong原创,转载请注明出处http://www.cnblogs.com/zhangbaochong/p/5827714.html 在前面我们曾经实现过简单的地形(Directx11学习笔记[十三] 实现一个简单地形),只不过原来使用一个固定的函数获得地形高度,这样跟真实的地形差距比较大.接下来让我们学习使用高度图来进行三维地形模拟. 1.高度图 高度图其实就是一组连续的数组,这个数组中的元素与地形网格中的顶点一一对应,且每一个元素都指定了地形网格的某个顶点的高度值.高度

Directx11学习笔记【二】 将HelloWin封装成类

我们把上一个教程的代码封装到一个类中来方便以后的使用. 首先新建一个空工程叫做MyHelloWin,添加一个main.cpp文件,然后新建一个类叫做MyWindow,将于窗体有关的操作封装到里面 MyWindow.h文件 1 /************************************************************************ 2 Directx11学习笔记[2] 将HelloWin封装成类 3 2016.01 by zhangbaochong 4 /

[读书笔记]C#学习笔记二: 委托和事件的用法及不同.

前言:  C#委托是什么 c#中的委托可以理解为函数的一个包装, 它使得C#中的函数可以作为参数来被传递, 这在作用上相当于C++中的函数指针. C++用函数指针获取函数的入口地址, 然后通过这个指针来实现对函数的操作. 委托的定义和方法的定义类似, 只是在定义的前面多了一个delegate关键字. 正文: 委托可以被视为一个更高级的指针,它不仅仅能把地址传指向另一个函数,而且还能传递参数,返回值等多个信息. 系统还为委托对象自动生成了同步,异步的调用方式,开发人员使用BeginInvoke,E

DirectX11 学习笔记3 - 创建一个立方体 和 坐标轴

这个程序再进一步的将上一个程序 面向对象化. 把模型类独立出来.更加像一个框架. 在此中遇到了一个很逗比的问题,弄了一晚上,看了好几遍其他列子才找到.就是有些函数一定要放在Render里面实时更新,而不是只放到初始化InitModel里面 因为当要渲染多个物体的时候,缓冲区的内容是要随设备变化的. 话不多说直接上代码 主程序main #include "D3DBase.h" #include "Axis.h" #include "Cube.h"

DirectX11 学习笔记3 - 创建一个立方体 和 轴

该方案将在进一步的程序 面向对象. 独立的模型类.更像是一个框架. 其中以超过遇到了一个非常有趣的问题,.获得一晚.我读了好几遍,以找到其他的列子.必须放在某些功能Render里面实时更新,而不是仅仅进入初始化InitModel里边 染多个物体的时候,缓冲区的内容是要随设备变化的. 话不多说直接上代码 主程序main #include "D3DBase.h" #include "Axis.h" #include "Cube.h" class D3

Directx11学习笔记【十五】 基本几何体的绘制

本文由zhangbaochong原创,转载请注明出处http://www.cnblogs.com/zhangbaochong/ 前面实现简单地形的教程,我们只是绘制了一个网格,这一次我们来学习一下几种基本几何体的绘制,包括平面网格.立方体.圆柱和球体等. 原来在GeometryGenerator类中只给出了CreateGrid一个方法来绘制网格,现在让我们添加其他方法绘制一些几何体. 为了方便绘制几何体方法的调用,GeometryGenerator类我们使用了单例模式.很简单,将构造函数设为pr

Directx11学习笔记【十四】 使用最新的Effect框架和SDK

由于之前一直在看directx11龙书学习,因此sdk一直用的Microsoft DirectX SDK (June 2010) 版本,最近在stackoverflow上问dx11相关问题时,一直被大神吐槽为何还用已经废弃的directx sdk,由于directx sdk现在已经和windows sdk合并到一起了,只能去下windows sdk了.为了方便索性直接换了vs 2015社区版,里面自带了(windows sdk),既然sdk换了最新的,effect框架也要换最新的啊(Effect

Directx11学习笔记【十】 画一个简单的三角形

本篇笔记要实现的是在屏幕上渲染出一个三角形,重点要学习的是渲染一个几何体的流程方式. 为了渲染几何图形,需要一个顶点缓存和一个描述顶点布局的输入层,还有着色器(主要是顶点着色器和像素着色器),下面来看看具体Demo的实现. 新建一个Win32项目 ,新建一个类我们叫做TriangleDemo,继承自前面教程我们实现的基类Dx11DemoBase. TriangleDemo.h头文件 #pragma once #include "Dx11DemoBase.h" class Triangl