Direct3D绘制旋转立方体例程

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

D3DPractice.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方法有两项任务,更新场景和绘制场景,我们想让立方体旋转起来,必须在程序生成的每帧图像中给旋转角一定的增量,
从而指定立方体的旋转方式,通过更新每帧图像中立方体的角度,立方体在每帧图像中就被微微地旋转,从而产生转动的视觉效果
本例中我们是用世界变换来指定立方体的方向
#endifbool 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 sideindices[0] = 0;indices[1] = 1;indices[2] = 2;indices[3] = 0;indices[4] = 2;indices[5] = 3;//back sideindices[6] = 4;indices[7] = 6;indices[8] = 5;indices[9] = 4;indices[10] = 7;indices[11] = 6;//left sideindices[12] = 4;indices[13] = 5;indices[14] = 1;indices[15] = 4;indices[16] = 1;indices[17] = 0;//right sideindices[18] = 3;indices[19] = 2;indices[20] = 6;indices[21] = 3;indices[22] = 6;indices[23] = 7;//topindices[24] = 1;indices[25] = 5;indices[26] = 6;indices[27] = 1;indices[28] = 6;indices[29] = 2;//bottomindices[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;
}

运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/127061.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gpt测试

已知a地一石头售价80&#xff0c;b地售价112&#xff0c;小明初始资金8000&#xff0c;在a地全仓购入后&#xff0c;去b地出售&#xff0c;然后小明又回到a地&#xff0c;再次全仓购入然后去b地出售&#xff0c;这样继续出售10次后&#xff0c;小明有多少钱&#xff1f;石头是不…

Nomad系列-Nomad网络模式

系列文章 Nomad 系列文章 概述 Nomad 的网络和 Docker 的也有很大不同, 和 K8s 的有很大不同. 另外, Nomad 不同版本(Nomad 1.3 版本前后)或是否集成 Consul 及 CNI 等不同组件也会导致网络模式各不相同. 本文详细梳理一下 Nomad 的主要几种网络模式 在Nomad 1.3发布之前&a…

【无公网IP内网穿透】异地远程访问本地SQL Server数据库

目录 1.前言 2.本地安装和设置SQL Server 2.1 SQL Server下载 2.2 SQL Server本地连接测试 2.3 Cpolar内网穿透的下载和安装 2.3 Cpolar内网穿透的注册 3.本地网页发布 3.1 Cpolar云端设置 3.2 Cpolar本地设置 4.公网访问测试 5.结语 1.前言 数据库的重要性相信大家…

l8-d10 TCP协议是如何实现可靠传输的

一、TCP主要特点 TCP 是面向连接的运输层协议&#xff0c;在无连接的、不可靠的 IP 网络服务基础之上提供可靠交付的服务。为此&#xff0c;在 IP 的数据报服务基础之上&#xff0c;增加了保证可靠性的一系列措施。 TCP主要特点 1.TCP 是面向连接的运输层协议。 每一条 TCP 连…

franka_ros中的一些子包的使用

franka_visualization包 该软件包包含连接到机器人并发布机器人和夹爪关节状态以在 RViz 中进行可视化的发布者。要运行此包启动&#xff1a; roslaunch franka_visualization franka_visualization.launch robot_ip:<fci-ip> \load_gripper:<true|false> 比如&a…

Unity的UI管理器

