1.应用directx图形库进行开发;

2.代码:

public class TClass : System.Windows.Forms.Form
{
/// <summary>
/// 设备对象,场景中所有图形对象的父对象
/// </summary>
private Device device = null; /// <summary>
/// 坐标系四棱锥顶点缓冲
/// </summary>
VertexBuffer vertexBuffer = null; /// <summary>
/// 此参数设置为必须,它定义了要创建的Direct3D设备的表示参数,如后台缓冲区的高度、宽度和像素格式、如何从后台缓冲区复制到前台缓存、以及屏幕显示的方式等等
/// </summary>
PresentParameters presentParameters; /// <summary>
/// 暂停标志
/// </summary>
bool pause = false; /// <summary>
/// 随机数,用来生成随机颜色用的
/// </summary>
Random rn = new Random(); /// <summary>
/// 构造函数,设置窗体大小
/// </summary>
public TClass()
{
this.ClientSize = new System.Drawing.Size(300, 300);
} /// <summary>
/// 初始化绘图环境
/// </summary>
/// <returns></returns>
public bool InitializeGraphics()
{
try
{
presentParameters = new PresentParameters();
//设置屏幕显示模式为窗口模式
presentParameters.Windowed = true;
//设置如何从后台缓冲区复制到前台缓冲区(SwapEffect.Discard表示缓冲区在显示后立即被舍弃,这样可以节省开销)
presentParameters.SwapEffect = SwapEffect.Discard;
//创建一个设备
device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParameters);
//为设备释放订阅事件处理
device.DeviceReset += new System.EventHandler(this.OnResetDevice); this.OnCreateDevice(device, null);
this.OnResetDevice(device, null);
pause = false;
return true;
} catch (DirectXException)
{
return false;
}
} /// <summary>
/// 设备创建时建立顶点缓冲
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void OnCreateDevice(object sender, EventArgs e)
{
Device dev = (Device)sender; //创建顶点缓冲,有个顶点
vertexBuffer = new VertexBuffer(typeof(CustomVertex.PositionColored), 18, dev, 0, CustomVertex.PositionColored.Format, Pool.Default);
//为创建顶点缓存订阅事件处理
vertexBuffer.Created += new System.EventHandler(this.OnCreateVertexBuffer); this.OnCreateVertexBuffer(vertexBuffer, null);
} /// <summary>
/// 设备撤销的事件处理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void OnResetDevice(object sender, EventArgs e)
{
Device dev = (Device)sender;
//关闭剔除模式,使我们能看见此四棱锥的前面和后面
dev.RenderState.CullMode = Cull.None;
// 关闭场景里的灯光,显示顶点自己的颜色
dev.RenderState.Lighting = false;
} /// <summary>
/// 创建顶点缓存的事件处理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void OnCreateVertexBuffer(object sender, EventArgs e)
{ VertexBuffer vb = (VertexBuffer)sender;
CustomVertex.PositionColored[] verts = (CustomVertex.PositionColored[])vb.Lock(0, 0); //四棱锥原始的个点
Vector3 vertex1 = new Vector3(25, 0, 0);
Vector3 vertex2 = new Vector3(0, 0, -25);
Vector3 vertex3 = new Vector3(-25, 0, 0);
Vector3 vertex4 = new Vector3(0, 0, 25);
Vector3 vertex5 = new Vector3(0, 25, 0); //四棱锥中包含个三角形,所以要构造个点来绘制
verts[0].Position = vertex1;
verts[1].Position = vertex2;
verts[2].Position = vertex5;
verts[3].Position = vertex2;
verts[4].Position = vertex3;
verts[5].Position = vertex5;
verts[6].Position = vertex3;
verts[7].Position = vertex4;
verts[8].Position = vertex5;
verts[9].Position = vertex4;
verts[10].Position = vertex1;
verts[11].Position = vertex5;
verts[12].Position = vertex2;
verts[13].Position = vertex1;
verts[14].Position = vertex3;
verts[15].Position = vertex3;
verts[16].Position = vertex1;
verts[17].Position = vertex4; //给每个点赋予随机颜色
for (int i = 0; i < 18; i++)
{
verts[i].Color = Color.FromArgb(SetColor(), SetColor(), SetColor()).ToArgb(); }
vb.Unlock(); } /// <summary>
/// 返回到之间的一个随机数,用来生成随机颜色
/// </summary>
/// <returns></returns>
public int SetColor()
{
int number = rn.Next(256);
return number;
} /// <summary>
/// 设置摄像机的位置
/// </summary>
private void SetupCamera()
{
//设置世界矩阵,根据系统运行时间而变化
device.Transform.World = Matrix.RotationAxis(new Vector3((float)Math.Cos(Environment.TickCount / 250.0f), 1, (float)Math.Sin(Environment.TickCount / 250.0f)), Environment.TickCount / 3000.0f);
//设置摄像机的位置,它在z轴上-50处,看着原点,y轴为正方向
device.Transform.View = Matrix.LookAtLH(new Vector3(0.0f, 0.0f, -50f), new Vector3(0.0f, 0.0f, 0.0f), new Vector3(0.0f, 1.0f, 0.0f)); //设置摄像机的视界,角度为度,看的最近为,看的最远处为.不再这个视界中的影像都不会被显示
device.Transform.Projection = Matrix.PerspectiveFovLH(((float)(float)Math.PI / 2), 1.0f, 10.0f, 200.0f);
} /// <summary>
/// 绘制图形
/// </summary>
public void Render()
{
if (device == null)
return; if (pause)
return; //背景设为绿色
device.Clear(ClearFlags.Target, System.Drawing.Color.Blue, 1.0f, 0);
//开始场景
device.BeginScene();
// 设置世界,视野和投影矩阵
SetupCamera(); // 给设备指定顶点缓存
device.SetStreamSource(0, vertexBuffer, 0); //设置设备的顶点格式
device.VertexFormat = CustomVertex.PositionColored.Format; //绘制图形,使用的方法为三角形列表,个数为个
device.DrawPrimitives(PrimitiveType.TriangleList, 0, 6); //结束场景
device.EndScene(); //更新场景
device.Present();
} //重载OnPaint函数
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
//绘制图形
this.Render();
}
}

  调用代码:

