Directx 3D编程实例:绘制3DMesh
最近朋友建议我写一些关于微软云技术的博客留给学校下一届的学生们看,怕下一届的MSTC断档。于是我也觉的有这个必要。写了几篇博客之后,我觉得也有必要把这一年的学习内容放在博客做个纪念,就这样写了本篇博客。
第一步:判断显卡是否支持
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms; namespace _3DMesh
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Form1 frm = new Form1();
if (frm.InitializeGraphics() == false)
{
MessageBox.Show("显卡不支持3D或者未安装配套的显卡驱动程序!");
return;
}
Application.Run(frm);
}
}
}
第二步:程序源码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D; namespace _3DMesh
{
public partial class Form1 : Form
{
private Device device = null;
private Mesh boxMesh = null;
private Mesh cylinderMesh = null;
private Mesh polygonMesh = null;
private Mesh sphereMesh = null;
private Mesh teapotMesh = null;
private Mesh torusMesh = null;
private Mesh textMesh = null;
private Microsoft.DirectX.Direct3D.Font d3dfont;
private string helpString;
private bool showHelpString = true;
private float angle = 0.0f;
private int rotatorXYZ = 0;
private bool enableRotator = true;
private bool enableCullMode = false;
private bool enableSolidMode = false; public Form1()
{
InitializeComponent();
}
public bool InitializeGraphics()
{
try
{
PresentParameters presentParams = new PresentParameters();
presentParams.Windowed = true;
presentParams.SwapEffect = SwapEffect.Discard;
device = new Device(0, DeviceType.Hardware, this,
CreateFlags.SoftwareVertexProcessing, presentParams);
return true;
}
catch (DirectXException)
{
return false;
}
} private void SetupCamera()
{
float fieldOfView = (float)Math.PI / 4;
float aspectRatio = this.Width / this.Height;
float nearPlane = 1.0f;
float farPlane = 100.0f;
device.Transform.Projection =
Matrix.PerspectiveFovLH(fieldOfView, aspectRatio, nearPlane, farPlane);
Vector3 cameraPosition = new Vector3(0, 0, -18.0f);
Vector3 cameraTarget = new Vector3(0, 0, 0);
Vector3 upDirection = new Vector3(0, 1, 0);
device.Transform.View = Matrix.LookAtLH(cameraPosition, cameraTarget, upDirection);
device.RenderState.Lighting = false;
device.RenderState.CullMode = (enableCullMode ? Cull.CounterClockwise : Cull.None);
device.RenderState.FillMode = (enableSolidMode ? FillMode.Solid : FillMode.WireFrame);
} private void SetWorldTransform(float x, float y, float z)
{
Vector3 world;
if (rotatorXYZ == 0)
{
world = new Vector3(angle, 0, 0);
}
else if (rotatorXYZ == 1)
{
world = new Vector3(0, angle, 0);
}
else
{
world = new Vector3(0, 0, angle);
}
device.Transform.World = Matrix.RotationAxis(world, angle) * Matrix.Translation(x, y, z);
if (enableRotator == true)
{
angle += 0.03f / (float)Math.PI;
}
} private void Form1_Load(object sender, EventArgs e)
{
this.Width = 575;
this.Height = 475;
this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque, true);
this.KeyPreview = true;
helpString = "<Esc>:退出\n\n\n" +
"<F1>:显示/隐藏提示信息\n" +
"<F2>:实心/线框\n" +
"<F3>:旋转/不旋转\n" +
"<F4>:旋转轴(x轴、y轴、z轴)\n" +
"<F5>:背景剔除/不剔除\n\n";
System.Drawing.Font winFont = new System.Drawing.Font("宋体", 9, FontStyle.Regular);
d3dfont = new Microsoft.DirectX.Direct3D.Font(device, winFont);
d3dfont.PreloadText(helpString);
textMesh = Mesh.TextFromFont(
device, new System.Drawing.Font("宋体", 12), "Mesh对象展示", 1.0f, 0.3f);
boxMesh = Mesh.Box(device, 2.0f, 2.0f, 2.0f);
cylinderMesh = Mesh.Cylinder(device, 1.0f, 0.5f, 2.0f, 10, 10);
polygonMesh = Mesh.Polygon(device, 0.4f, 20);
sphereMesh = Mesh.Sphere(device, 1.0f, 20, 10);
teapotMesh = Mesh.Teapot(device);
torusMesh = Mesh.Torus(device, 0.3f, 1.0f, 20, 20);
} private void Form1_Paint(object sender, PaintEventArgs e)
{
SetupCamera();
device.Clear(ClearFlags.Target, Color.DarkSeaGreen, 1.0f, 0);
device.BeginScene();
// 绘制文本
SetWorldTransform(0, 5, 0);
textMesh.DrawSubset(0);
// 绘制立方体
SetWorldTransform(-5, 0, 0);
boxMesh.DrawSubset(0);
// 绘制圆筒
SetWorldTransform(0, 0, 0);
cylinderMesh.DrawSubset(0);
// 绘制多边形
SetWorldTransform(5, 0, 0);
polygonMesh.DrawSubset(0);
// 绘制球形
SetWorldTransform(-5, -5, 0);
sphereMesh.DrawSubset(0);
// 绘制茶壶
SetWorldTransform(0, -5, 0);
teapotMesh.DrawSubset(0);
// 绘制圆环
SetWorldTransform(5, -5, 0);
torusMesh.DrawSubset(0);
if (showHelpString == true)
{
d3dfont.DrawText(null, helpString, 25, 30, Color.Tomato);
}
device.EndScene();
device.Present();
if (WindowState != FormWindowState.Minimized)
{
this.Invalidate();
}
} private void Form1_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Escape:
this.Close();
break;
case Keys.F1:
showHelpString = !showHelpString;
break;
case Keys.F2:
enableSolidMode = !enableSolidMode;
break;
case Keys.F3:
enableRotator = !enableRotator;
break;
case Keys.F4:
rotatorXYZ = (rotatorXYZ + 1) % 3;
break;
case Keys.F5:
enableCullMode = !enableCullMode;
break;
} }
}
}
Directx 3D编程实例:绘制3DMesh的更多相关文章
- Directx 3D编程实例:随机绘制的立体图案旋转
最近朋友建议我写一些关于微软云技术的博客留给学校下一届的学生们看,怕下一届的MSTC断档.于是我也觉的有这个必要. 写了几篇博客之后,我觉得也有必要把这一年的学习内容放在博客做个纪念,就这样写了本篇博 ...
- Directx 3D编程实例:绘制可变速旋转的三角形
最近朋友建议我写一些关于微软云技术的博客留给学校下一届的学生们看,怕下一届的MSTC断档.于是我也觉的有这个必要. 写了几篇博客之后,我觉得也有必要把这一年的学习内容放在博客做个纪念,就这样写了本篇博 ...
- Directx 3D编程实例:多个3D球的综合Directx实例
最近朋友建议我写一些关于微软云技术的博客留给学校下一届的学生们看,怕下一届的MSTC断档.于是我也觉的有这个必要.写了几篇博客之后,我觉得也有必要把这一年的学习内容放在博客做个纪念,就这样写了本篇博客 ...
- OpenGL学习进程(9)在3D空间的绘制实例
本节将演示在3D空间中绘制图形的几个简单实例: (1)在3D空间内绘制圆锥体: #include <GL/glut.h> #include <math.h> # ...
- 开始3D编程前需注意的十件事
http://www.csdn.net/article/2013-06-21/2815949-3d-programming 原文作者Vasily Tserekh是名3D编程爱好者,他发表了一篇博文&l ...
- DirectX API 编程起步 #01 项目设置
=========================================================== 目录: DirectX API 编程起步 #02 窗口的诞生 DirectX A ...
- QT Graphics-View 3D编程例子- 3D Model Viewer
学习在Graphics-View框架中使用opengl进行3D编程,在网上找了一个不错的例子“3D Model Viewer”,很值得学习. 可以在http://www.oyonale.com/acc ...
- UWP简单示例(二):快速开始你的3D编程
准备 IDE:Visual Studio 2015 了解并学习:SharpDx官方GitHub 推荐Demo:SharpDX_D3D12HelloWorld 第一节 世界 世界坐标系是一个特殊的坐标系 ...
- PHP多进程编程实例
这篇文章主要介绍了PHP多进程编程实例,本文讲解的是在Linux下实现PHP多进程编程,需要的朋友可以参考下 羡慕火影忍者里鸣人的影分身么?没错,PHP程序是可以开动影分身的!想完成任务,又觉得一个进 ...
随机推荐
- 分布式发布订阅消息系统 Kafka 架构设计[转]
分布式发布订阅消息系统 Kafka 架构设计 转自:http://www.oschina.net/translate/kafka-design 我们为什么要搭建该系统 Kafka是一个消息系统,原本开 ...
- iOS7初体验(1)——第一个应用程序HelloWorld
iOS7 Beta已经发布了,迫不及待地下载了iOS 7及Xcode 5并体验了一下.先做一个简单的Hello World看看都有哪些变化吧. 1. 启动Xcode5-DP: 2. 从菜单选择File ...
- 网络编程(学习整理)---2--(Udp)实现简单的控制台聊天室
1.UDP协议: 总结一下,今天学习的一点知识点! UDP也是一种通信协议,常被用来与TCP协议作比较!我们知道,在发送数据包的时候使用TCP协议比UDP协议安全,那么到底安全在哪里呢?怎么理解呢! ...
- SGU 188.Factory guard
模拟 code #include <iostream> #include <cstdio> #define LEN 1000 using namespace std; int ...
- javascript——函数内部属性
<script type="text/javascript"> //在函数内部有两个特殊的属性:arguments 和 this.arguments是一个类数组对象,包 ...
- Struts2中使用execAndWait后,在 Action中调用getXXX()方法报告java.lang.NullPointerException异常的原因和解决方法
使用 Struts2 编写页面,遇到一个要长时间运行的接口,因此增加了一个execAndWait ,结果在 Action 中调用 getContext()的时候报告异常 ActionContext c ...
- php文件加锁 lock_sh ,lock_ex
文件锁有两种:共享锁和排他锁,也就是读锁(LOCK_SH)和写锁(LOCK_EX) 文件的锁一般这么使用: $fp = fopen("filename", "a" ...
- 基于jQuery 的图片瀑布流实现
解题思路: 第1步 分析问题:我这边的处理方式是以列为单位.每次滚动条滚到底部,把需要加的新的内容放在高度最小的列.如下图所示 加载后的显示 如果在继续往下滚动.新图片就会在1下边显示,如此类推. ...
- YII session存储 调用login方法
当要进行用户的session存储的时候,可以调用里面的login方法进行存储
- TatukGIS - GisDefs - ChangeDir 函数
函数名称 ChangeDir 所在单元 GisDefs 函数原型 function ChangeDir(const _path: String): String; 函数说明 如果 _path ...