Direct3D绘制旋转立方体例程

初始化文件见Direct3D的初始化_direct3dcreate9_寂寂寂寂寂蝶丶的博客-CSDN博客

D3DPractice.cpp

cpp 复制代码
#include <windows.h>
#include "d3dUtility.h"
#include <d3dx9math.h>

IDirect3DDevice9* Device = NULL;
IDirect3DVertexBuffer9* VB = NULL;
IDirect3DIndexBuffer9* IB = NULL;
const int Width = 1024;
const int Height = 768;

struct Vertex
{
	Vertex(){}
	Vertex(float x, float y, float z)
		:_x(x), _y(y), _z(z)
	{
	}
	float _x, _y, _z;
	static const DWORD FVF;
};
const DWORD Vertex::FVF = D3DFVF_XYZ;

#if 0
Display方法有两项任务,更新场景和绘制场景,我们想让立方体旋转起来,必须在程序生成的每帧图像中给旋转角一定的增量,
从而指定立方体的旋转方式,通过更新每帧图像中立方体的角度,立方体在每帧图像中就被微微地旋转,从而产生转动的视觉效果
本例中我们是用世界变换来指定立方体的方向
#endif

bool DisPlay(float timeDelta)
{
	if (Device)
	{
		D3DXMATRIX Rx, Ry;
		
		//x轴旋转矩阵
		D3DXMatrixRotationX(&Rx, 3.14f / 4.0f);

		static float y = 0.0f;
		//y轴旋转矩阵
		D3DXMatrixRotationY(&Ry, y);
		y += timeDelta;

		//重置
		if (y >= 6.28f)
			y = 0.0f;

		D3DXMATRIX p = Rx * Ry;
		Device->SetTransform(D3DTS_WORLD, &p);

/*
	STDMETHOD(Clear)(THIS_ DWORD Count, CONST D3DRECT* pRects, DWORD Flags, D3DCOLOR Color, float Z, DWORD Stencil) PURE;
	Count: pRects数组中矩形的数目
	pRects:要执行清除操作的屏幕矩形数组,该参数允许我们只对表面的部分区域进行清除操作
	Flags:指定所要清除的表面
	D3DCLEAR_TARGET 绘制目标表面,通常指后台缓存
	D3DCLEAR_ZBUFFER 深度缓存
	D3DCLEAR_STENCIL 模板缓存
	Color:指定将绘制目标体设置为何种颜色
	Z:深度缓存所需要设定的值
	Stencil:模板缓存所需要设定的值
*/
		Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0);

		if (SUCCEEDED(Device->BeginScene()))
		{
			//指定数据流输入源
			Device->SetStreamSource(0, VB, 0, sizeof(Vertex));
			//设置索引缓存
			Device->SetIndices(IB);
			//设置顶点格式
			Device->SetFVF(Vertex::FVF);

			//通过索引缓存来绘制绘制
			Device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 8, 0, 12);
			//Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
			Device->EndScene();
		}
		Device->Present(0, 0, 0, 0);  //提交后台缓存
	}
	return true;
}