using (TClass frm = new TClass())
{
if (!frm.InitializeGraphics()) // 初始化 Direct3D
{
MessageBox.Show("不能初始化 Direct3D.程序将退出.");
return;
}
frm.Show(); // While the form is still valid, render and process messages
while (frm.Created)
{
frm.Render();
Application.DoEvents(); //处理当前在消息队列中的所有 Windows 消息
}
}

  3.需要引用directx的程序集,下载连接(含项目):

  链接:https://pan.baidu.com/s/1D4wrHC7c2Pg1wpWXlrLrSA
  提取码:7f6w

  4.注意调用Microsoft.DirectX.dll时候,需要在程序配置文件中设置useLegacyV2RuntimeActivationPolicy为true。

c# 3d图像显示的更多相关文章

  1. 3D立体显示大屏幕拼接视频墙系统解决方案【转】

    http://shop.souvr.com/thread-123416-1-1.html 随着3D立体视像.全息影像等技术不断取得突破性进展,国内外越来越多的公司投身3D显示领域,产品层出不穷.3D技 ...

  2. 从css 3d说到空间坐标轴

    有一次我们说到掷骰子那个游戏,当时是用了一个steps属性+雪碧图来制作帧动画,这当然颇为不错,但其实一开始我想的不是这样的,我想的是用真的3d和动画去做,这个方案涉及到不少空间的知识,今天来给大伙好 ...

  3. css translate/rotate 空间坐标轴

    参考:https://www.cnblogs.com/zhangnan35/p/10709876.html https://www.cnblogs.com/zyrblog/p/11142624.htm ...

  4. 1.1 VGA(图像显示卡),Graphics Card(图形加速卡),Video Card(视频加速卡),3D Accelerator Card 和 GPU(图形处理器)

    1.1 VGA(图像显示卡),Graphics Card(图形加速卡),Video Card(视频加速卡),3D Accelerator Card 和 GPU(图形处理器) 对这些概念之前也没怎么了解 ...

  5. 现代3D图形编程学习-基础简介(2) (译)

    本书系列 现代3D图形编程学习 基础简介(2) 图形和渲染 接下去的内容对渲染的过程进行粗略介绍.遇到的部分内容不是很明白也没有关系,在接下去的章节中,会被具体阐述. 你在电脑屏幕上看到的任何东西,包 ...

  6. 基于C/S架构的3D对战网络游戏C++框架 _04客户端详细设计与OpenGL、Qt基础

    本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...

  7. 第四章 跨平台图像显示库——SDL 第一节 与SDL第一次亲密接触

    http://blog.csdn.net/visioncat/article/details/1596576 GCC for Win32 开发环境介绍(5) 第四章 跨平台图像显示库——SDL 第一节 ...

  8. 裸眼3D立体显示技术原理详解

    众所周知,现实世界是一个三维空间,除去时间这一维度,现实世界是由长度.宽度和高度三个维度组成,我们每天就生活在这个三维世界中,而现有的显示设备大多数都只能显示二维信息,并不能带给人真实的三维感觉.为了 ...

  9. <airsim文档学习> Street View Image, Pose, and 3D Cities Dataset

    原文地址:  https://github.com/amir32002/3D_Street_View 说明:个人学习笔记,翻译整理自github/airsim. 简介 该存储库共享包含6DOF相机姿态 ...

