当前位置: 首页 > news >正文

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;
}

运行结果

相关文章:

Direct3D绘制旋转立方体例程

初始化文件见Direct3D的初始化_direct3dcreate9_寂寂寂寂寂蝶丶的博客-CSDN博客 D3DPractice.cpp #include <windows.h> #include "d3dUtility.h" #include <d3dx9math.h>IDirect3DDevice9* Device NULL; IDirect3DVertexBuffer9* VB NULL; IDirect3…...

ElementUI浅尝辄止31:Tabs 标签页

选项卡组件&#xff1a;分隔内容上有关联但属于不同类别的数据集合。 常见于网站内容信息分类或app内容信息tab分类 1.如何使用&#xff1f; Tabs 组件提供了选项卡功能&#xff0c;默认选中第一个标签页&#xff0c;你也可以通过 value 属性来指定当前选中的标签页。 <temp…...

将 ChatGPT 用于数据科学项目的指南

推荐&#xff1a;使用 NSDT场景编辑器 快速搭建3D应用场景 我们都知道 ChatGPT 的受欢迎程度以及人们如何使用它来提高生产力。但是&#xff0c;如果您是新手&#xff0c;则值得注册ChatGPT免费演示并尝试它所能做的一切。您还应该参加我们的 ChatGPT 简介课程&#xff0c;学习…...

06-JVM对象内存回收机制深度剖析

上一篇&#xff1a;05-JVM内存分配机制深度剖析 堆中几乎放着所有的对象实例&#xff0c;对堆垃圾回收前的第一步就是要判断哪些对象已经死亡&#xff08;即不能再被任何途径使用的对象&#xff09;。 1.引用计数法 给对象中添加一个引用计数器&#xff0c;每当有一个地方引…...

[VSCode] 替换掉/去掉空行

VSCode中使用快捷键CtrlH&#xff0c;出现替换功能&#xff0c;在上面的“查找”框中输入正则表达式&#xff1a; ^\s*(?\r?$)\n然后选择右侧的“使用正则表达式”&#xff1b;“替换”框内为空&#xff0c;点击右侧的“全部替换”&#xff0c;即可去除所有空行。 参考 [VS…...

时序分解 | MATLAB实现ICEEMDAN+SE改进的自适应经验模态分解+样本熵重构分量

时序分解 | MATLAB实现ICEEMDANSE改进的自适应经验模态分解样本熵重构分量 目录 时序分解 | MATLAB实现ICEEMDANSE改进的自适应经验模态分解样本熵重构分量效果一览基本介绍程序设计参考资料 效果一览 基本介绍 ICEEMDANSE改进的自适应经验模态分解样本熵重构分量 包括频谱图 避…...

python内网环境安装第三方包【内网搭建开发环境】

文章目录 一、问题二、解决方法三、代码实现一、问题 内网安装第三方包的应用场景,一般是一些需要在没网的环境下进行开发的情况。这些环境一般仅支持本地局域网访问,所以只能在不下载任何第三方包的情况下艰难开发。 二、解决方法 将当前应用依赖的第三方包提前下载到本地…...

7.13 在SpringBoot中 正确使用Validation实现参数效验

文章目录 前言引入Maven依赖一、POST/PUT RequestBody参数校验1.1 Valid或Validated注解配合constraints注解1.2 测试运行 二、GET/DELETE RequestParam参数校验2.1 Validated注解配合constraints注解2.2 测试运行 三、GET 无注解参数校验3.1 Valid或Validated注解配合constrai…...

Matlab图像处理之Lee滤波器

目录 一、前言:二、LEE滤波器2.1 LEE滤波器原理2.2 LEE滤波器实现步骤三、MATLAB代码示例一、前言: LEE滤波器是一种常用于合成孔径雷达(SAR)图像去噪的滤波器。它能增强图像的局部对比度。今天我们将通过MATLAB来实现这种滤波器。 二、LEE滤波器 2.1 LEE滤波器原理 LEE滤…...

C++系列-const修饰的常函数

