c# 3d图像显示
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图像显示的更多相关文章
- 3D立体显示大屏幕拼接视频墙系统解决方案【转】
http://shop.souvr.com/thread-123416-1-1.html 随着3D立体视像.全息影像等技术不断取得突破性进展,国内外越来越多的公司投身3D显示领域,产品层出不穷.3D技 ...
- 从css 3d说到空间坐标轴
有一次我们说到掷骰子那个游戏,当时是用了一个steps属性+雪碧图来制作帧动画,这当然颇为不错,但其实一开始我想的不是这样的,我想的是用真的3d和动画去做,这个方案涉及到不少空间的知识,今天来给大伙好 ...
- css translate/rotate 空间坐标轴
参考:https://www.cnblogs.com/zhangnan35/p/10709876.html https://www.cnblogs.com/zyrblog/p/11142624.htm ...
- 1.1 VGA(图像显示卡),Graphics Card(图形加速卡),Video Card(视频加速卡),3D Accelerator Card 和 GPU(图形处理器)
1.1 VGA(图像显示卡),Graphics Card(图形加速卡),Video Card(视频加速卡),3D Accelerator Card 和 GPU(图形处理器) 对这些概念之前也没怎么了解 ...
- 现代3D图形编程学习-基础简介(2) (译)
本书系列 现代3D图形编程学习 基础简介(2) 图形和渲染 接下去的内容对渲染的过程进行粗略介绍.遇到的部分内容不是很明白也没有关系,在接下去的章节中,会被具体阐述. 你在电脑屏幕上看到的任何东西,包 ...
- 基于C/S架构的3D对战网络游戏C++框架_04客户端详细设计与OpenGL、Qt基础
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
- 第四章 跨平台图像显示库——SDL 第一节 与SDL第一次亲密接触
http://blog.csdn.net/visioncat/article/details/1596576 GCC for Win32 开发环境介绍(5) 第四章 跨平台图像显示库——SDL 第一节 ...
- 裸眼3D立体显示技术原理详解
众所周知,现实世界是一个三维空间,除去时间这一维度,现实世界是由长度.宽度和高度三个维度组成,我们每天就生活在这个三维世界中,而现有的显示设备大多数都只能显示二维信息,并不能带给人真实的三维感觉.为了 ...
- <airsim文档学习> Street View Image, Pose, and 3D Cities Dataset
原文地址: https://github.com/amir32002/3D_Street_View 说明:个人学习笔记,翻译整理自github/airsim. 简介 该存储库共享包含6DOF相机姿态 ...
随机推荐
- 【mybatis】标签条件中判断入参属性值是否包含子字符串
可以直接使用 contains判断 <foreach collection="list" item="item" index="index&qu ...
- http响应总结:常见http响应错误总结
工作中经常会被同事问这个http请求为什么调不通,我虽然能解释清楚错误是什么,但是没有总结过,想到刚开始时,也是看了别人的文章才会的,所以总结一下,贡献一下自己的经验. http 404 响应 404 ...
- WPF 精修篇 移动TranslateTransform
原文:WPF 精修篇 移动TranslateTransform 移动 TranslateTransform X 移动X轴 Y 移动Y轴 <StackPanel Orientation=" ...
- PIE SDK打开自定义栅格数据
1. 数据介绍 信息提取和解译的过程中,经常会生成一部分中间临时栅格数据,这些数据在执行完对应操作后就失去了存在的价值,针对这种情况,PIE增加了内存栅格数据集,来协助用户完成对自定义栅格数据的读取和 ...
- Linux 常用命令 , 其他名 , 文件管理
Linux 常用命令 , 其他名 , 文件管理 一丶Linux常用的指令 1. bsystemctl stop firewalld #关闭防火墙 2. iptables -F #清空防火墙规则 3. ...
- flex:1和flex:auto详解
flex:1和flex:auto详解 首先明确一点是, flex 是 flex-grow.flex-shrink.flex-basis的缩写. flex-grow属性定义项目的放大比例,默认为0,即如 ...
- 【开发笔记】- AbstractRoutingDataSource动态数据源切换,AOP实现动态数据源切换
AbstractRoutingDataSource动态数据源切换 上周末,室友通宵达旦的敲代码处理他的多数据源的问题,搞的非常的紧张,也和我聊了聊天,大概的了解了他的业务的需求.一般的情况下我们都是使 ...
- 【案例】大型摩托制造企业如何高效排产?看APS系统如何帮忙
江门市大长江集团有限公司(下文简称,大长江集团)创建于1991年11月,是豪爵控股下属子公司. 大长江生产计划管理从最初的电子表格Excel 公式辅助计算,发展到按公司业务需求,利用Excel VBA ...
- LabWindows/CVI第一章:基本规则
一. #include<stdio.h> //头文件,#号是预处理指令,standard input output header的缩写. void main() ...
- Django ORM (二) 增加操作
数据库表结构生成完毕后,可以使用工具连接上去 在 app01_author 表创建基础记录 在 app01_publisher 表创建基础记录 添加 data_oper 方法 在 urls.py 文件 ...