Direcx一般都是用VC++开发环境,而c#相关的资料比较少,最近做的一个项目中需要用到一个3D模型,而开发环境是visual c#,没办法,就四处搜集资料,查找相关的资料,然后找到了几篇相关的博文,不过这些博文说的都不太仔细,有些内容又丢失了一些关键代码,这个时候就需要我们自己搜集资料,自己学习来补全这些关键代码了。

废话少说,我们直接说说步骤吧。

.首先要准备一个3D模型,现在3D模型都是.max或者.obj或者别的格式的,不过因为我用的是Directx9.0开发环境,因此载入3D模型的时候需要把文件转换为.X格式,没有关系,我们可以下载一个3dsMax软件,然后装上微软的panda插件,这个软件就能把.max格式的3d文件转换为.x格式输出。这一步我们最主要的目的就是为了得到一个.x格式的3D模型。

.接下来就是下载Directx9.0Sdk了,下载完成之后安装这个开发工具。

.接下来进入项目,新建一个Visual c# winform窗体程序,然后点击确定,我们的编程工作就开始了。

首先,项目需要用到Directx开发包,因此我们需要给项目添加引用,右键单击项目,选择添加引用,然后在引用的对话框中选择浏览,这里引用的位置是:C:\Windows\Microsoft.NET\DirectX for Managed Code\1.0.2902.0,注意最后的应用的文件夹是1.0.2902.0,我们引用这里面的三个文件:DirectX.dll ,DirectX3D.dll 和DirectX3DX.dll,选择这三项之后点击确定,之后就添加了引用,然后我们还需要在窗体代码中添加如下引用:

using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D; 

之后我们的引用工作算是完成了。

因为我准备把3D模型显示在一个控件上,我选择了一个Panel控件放到主窗口上,我们的模型待会儿就会显示在这个panel上。首先在Form中设置如下几个全局变量:

#region//保存3D文件private Mesh mesh = null;//设备private Device device = null;//材质private Material[] meshMaterials;private Texture[] meshTextures; //获取当前程序的Debug路径string path = System.Windows.Forms.Application.StartupPath; //角度 private float angle = 0.0f; #endregion

然后写出我们的初始化图形设备的函数:

<span style="font-size:14px;">        //初始化图形设备public void InitializeGraphics(){//设置变量PresentParameters presentParams = new PresentParameters();//设置在窗口模式下运行presentParams.Windowed = true;//设置交换效果为DiscardpresentParams.SwapEffect = SwapEffect.Discard;presentParams.AutoDepthStencilFormat = DepthFormat.D16;presentParams.EnableAutoDepthStencil = true;//创建设备//因为我显示在panel1中,所以device中的第三个变量是panel的名字device = new Device(0, DeviceType.Hardware, panel1,CreateFlags.SoftwareVertexProcessing, presentParams);//我的3D文件在Debug中的Model文件中,因此temp获取了3D模型的地址string temp = path;temp = temp + "\\Model\\Model.X";//这个函数用于载入3D模型并且保存在mesh中LoadMesh(temp);}</span>