const修饰的常函数 常函数常对象 常函数 成员函数后加const&#xff0c;称为常函数。常函数内部不可以修改成员变量。常函数内可以改变加了mutable修饰的成员变量。 code:#include <iostream>using namespace std;class Horse{public:int age 3;mutable string color …...

fail-safe 机制与 fail-fast 机制

Fail-fast 表示快速失败&#xff0c;在集合遍历过程中&#xff0c;一旦发现容器中的数据被修改了&#xff0c;会立刻抛出 ConcurrentModificationException 异常&#xff0c;从而导致遍历失败&#xff0c;像这种情况 定义一个 Map 集合&#xff0c;使用 Iterator 迭代器进行数据…...

LLM 位置编码及外推

RoPE https://zhuanlan.zhihu.com/p/629681325 PI 位置插值&#xff08;POSITION INTERPOLATION&#xff09;显著改善RoPE的外推能力。你只需要对PT&#xff08;pretraining)模型fine-turing最多1000步就能实现。PI是通过将线性的缩小了输入位置的索引使其匹配原始上下文窗口…...

第3章_瑞萨MCU零基础入门系列教程之开发环境搭建与体验

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…...

AI在医疗保健领域:突破界限,救治生命

文章目录 AI在医学影像分析中的应用AI在疾病预测和早期诊断中的作用个性化治疗和药物研发医疗数据管理和隐私保护未来展望 &#x1f389;欢迎来到AIGC人工智能专栏~AI在医疗保健领域&#xff1a;突破界限&#xff0c;救治生命 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博…...

centos7安装kubernets集群

一、准备工作 准备三台虚拟机&#xff0c;centos7系统 二、系统配置 1. 修改主机名 # 三台机器都需要执行 hostnamectl set-hostname k8s-master hostnamectl set-hostname k8s-node1 hostnamectl set-hostname k8s-node22. 修改hosts文件 # 三台机器都需要执行 [rootk8s-…...

【多线程】线程安全与线程同步

线程安全与线程同步 1.什么是线程安全问题&#xff1f; 多个线程同时操作同一个共享资源的时候&#xff0c;可能会出现业务安全问题 取钱的线程安全问题场景&#xff1a; 两个人他们有一个共同的账户&#xff0c;余额是10万元&#xff0c;如果两个人同时来取钱&#xff0c;…...

指针权限,new与delete,类与对象,函数模板,类模板的用法

