DirectX 3D 之C#开发
C#下进行directX的3D开发,一个旋转的4棱锥的例子。
建议看两个文档<Managed DirectX 9图形和游戏编程简略中文文档>和<Managed DirectX 9 SDK 中文文档>。
另外最好下载个DirectX SDK (August 2007).rar。里面有些范例还是非常好的。
一、首先在电脑上装了DirectX。
二、建立一个C#的Windows应用程序,添加两个引用Microsoft.DirectX和Microsoft.DirectX.Direct3D;
三、Form1.cs
具体代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.DirectX; //开发directx需要包含的两个命名空间
using Microsoft.DirectX.Direct3D;
namespace Rectangle
{
public partial class form1 : Form
{
/// <summary>
/// 设备对象,场景中所有图形对象的父对象
/// </summary>
private Device device = null;
/// <summary>
/// 坐标系四棱锥顶点缓冲
/// </summary>
VertexBuffer vertexBuffer = null;
/// <summary>
/// 此参数设置为必须,它定义了要创建的Direct3D设备的表示参数,如后台缓冲区的高度、宽度和像素格式、如何从后台缓冲区复制到前台缓存、以及屏幕显示的方式等等
/// </summary>
PresentParameters presentParameters = new PresentParameters();
/// <summary>
/// 暂停标志
/// </summary>
bool pause = false;
/// <summary>
/// 随机数,用来生成随机颜色用的
/// </summary>
Random rn = new Random();
/// <summary>
/// 构造函数,设置窗体大小
/// </summary>
public form1()
{
this.ClientSize = new System.Drawing.Size(300, 300);
}
/// <summary>
/// 初始化绘图环境
/// </summary>
/// <returns></returns>
public bool InitializeGraphics()
{
try
{
//设置屏幕显示模式为窗口模式
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();
}
}
}
四,program.cs中的代码为:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace Rectangle
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
using (form1 frm = new form1())
{
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 消息
}
}
}
}
}
运行后你会看到一个不断旋转的四棱锥。
DirectX 3D 之C#开发的更多相关文章
- Civil 3D 二次开发 创建Civil 3D 对象—— 01 —— 创建几何空间点
这一小节,我们创建派生于CivilCreateEntityDemo的类CivilCreateCogoPoint,来创建几何空间点. 1 创建类并添加字段及方法 首先在项目资源管理器中向本项目中添加类, ...
- 学习 Civil 3D二次开发从哪儿开始?
1.1 从哪儿开始 对于多数的工程设计人员,不完全具备上节所述的各种条件.对于Civil 3D的应用可能比较熟悉:但对于计算机语言,只限于上学时所学的一点基础知识,步入工作岗位后与计算机语言基本无缘: ...
- ThreeJs 3D 全景项目开发总结
本文来自网易云社区 作者:唐钊 项目背景 那是在一个毫无征兆的下午,我还沉浸在 vue 的世界中,突然编辑跑过来说N的新官网想做一些3D全景的东西,一开始其实我的内心是拒绝的,一是没怎么实质性做过 W ...
- 两天学会DirectX 3D之入门
环境配置以及背景知识 环境 Windows 8.1 64bit VS2013 Microsoft DirectX SDK (June 2010) NVDIA Geforce GT755 环境的配置參考 ...
- iOS 3D Touch 适配开发
3D Touch的主要应用 文档给出的应用介绍主要有两块: 1.A user can now press your Home screen icon to immediately access fun ...
- 强大的游戏开发工具Unity3D推出2D开发工具,unity将混合3D与2D开发
2013 Unity全球开发者大会(Unite 2013)于2013年8月28日在温哥华隆重开幕,会上Unity全球CEO David Helgason在Keynote上宣布Unity 4.3版本即将 ...
- Directx 3D编程实例:随机绘制的立体图案旋转
最近朋友建议我写一些关于微软云技术的博客留给学校下一届的学生们看,怕下一届的MSTC断档.于是我也觉的有这个必要. 写了几篇博客之后,我觉得也有必要把这一年的学习内容放在博客做个纪念,就这样写了本篇博 ...
- Directx 3D编程实例:绘制3DMesh
最近朋友建议我写一些关于微软云技术的博客留给学校下一届的学生们看,怕下一届的MSTC断档.于是我也觉的有这个必要.写了几篇博客之后,我觉得也有必要把这一年的学习内容放在博客做个纪念,就这样写了本篇博客 ...
- Directx 3D编程实例:绘制可变速旋转的三角形
最近朋友建议我写一些关于微软云技术的博客留给学校下一届的学生们看,怕下一届的MSTC断档.于是我也觉的有这个必要. 写了几篇博客之后,我觉得也有必要把这一年的学习内容放在博客做个纪念,就这样写了本篇博 ...
随机推荐
- 基于UUID生成短ID
为什么需要短ID 数据库操作过程最常用到: 自增ID UUID 前者多数依赖Mysql的auto_increment,但数据移植麻烦. 如果是主从或主主,不同库里自增ID还可能不一致. 后者长度是个问 ...
- 深入理解用mysql_fetch_row()以数组的形式返回查询结果
同mysql_result()一样,mysql_fetch_row()也可以用来获取查询结果集,其区别在于函数的返回值不是一个字符串,而是一个数组.函数定义如下. 复制代码 代码如下: array m ...
- hifi/ headphone test
https://www.youtube.com/watch?v=-r0gRjqN0N8 https://www.youtube.com/watch?v=sMh_zvCw6us
- JPA学习---第五节:日期和枚举等字段类型的JPA映射
1.在上一节可在数据库中看到创建出来的表和字段,是通过 Entity bean 来创建的,而创建表名和字段名的规则是怎样的? 有类,代码如下: package learn.jpa.bean; impo ...
- STM32的SPI问题。
问题描述: 之前一直使用的单片机是LPC2109,对其SPI很熟悉.基本就是原本拿来稍作修改就用.由于某种原因需要使用STM32,然后设备的驱动是之前写好的,只修改了一些硬件控制端口,由于硬件驱动使用 ...
- 多线程学习之AsyncOperation实现线程间交互
1.首先我们要实现如下图的效果: a.主线程A运行方法段1时创建子线程B b.然后子线 ...
- 【BZOJ】【2463】【中山市选2009】谁能赢呢?
博弈论 这能算博弈论吗…… orz ZYF so sad……窝智商太低 题解搬运: 当n为偶数时,可以被2*1的骨牌完全覆盖,所以每次都走骨牌的另一端,而另一个人只能走新的骨牌,直到没有为止 当n为奇 ...
- [转载]C# winform登陆框验证码的实现
验证码技术已愈来愈成熟,从最初的数字.字母.字符.汉字已经到目前的语言,其应用也甚广,之前大多数只有在网站上可以看到,现在在一些客户端软件也经常可见(比如证券相关软件).之前做的一个基于 C# 客户端 ...
- [转载]如何申请淘宝app_key、app_secret、SessionKey?
不知道如何申请淘宝开发平台的App Key?其实申请App key很简单,主要了解申请步骤以及各个App key的数据阶段状态就可以了!下面由淘客帝国为您做详细图文讲解!申请比较简单,不过为了新手能够 ...
- uva 10910
简单dp /************************************************************************* > Author: xlc2845 ...