然后是载入3D模型的LoadMesh(string file) 函数

        private void LoadMesh(string file){ExtendedMaterial[] mtrl = null;//载入try{mesh = Mesh.FromFile(file, MeshFlags.Managed, device, out mtrl);//有材质的话,则载入if ((mtrl != null) && (mtrl.Length > 0)){//这两个就是前面定义的全局变量,保存材质和纹理meshMaterials = new Material[mtrl.Length];meshTextures = new Texture[mtrl.Length];for (int i = 0; i < mtrl.Length; ++i){/*当前的temp是Debug下的Model文件,*Model文件中有保存纹理和材质的文件*/string temp = path + "\\Model\\";meshMaterials[i] = mtrl[i].Material3D;if ((mtrl[i].TextureFilename != null)&& mtrl[i].TextureFilename != string.Empty){meshTextures[i] = TextureLoader.FromFile(device, temp + mtrl[i].TextureFilename);}}}}catch (Direct3DXException ex){MessageBox.Show(ex.ToString());return;}}

载入模型之后就需要将模型画出来,因此,还需要一个画模型的函数:

       //绘制mesh的材质和纹理private void DrawMesh(float yaw, float pitch, float roll, float x, float y, float z){angle += 0.01f;device.Transform.World = Matrix.RotationYawPitchRoll(yaw, pitch, roll) * Matrix.Translation(x, y, z);for (int i = 0; i < meshMaterials.Length; ++i){//设置材质device.Material = meshMaterials[i];//设置纹理device.SetTexture(0, meshTextures[i]);//绘制mesh.DrawSubset(i);}}

最后还差一个摄影灯光的设置了,这个用于灯光的角度:

        //设置摄像头private void SetupCamera(){//(float)Math.PI/12设置对象大小device.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI / 12, this.Width / this.Height, 0.80f, 10000.0f);device.Transform.View = Matrix.LookAtLH(new Vector3(-400, -100, 600.0f), new Vector3(), new Vector3(0, 1, 0));device.RenderState.Ambient = Color.Black;device.Lights[0].Type = LightType.Directional;device.Lights[0].Diffuse = Color.AntiqueWhite;device.Lights[0].Direction = new Vector3(0, 1, 0);device.Lights[0].Update();device.Lights[0].Enabled = true;}

至此,基本大功告成,最后的是逐步调用这几个函数,然后显示出来,我采用panel这个控件绘画的时候调用这些函数,如下:

        //panelPaint是我自己起的名字,对应的事件是Paintprivate void panelPaint(object sender, PaintEventArgs e){InitializeGraphics();device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.SkyBlue, 1.0f, 1);SetupCamera();device.Present();device.BeginScene();// Draw our MeshDrawMesh(angle / (float)Math.PI, angle / (float)Math.PI * 2.0f, angle / (float)Math.PI / 4.0f, 0.0f, 0.0f, 0.0f);device.EndScene();//Render();device.Present();// this.Invalidate();}

最后贴出来一个效果图:


至此,基本大功告成。不过这里还有几个问题要说明:

1.程序编译过程中或许会遇到一个问题:

混合模式程序集是针对“v1.1.4322”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。

这个问题解决办法就是打开文件中的app.config文件,注释掉原来的内容,改成以下内容:

<span style="font-size:14px;"><span style="font-family:'Microsoft YaHei';"><?xml version="1.0"?>
<configuration><startup useLegacyV2RuntimeActivationPolicy="true"><supportedRuntime version="v4.0"/></startup>
</configuration></span></span>

程序应该就不会有问题了。

2.如果你自己在导入自己的3D模型的时候,采用3dsmax中导入的panda控件转换模型文件为.x文件的时候,有个选项,就是XFileSetting的设置一定要设置为Binary,如果设置为Text的话,Directx在读入文件的时候会不识别。截图如下:

能遇到的问题基本就这些了,这里附上源代码链接:

http://download.csdn.net/detail/t46414704152abc/8709251

恩,基本就这样了!希望能帮助到大家!

c#开发环境下用Directx载入3D模型相关推荐

  1. spark最新源码下载并导入到开发环境下助推高质量代码(Scala IDEA for Eclipse和IntelliJ IDEA皆适用)(以spark2.2.0源码包为例)(图文详解)...

    不多说,直接上干货! 前言   其实啊,无论你是初学者还是具备了有一定spark编程经验,都需要对spark源码足够重视起来. 本人,肺腑之己见,想要成为大数据的大牛和顶尖专家,多结合源码和操练编程. ...

  2. Myeclipse开发环境下文件中出现的提示错误与解决方法:The import javax.servlet cannot be resolved?

    Myeclipse开发环境下文件中出现的提示错误与解决方法:The import javax.servlet cannot be resolved? 参考文章: (1)Myeclipse开发环境下文件 ...

  3. 解决thinkphp在开发环境下文件模块找不到的问题

    win10系统下,phpstudy开发环境下小问题描述: 找不到public公共模块. Not Found The requested URL /public/admin/login.html was ...

  4. 在win7系统 Keil 开发环境下 Jlink 仿真器连不上解决办法

    Keil 开发环境下 Jlink仿真器,在win7系统下,仿真器连不上解决办法 进入设备管理器,发现黄色问号,即windows不识别设备,分别右键点击属性,更新驱动程序.在安装keil目录下自动查找, ...

  5. 基于node.js开发环境下创建及开发vue.js项目的环境配置骤

    基于node.js开发环境下创建开发vue.js项目的环境配置骤如下: 步骤一:安装node.js,安装完后运行node -v命令检安装node的查版本,判断是否安装成功.Npm是node.js包管理 ...

  6. Laravel本地Sail开发环境下Phpstorm+浏览器+Postman调试配置

    Laravel本地Sail开发环境下Phpstorm+浏览器+Postman调试配置 查看Php是否启用Xdebug 配置Sail对Xdebug的支持 浏览器如何进行XDebug调试 下载浏览器扩展 ...

  7. 痞子衡嵌入式:在MDK开发环境下将关键函数重定向到RAM中执行的几种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在MDK开发环境下将关键函数重定向到RAM中执行的几种方法. 这个关键函数重定向到 RAM 中执行系列文章,痞子衡已经写过 <IA ...

  8. 痞子衡嵌入式:在IAR开发环境下将关键函数重定向到RAM中执行的三种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将关键函数重定向到RAM中执行的三种方法. 嵌入式项目里应用程序代码正常是放在 Flash 中执行的,但有时候也需要将 ...

  9. 痞子衡嵌入式:在IAR开发环境下将整个源文件代码重定向到任意RAM中的方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将整个源文件代码重定向到任意RAM中的方法. 痞子衡旧文 <在IAR下将关键函数重定向到RAM中执行的方法> ...

  10. 开发环境下PP文件的创建

    开发环境下Provisioning Profile文件的创建. 当我们在做iOS开发的时候,总是添加很多证书,来保证安全性.Provisioning Profile我们又称PP文件.这个文件将证书.A ...

最新文章

  1. 命名空间“Microsoft.AspNet”中不存在类型或命名空间名“Mvc”
  2. 前端开发-热更新原理解读
  3. Ubuntu18.04换源更新国内源
  4. 7-4 统计Java程序中关键词的出现次数 (25 分)
  5. 第十一节课 课堂总结
  6. java面向对象上机题库_Java面向对象编程上机-练习题汇总
  7. 计算机算法设计与分析 循环赛日程表
  8. Firefox历史版本下载
  9. 10.5~10.6复习与预习的进行
  10. 图像匹配之归一化积相关灰度匹配
  11. 《信息系统项目管理师教程》目录
  12. 安全控件开发原理分析 支付宝安全控件开发 网银密码控件 C++
  13. 双目测距 SGBM算法 Python版
  14. uni-App 商品详情轮播图
  15. 在Linux命令行中操作PDF
  16. 2023牛寒5--小沙の赌气
  17. 小型微型计算机系统加急,小型微型计算机系统杂志
  18. 成本低廉的深度学习与渲染显卡购买方案--英伟达矿卡P106
  19. chrome android版 插件下载,Chrome安卓下载
  20. 【通关MySQL】MySQL增删改查(CRUD)详解

热门文章

  1. CAD教程:如何将Excel数据快速导入CAD图纸
  2. 【音频】G711编码原理
  3. Swagger注解使用示例
  4. 在Android Studio 中使用Assets资源文件
  5. 西门子em235模块的功能_与其研究人工智能不如研究可编程控制器之德国西门子PLCS7200...
  6. 浪潮服务器管理口地址linux系统,浪潮服务器管理口BMC通用设置
  7. 联想计算机电源风扇怎样清理,电脑怎么清灰加硅脂 联想笔记本清灰换硅脂图文教程...
  8. 通过python操作GeoLite2-City.mmdb库将nginx日志访问IP转换为城市写入数据库
  9. 【sketchup 2021】草图大师的场景优化工具2【草图大师动态组件的详细使用说明和各个函数说明】【重要】
  10. C语言编程题必须运行吗,全国计算机二级c语言的的操作题一定要运行吗?