最近朋友建议我写一些关于微软云技术的博客留给学校下一届的学生们看,怕下一届的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;
}
}
}
}
分享到:
相关推荐
3DMesh(winform下3D图表控件)
OpenCV实现的图像2D转3D Image-2D-to-3D.rar 图像2D转3D,基于VS2015+opencv。可以实现2d图像转3d图像的功能
随机游走matlab代码LocateThetaIn3DMesh:在 3D 网格中定位四面体 概述 该项目提供了用于定位四面体网格中 3D 点的 MATLAB 脚本。 作者 作者:Adam Dziekonski,Dr.Eng。 出版日期:2018 年 8 月 软件要求 MATLAB ...
RegularizeData3D 是来自 Matlab File Exchange 的 GridFit 的修改版本。 RegularizeData3D 基本上做同样的事情,但它试图克服 GridFit 中遗留代码设计中固有的几个缺点。 * GridFit 缺乏三次插值功能。 需要进行...
matlab开发-使用ParseControlPoints的3DMESH变换器。使用不规则放置的变换向量执行三维非刚性变形
安全技术-网络信息-面向3DMesh片上网络服务质量保证机制研究.pdf
用于实现图形,用三维数学方式实现,可以运行,
在U3D实现Mehs切割,可以切割任意Mesh的模型,局限性是切割面必须为平面,这个我没考虑,还有就是切面需要添加双面材质才能显示,切割面使用了耳切法
S3d是网格生成机器。
Revit 2015 插件。将点云(PTS 和 PTX)转换为 Revit 的 3Dmesh (DXF)。 要求: - Revit 2015 - MeshLab 1.3.3
采用子网和概率模型对E-2DMesh网络在节点随机出错概率下的容错性进行分析,推出不同时间下的不同规模的E-2DMesh网络的连通概率下界,并且运用严密的数学方法推导出网络连通率与其节点出错概率的关系。实验结果表明以...
提出了一种3D-Mesh拓扑互连网络结构,其支持动态可重构配置,数据路径位宽为32 bit。基于该3D-Mesh拓扑互连网络结构,设计了一种拥有48个RPE(Reconfigurable Process Element)和16个RSE(Reconfigurable Storage ...
4.13.3 练习:使用3DMESH命令 147 4.14 3D命令 149 4.15 修改多边形网格曲面 154 4.16 PEDIT命令 155 4.16.1 EDIT VERTEX选项 155 4.16.2 SMOOTH SURFACE选项 156 4.16.3 DESMOOTH SURFACE 选项 156 4.16.4 MCLOSE/...
对E-2DMesh网络中单工失效链路模式进行了研究,提出了基于子网的状态转移模型。基于该方法分别对不可维修和可维修链路模式进行了分析,证明了对较大规模的E-2DMesh网络,不可维修链路模式的可靠性要比可维修链路模式...
针对3D Mesh NoC中的节点故障,提出了一种无虚拟通道容错路由算法,称为3D ZoneDefense容错路由算法(3D-ZDFT)。该算法建立在3D防御区域基础之上。3D防御区域能够提供故障体的位置信息。根据防御区域提供的故障体...
mesh2hmap是一个简单的命令行工具,用于将3D网格转换为栅格高度图。 使用此工具,您可以在自己喜欢的3D建模器中创建地形,然后轻松地将其转换为高度图图像。
7 3DMESH 绘制三维自由多边形网格 8 3DORBLT 3DO 三维动态旋转 9 3DPAN 三维视图平移 10 3DPLOY 3P 绘制三维多段线 11 3DSIN 插入一个3DS文件 12 3DSOUT 输出图形数据到一个3DS文件 13 3DSWIVEL ...
这个是一个生成二维网格的一个子程序,效果很好,简单方便
针对2D Mesh拓扑结构中的损坏节点会导致静态XY路由算法无法有效传输的问题, 提出了一种新的路由算法——FTXY路由算法。首先对网络拓扑结构中的平均延时、理想平均吞吐量和能量消耗进行了理论评估, 然后在NIRGAM仿真...