随机推荐

  1. 关于“关于C#装箱的疑问”帖子的个人看法 (原发布csdn 2017年10月07日 10:21:10)

    前言 昨天晚上闲着无事,就上csdn逛了一下,突然发现一个帖子很有意思,就点进去看了一下. 问题很精辟 int a = 1; object b=a; object c = b; c = 2; 为什么b ...

  2. 13、VUE单文件工程

    1.为什么要使用单文件工程? 1.Vue.js路由组件的不方便 不支持引用HTML页面,以至于template里面定义的标签会编辑器当字符串,这让编辑变的困难. 2.Vue.js于Node.js语言结 ...

  3. Java内功心法,创建型设计模式包括哪些

    1. 单例(Singleton) Intent 确保一个类只有一个实例,并提供该实例的全局访问点. Class Diagram 使用一个私有构造函数.一个私有静态变量以及一个公有静态函数来实现. 私有 ...

  4. 2019 安易迅java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.安易迅等公司offer,岗位是Java后端开发,因为发展原因最终选择去了安易迅,入职一年时间了,也成为了面试官 ...

  5. json传的解析,二维数据解析

    下载地址:https://share.weiyun.com/447eda75fdd46cb87f6622ecdce4c3ac

  6. Spark GraphX图算法应用【分区策略、PageRank、ConnectedComponents,TriangleCount】

    一.分区策略 GraphX采用顶点分割的方式进行分布式图分区.GraphX不会沿着边划分图形,而是沿着顶点划分图形,这可以减少通信和存储的开销.从逻辑上讲,这对应于为机器分配边并允许顶点跨越多台机器. ...

  7. 【MySQL】自增步长调整

    mysql> show variables like '%increment%'; +-----------------------------+-------+ | Variable_name ...

  8. Python基础(二)--基本数据类型、格式化输出、基本运算符

    一.基本数据类型 1.数字类型 #int整型 定义:age=10 #age=int(10) 用于标识:年龄,等级,身份证号,qq号,个数 #float浮点型 定义:salary=3.1 #salary ...

  9. Linux操作系统安全-局域网私有CA(Certificate Authority)证书服务器实战篇

    Linux操作系统安全-局域网私有CA(Certificate Authority)证书服务器实战篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.试验架构说明 node101 ...

  10. Nat类型测试

    这是一个测试NAT类型的小工具,一般也没太多用处,只有游戏玩家可能需要用来测试你的网络NAT类型是什么.NAT类型一般分为以下4种: 1. Full Cone NAT (完全圆锥型)2. Restri ...