1、代码 public class UIManager {private static UIManager instance new UIManager();public static UIManager Instance > instance;//存储显示着的面板脚本&#xff08;不是面板Gameobject&#xff09;&#xff0c;每显示一个面板就存入字典//隐藏的时候获取字典中对…

【C语言】每日一题(杨氏矩阵查找数)

目录 杨氏矩阵介绍&#xff1a;方法&#xff1a;思路&#xff1a;代码实现&#xff1a; 杨氏矩阵介绍&#xff1a; 既然在杨氏矩阵中查找数&#xff0c;那什么是杨氏矩阵呢&#xff1f; 矩阵的每行从左到右是递增的&#xff0c;矩阵从上到下是递增的。 例如&#xff1a; 方法…

Opencv 图像金字塔----高斯和拉普拉斯

原文&#xff1a;图像金字塔----高斯和拉普拉斯 图像金字塔是图像中多尺度表达的一种&#xff0c;最初用于机器视觉和图像压缩&#xff0c;最主要用于图像的分割、融合。 高斯金字塔 ( Gaussian pyramid): 高斯金字塔是由底部的最大分辨率图像逐次向下采样得到的一系列图像…

Spring系列文章:Spring中的设计模式

一、简单⼯⼚模式 BeanFactory的getBean()⽅法&#xff0c;通过唯⼀标识来获取Bean对象。是典型的简单⼯⼚模式&#xff08;静态⼯⼚模 式&#xff09;&#xff1b; 二、⼯⼚⽅法模式 FactoryBean是典型的⼯⼚⽅法模式。在配置⽂件中通过factory-method属性来指定⼯⼚⽅法&a…

MySQL——读写分离

简介 读写分离&#xff0c;基本的原理是让主数据库处理事务性增、改、删操作&#xff08;INSERT、UPDATE、DELETE&#xff09;&#xff0c;而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。一般来说都是通过 主从复制&#xff…

高频知识汇总 |【计算机网络】面试题汇总(万字长文通俗易懂)

我之前也已经在写了好几篇高频知识点汇总&#xff0c;简要介绍一下&#xff0c;有需要的同学可以点进去先收藏&#xff0c;之后用到时可以看一看。如果有帮助的话&#xff0c;希望大家给个赞&#xff0c;给个收藏&#xff01;有疑问的也可以在评论区留言讨论&#xff0c;能帮的…

阻塞队列学习总结

ArrayBlockingQueue&#xff1a;一个由数组结构组成的有界阻塞队列。 LinkedBlockingQueue&#xff1a;一个由链表结构组成的有界阻塞队列。 PriorityBlockingQueue&#xff1a;一个支持优先级排序的无界阻塞队列。 DelayQueue&#xff1a;一个使用优先级队列实现的延迟无界…

【Java基础篇 | 类和对象】--- 聊聊什么是内部类

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习Java的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 前言 当一个事物的内部&…

iOS 17新功能:教你轻松掌握锁定屏幕快捷方式

通过iOS 17&#xff0c;苹果为iPhone用户提供了使用快捷方式锁定手机屏幕的能力。 为什么你需要学习如何使用iOS锁定屏幕快捷方式&#xff1f;按下iPhone上的电源按钮激活这个屏幕肯定是最简单的吗&#xff1f;嗯&#xff0c;这并不总是正确的。如果你在按下物理按钮时遇到困难…

你真的了解 Docker 日志吗?

目录 前言排查总结 前言 今天服务器发送了磁盘告警通知&#xff0c;于是打开了尘封已久的电脑连上了公司服务器&#xff0c;服务器跑的是一个 Docker Swarm 集群&#xff08;正是集群中的某一台服务器发生告警&#xff09;&#xff0c;告警的服务器上运行了多个游戏后台程序。…

时序预测 | MATLAB实现TCN-GRU时间卷积门控循环单元时间序列预测

时序预测 | MATLAB实现TCN-GRU时间卷积门控循环单元时间序列预测 目录 时序预测 | MATLAB实现TCN-GRU时间卷积门控循环单元时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现TCN-GRU时间卷积门控循环单元时间序列预测&#xff1b; 2.运行环…

A Yet Another Remainder The 2022 ICPC Asia Regionals Online Contest (II)

PTA | 程序设计类实验辅助教学平台 题目大意&#xff1a;有一个n位长的隐藏数x&#xff0c;从高位到低位依次标号为1到n&#xff0c;sum[i][j]表示从第i为开始每j位上的数的和&#xff0c;有q次询问&#xff0c;每次给出一个100以内除了5以外的质数p&#xff0c;问这个数%p等于…

网络原理,了解xml, json,protobuffer的特点

目录 外卖服务器场景带入 大佬们通用的规范格式 一、&#x1f466; 外卖服务器场景 外面服务器沟通有很多模式——展示商家列表等等&#xff0c;只是其中一个&#xff0c;因此需要一个统一的规划了——不同应用程序&#xff0c;里面的自定义格式是不一样的&#xff0c;这样的…

前端组件库造轮子——Message组件开发教程

前端组件库造轮子——Message组件开发教程 前言 本系列旨在记录前端组件库开发经验&#xff0c;我们的组件库项目目前已在Github开源&#xff0c;下面是项目的部分组件。文章会详细介绍一些造组件库轮子的技巧并且最后会给出完整的演示demo。 文章旨在总结经验&#xff0c;开…

算法刷题记录-其他类型(LeetCode)

57 57. Insert Interval 思路 模拟 用指针去扫 intervals&#xff0c;最多可能有三个阶段&#xff1a; 不重叠的绿区间&#xff0c;在蓝区间的左边有重叠的绿区间不重叠的绿区间&#xff0c;在蓝区间的右边 逐个分析 不重叠&#xff0c;需满足&#xff1a;绿区间的右端&…