指针权限 用法 void Print(const char* SecretPointer) {cout << "绝密指令为&#xff1a;";cout << SecretPointer << endl; }void Change(int& number, int* const FixedPointer) {cout << "更换站台数字为&#xff1a;";c…...

Unity——脚本与序列化

在介绍序列化之前&#xff0c;我们先来了解一下为什么要对数据进行序列化 数据序列化有以下几个主要的应用场景和目的&#xff1a; 1. 持久化存储&#xff1a;序列化可以将对象或数据结构转换为字节序列&#xff0c;使得其可以被存储在磁盘上或数据库中。通过序列化&#xff…...

NJ求职盘点

电子显示 集成电路 地平线 后摩智能 芯启源 自动驾驶 地平线 栖霞区兴智科技园 泊车、SLAM/3D算法工程师 https://wecruit.hotjob.cn/SU64819a4f2f9d2433ba8b043a/pb/social.html?currentPage1 后摩智能 栖霞区兴智科技园 视觉感知算法资深工程师 可以做自动驾驶前瞻性…...

01卡特兰数

卡特兰数跟排列组合很有关系&#xff0c;所以在看此文章前请掌握&#xff1a; 加法原理乘法原理A(m,n)计算公式及其原理C(m,n)计算公式及其原理 前言 今天您将会学习到基本的卡特兰数及其应用。 一、卡特兰数是什么&#xff1f; 卡特兰数&#xff08;Catalan number&#xff0…...

HAT vs SwinIR:混合注意力机制如何提升图像重建效果?

HAT vs SwinIR&#xff1a;混合注意力机制如何重塑图像重建技术格局 当一张低分辨率的老照片需要修复&#xff0c;或是医学影像需要增强细节时&#xff0c;传统算法往往力不从心。2023年CVPR会议上亮相的HAT&#xff08;Hybrid Attention Transformer&#xff09;架构&#xff…...

效率飙升:精准需求直达代码,快马平台重构opencode使用体验

作为一个经常需要在前端项目中实现用户登录注册模块的开发者&#xff0c;我深知这个过程有多“磨人”。每次新建项目&#xff0c;或者接手一个老项目需要重构这块功能时&#xff0c;都得经历一番折腾&#xff1a;去开源社区&#xff08;也就是我们常说的opencode&#xff09;找…...

事件驱动在AI原生应用领域的应用实践分享

事件驱动在AI原生应用领域的应用实践分享 关键词 事件驱动架构&#xff08;EDA&#xff09;、AI原生应用、事件流处理、持续学习系统、动态决策引擎、因果事件建模、云原生事件平台 摘要 本报告系统解析事件驱动架构&#xff08;EDA&#xff09;在AI原生应用中的创新实践&#…...

如何使用 Laravel Purity:简化 Laravel 数据筛选与排序的终极指南

如何使用 Laravel Purity&#xff1a;简化 Laravel 数据筛选与排序的终极指南 【免费下载链接】laravel-purity An elegant way to filter and sort queries in Laravel 项目地址: https://gitcode.com/gh_mirrors/la/laravel-purity Laravel Purity 是一款为 Laravel 框…...

二分算法|世人皆知原理易,我言边界费思量

二分算法是我觉得在基础算法篇章中最难的算法。二分算法的原理以及模板其实是很简单的&#xff0c;主要的难点在于问题中的各种各样的细节问题。因此&#xff0c;大多数情况下&#xff0c;只是背会二分模板并不能解决题目&#xff0c;还要去处理各种乱七八糟的边界问题。 一、…...

实战应用转化:将翁恺c语言练习题升级为完整学生成绩管理系统项目

最近在重温翁恺老师的C语言课程&#xff0c;里面的练习题真是经典&#xff0c;尤其是那个“学生成绩管理系统”的基础题目。它涵盖了结构体、数组、指针、文件操作等核心知识点&#xff0c;是检验C语言学习成果的绝佳试金石。不过&#xff0c;练习题往往侧重于功能实现&#xf…...

Phi-3-vision-128k-instruct案例分享:多模态安全机制拦截违规图像请求

Phi-3-vision-128k-instruct案例分享&#xff1a;多模态安全机制拦截违规图像请求 1. 模型简介 Phi-3-Vision-128K-Instruct 是一个轻量级的开放多模态模型&#xff0c;属于 Phi-3 模型家族的最新成员。这个模型特别之处在于它支持128K的超长上下文处理能力&#xff0c;能够同…...

深入研究大数据领域的数据清洗算法与模型

深入研究大数据领域的数据清洗算法与模型 关键词:数据清洗、大数据处理、数据质量、ETL、数据预处理、异常检测、数据标准化 摘要:本文深入探讨大数据领域中的数据清洗技术,从基本概念到核心算法,再到实际应用场景。我们将一步步解析数据清洗的完整流程,介绍常用的清洗算法…...

ionic 模态窗口详解

ionic 模态窗口详解 引言 在移动应用开发中,模态窗口是一种常见的用户界面元素,它允许用户在不离开当前页面内容的情况下,查看或编辑信息。Ionic框架作为一款流行的移动端前端框架,提供了丰富的组件和API来帮助开发者构建高性能的跨平台应用。本文将深入探讨Ionic框架中的…...

【从零学javase 第六天】网络编程(+多线程)

Java 网络编程实战教程&#xff1a;从零基础到群聊本文适合刚会 Java 的同学&#xff0c;带你从零基础学 Java 网络编程&#xff0c;最终实现多客户端群聊。一、网络编程基础概念 网络编程就是用程序让两台电脑互相传递信息。 IP 地址&#xff1a;电脑的网络位置&#xff0c;例…...