bool InitVertexBuffer()
{
	Device->CreateVertexBuffer(8 * sizeof(Vertex), D3DUSAGE_WRITEONLY, Vertex::FVF, D3DPOOL_MANAGED, &VB, 0);
	Device->CreateIndexBuffer(36 * sizeof(WORD), D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &IB, 0);
	
	//顶点缓存
	Vertex* vertices;
	VB->Lock(0, 0, (void**)&vertices, 0);
	vertices[0] = Vertex(-1.0f, -1.0f, -1.0f);
	vertices[1] = Vertex(-1.0f, 1.0f, -1.0f);
	vertices[2] = Vertex(1.0f, 1.0f, -1.0f);
	vertices[3] = Vertex(1.0f, -1.0f, -1.0f);
	vertices[4] = Vertex(-1.0f, -1.0f, 1.0f);
	vertices[5] = Vertex(-1.0f, 1.0f, 1.0f);
	vertices[6] = Vertex(1.0f, 1.0f, 1.0f);
	vertices[7] = Vertex(1.0f, -1.0f, 1.0f);
	VB->Unlock();

	//索引缓存
	WORD* indices = 0;
	IB->Lock(0, 0, (void**)&indices, 0);
	//front side
	indices[0] = 0;indices[1] = 1;indices[2] = 2;
	indices[3] = 0;indices[4] = 2;indices[5] = 3;

	//back side
	indices[6] = 4;indices[7] = 6;indices[8] = 5;
	indices[9] = 4;indices[10] = 7;indices[11] = 6;

	//left side
	indices[12] = 4;indices[13] = 5;indices[14] = 1;
	indices[15] = 4;indices[16] = 1;indices[17] = 0;

	//right side
	indices[18] = 3;indices[19] = 2;indices[20] = 6;
	indices[21] = 3;indices[22] = 6;indices[23] = 7;

	//top
	indices[24] = 1;indices[25] = 5;indices[26] = 6;
	indices[27] = 1;indices[28] = 6;indices[29] = 2;

	//bottom
	indices[30] = 4;indices[31] = 0;indices[32] = 3;
	indices[33] = 4;indices[34] = 3;indices[35] = 7;
	IB->Unlock();

	//取景变换(观察者坐标系)
	D3DXVECTOR3 position(0.0f, 0.0f, -5.0f);
	D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
	D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);
	D3DXMATRIX V;
	D3DXMatrixLookAtLH(&V, &position, &target, &up);
	Device->SetTransform(D3DTS_VIEW, &V);

	//投影变换
	D3DXMATRIX proj;
	D3DXMatrixPerspectiveFovLH(&proj, D3DX_PI*0.5f, (float)Width / (float)Height, 1.0f, 1000.0f);
	Device->SetTransform(D3DTS_PROJECTION, &proj);

	Device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);

	return true;
}

#if 0
创建顶点缓存和索引缓存,对缓存进行锁定,将构成立方体的顶点数据以及构成立方体的三角形单元的索引数据分别写入顶点缓存和索引缓存。然后将摄像
机沿Z轴负方向平移几个单位,以使绘制在世界坐标系原点的立方体处于摄像机的视场内。然后再实施投影变换,最终,将填充模式的绘制状态设为线框模式
#endif
bool SetUp()
{
	return InitVertexBuffer();
}

void CleanUp()
{
	d3d::Release<IDirect3DVertexBuffer9*>(VB);
	d3d::Release<IDirect3DIndexBuffer9*>(IB);
}

int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
{
	
	if (!d3d::InitD3D(hInstance, 800, 600, true, D3DDEVTYPE_HAL, &Device))
	{
		::MessageBox(0, L"InitD3D() - FAILED", 0, 0);
		return 0;
	}

	if (!SetUp())
	{
		::MessageBox(0, L"SetUp() - FAILED", 0, 0);
		return 0;
	}
	d3d::EnterMsgLoop(DisPlay);
	CleanUp();
	Device->Release();

	return 0;
}

运行结果

相关推荐
mahuifa13 小时前
(46)VTK C++开发示例 --- 加载CML文件
c++·3d·vtk·cml
90后小陈老师15 小时前
Unity教学 项目3 3D坦克大战
3d·unity·游戏引擎
元让_vincent15 小时前
论文Review 点云配准综述 | 西北工业大学 | 3D Registration in 30 Years: A Survey | (一) 帧间粗配准
3d·机器人·slam·点云配准
元让_vincent17 小时前
论文Review 3DGS综述 | 浙江大学 | A Survey on 3D Gaussian Splatting |(一)稀疏视角和内存压缩
3d·综述·3dgs
F_D_Z17 小时前
DreamDPO:通过直接偏好优化,实现文本到3D的偏好对齐
3d·dpo
3D打印资源库17 小时前
官宣:汇纳科技收购华速实业;融速科技完成A+轮融资;3D打印单季破40亿美元|库周报
人工智能·科技·3d
AI视觉网奇17 小时前
图生3d 人脸 算法笔记 2025
笔记·3d
二狗哈18 小时前
Cesium快速入门21:Primitive材质类型与设置
3d·webgl·材质·cesium·地图可视化
90后小陈老师19 小时前
Unity教学 项目4 3D求生枪手
3d·unity·游戏引擎
做cv的小昊20 小时前
计算机图形学:【Games101】学习笔记04——着色(光照与基本着色模型,着色频率、图形管线、纹理映射)
笔记·学习·3d·图形渲染·光照贴图·计算机图形学