C#使用DirectX SDK 加载.x三维模型

这篇具有很好参考价值的文章主要介绍了C#使用DirectX SDK 加载.x三维模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近因为项目要做显示一个三维模型,所以研究了下如何在Winform中加载并显示三维模型。在Windows平台巨硬公司提供了DirectX SDK用于渲染图形,参考了几篇文章做了个demo记录下,以便日后温习只用。这个SDK涉及到了计算机图形学的一些基础知识,需要掌握一点基础,推荐可以看看OpenGL初学手册。

创建项目

我们开始返回正题,首先使用Visual Studio 2019创建一个Winform项目,然后添加DirectX 三个dll库的引用,路径是:C:\Windows\Microsoft.NET\DirectX for Managed Code\1.0.2902.0, 主要是前3个dll,后面的可用可不用。

C#使用DirectX SDK 加载.x三维模型,microsoft,c#

添加控件

通过工具箱添加timer和panel控件,panel用于显示三位模型(也可不添加这个,直接用form显示),timer用于实时渲染。C#使用DirectX SDK 加载.x三维模型,microsoft,c#

 代码实现
/*--------成员变量声明-----------*/
//设备
private Device device;
//显示参数
private PresentParameters pres;
//保存3D文件
private Mesh mesh;
//渲染材质
private Material[] materials;
private Texture[] textures;


/*--------方法实现-----------*/
public bool InitializeGraphics()
{
    pres = new PresentParameters();
    pres.Windowed = true;
    pres.SwapEffect = SwapEffect.Discard;
    pres.EnableAutoDepthStencil = true;
    pres.AutoDepthStencilFormat = DepthFormat.D16;
    device = new Device(0, DeviceType.Hardware, panel1, CreateFlags.SoftwareVertexProcessing,
      pres);
    device.RenderState.CullMode = Cull.None;
    CreateMesh(@"airplane 2.x");
    //CreateMesh(@"lobby_skybox.x");
    return true;
}
public void CreateMesh(string path)
{
    ExtendedMaterial[] exMaterials;
    mesh = Mesh.FromFile(path, MeshFlags.SystemMemory, device, out exMaterials);
    if (textures != null)
    {
        DisposeTextures();
    }
    textures = new Texture[exMaterials.Length];
    materials = new Material[exMaterials.Length];
    for (int i = 0; i< exMaterials.Length; ++i)
    {
        if (exMaterials[i].TextureFilename != null)
        {
            string texturePath = Path.Combine(Path.GetDirectoryName(path), exMaterials[i].TextureFilename);
            textures[i] = TextureLoader.FromFile(device, texturePath);
        }
        materials[i] = exMaterials[i].Material3D;
        materials[i].Ambient = materials[i].Diffuse;
    }
}
public void DisposeTextures()
{
    if (textures == null)
    {
        return;
    }
    foreach (Texture t in textures)
    {
        if (t != null)
        {
            t.Dispose();
        }
    }
}

public void SetupMatrices()
{
    float yaw = Environment.TickCount / 500.0F;
    float pitch = Environment.TickCount / 500.0F;
    device.Transform.World = Matrix.RotationYawPitchRoll(yaw, pitch, 0);
    device.Transform.View = Matrix.LookAtLH(new Vector3(0, 0, -6), new Vector3(0, 0, 0), new Vector3(0, 1, 0));
    device.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI / 2.0F, 1.0F, 1.0F, 10.0F);
}

public void SetupLights()
{
    device.RenderState.Lighting = true;
    device.Lights[0].Diffuse = Color.White;
    device.Lights[0].Specular = Color.White;
    device.Lights[0].Type = LightType.Directional;
    device.Lights[0].Direction = new Vector3(-1, -1, 3);
    device.Lights[0].Enabled = true;
    device.RenderState.Ambient = Color.FromArgb(0x00, 0x00, 0x00);
}

public void RenderMesh()
{
    for (int i = 0; i< materials.Length; ++i)
    {
        if (textures[i] != null)
        {
            device.SetTexture(0, textures[i]);
        }
        device.Material = materials[i];
        mesh.DrawSubset(i);
    }
}

public void Render()
{
    device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.SkyBlue, 1.0F, 0);
    device.BeginScene();
    SetupMatrices();
    SetupLights();
    RenderMesh();
    device.EndScene();
    device.Present();
}

public void DisposeGraphics()
{
    DisposeTextures();
    device.Dispose();
}
渲染实现

在Form1_Load事件中调用初始化函数,然后在timer的timer1_Tick事件中调用Render函数实时渲染

private void Form1_Load(object sender, EventArgs e)
{
    InitializeGraphics();
}

private void timer1_Tick(object sender, EventArgs e)
{
    Render();
}

 编译程序,编译之前设置32位模式,需要自己新建一个32位的编译模式

C#使用DirectX SDK 加载.x三维模型,microsoft,c#

准备素材

需要安装为微软的DirectX SDK,链接: https://www.microsoft.com/zh-cn/download/details.aspx?id=6812

到这个路径下C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Samples\Media\Airplane复制三个资源文件到本地的的exe文件目录 RobotSimulator\DirectX3D\bin\x86\Debug

C#使用DirectX SDK 加载.x三维模型,microsoft,c#

运行程序

C#使用DirectX SDK 加载.x三维模型,microsoft,c#

PS:

 如遇“托管调试助手 “LoaderLock”报错“Message=托管调试助手 “LoaderLock”:“正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。””,可以快捷键Ctrl+Alt+E,改动Managed Debuggin Assistants->LoaderLock 的选中状态去掉。文章来源地址https://www.toymoban.com/news/detail-731809.html

到了这里,关于C#使用DirectX SDK 加载.x三维模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • cesium加载三维模型3dtiles

    目的:为避免跨域 输入cmd命令 python3 -m http.server 5500 http://127.0.0.1:5500/data/mars3d-max-shihua-3dtiles-master/tileset.json http://127.0.0.1:5500/cesium/cesium%E5%8A%A0%E8%BD%BD3dtile2.html

    2024年02月13日
    浏览(75)
  • Three.js之加载外部三维模型

    建模软件绘制3D场景 … 加载.gltf文件(模型加载全流程) 注:基于Three.js v0.155.0 三维建模软件 gltf格式 加载.gltf文件 OrbitControls辅助设置相机参数:相机位置、相机目标对象 gltf不同文件形式(.glb) 模型命名(程序与美术协作): .getObjectByName() 递归遍历层级模型修改材质: .traverse

    2024年02月05日
    浏览(40)
  • 三维GIS开发:利用Cesium加载 M3D 地质体模型(附代码)

    实现步骤 Step 1.  引用开发库 : 本示例引用 local 本地【include-cesium-local.js】开发库,完成此步骤后才可调用三维 WebGL 的功能; Step 2.  创建布局 : 创建 id=\\\'GlobeView\\\' 的 div 作为三维视图的容器,并设置其样式; Step 3.  构造三维场景控件 : 实例化 Cesium.WebSceneControl 对象,完成

    2024年02月10日
    浏览(40)
  • 虚拟现实项目笔记:SDK、Assimp、DirectX Sample Browser、X86和X64

    SDK是Software Development Kit的英文缩写,意思是软件开发包。 软件开发包中往往包含有多种辅助进行软件开发的内容,包括一些软件开发工具、文档说明、库和示例代码。这些内容能够帮助使用SDK进行软件开发的人员更好地开发程序。 SDK的作用就是简化软件开发过程并对特定的

    2024年02月08日
    浏览(37)
  • DirectX3D 虚拟现实项目 三维物体的光照及着色(五个不同着色效果的旋转茶壶)

    本篇文章是中国农业大学虚拟现实课程的一次作业内容,需要对五个茶壶模型使用不同的光照进行着色和渲染,然后旋转展示。 本人的代码也是在其他人的代码的基础上修改来的,主要用于服务下一届,没有商业用途,侵删。 代码包括CPP文件代码和FX(着色器文件)代码两部

    2024年02月05日
    浏览(50)
  • Java sdk使用加载账户私钥调用合约

    1.2 智能合约的流程 1.2 智能合约详细代码 实现了一个简单的商店功能。它定义了三个结构体:用户、商家和商品,以及对应的映射关系。它提供了一些方法用于注册用户和商家,创建商品,更新用户余额,购买商品等等。它还包括一些修饰符,用于限制只有用户或商家可以调

    2023年04月16日
    浏览(37)
  • C# winform加载yolov8模型测试(附例程)

    第一步:在NuGet中下载Yolov8.Net   第二步:引用  using Yolov8Net; 第三步:加载模型 private IPredictor yolov8 = YoloV8Predictor.Create(\\\"D:\\\\0MyWork\\\\Learn\\\\vs2022\\\\yolov_onnx\\\\best.onnx\\\", mylabel); 第四步:图像预测 var predictions = yolov8.Predict(\\\"D:\\\\MyComputer\\\\Pictures\\\\14.jpg\\\");  预测结果: 完整例程: 链接:ht

    2024年02月11日
    浏览(34)
  • Pix4Dmapper系列教程(一):Pix4D模型成果导出OSGB并加载到CASS3D进行三维测图

    随着无人机航飞的推广,数据处理成为问题根源。3D模型使用一直困扰着一众测绘人员,虽有部分使用CC(原Smart3D)进行模型生成,但是PIX4D使用用户确一直受到模型无法加载到CASS 3D中应用问题困扰,此文彻底解决此问题。 在垂直摄影中,Pix4D也可以生成漂亮的三维模型,Pix4D生

    2024年02月06日
    浏览(263)
  • C# 阿里云短信接口调用(不使用SDK,单文件完成)

    虽然阿里云短信接口,提供了很多种语言的SKD,但是对应C#而言,如果使用阿里云SDK,你的项目中需要引入一大堆的dll,像这样: 我只需要发个短信,没必要引入这么多dll吧。于是,根据阿里云官方文档,接口SDK源码,自己整理封装了一个类,完成发短信的操作。闲话不多说

    2024年02月12日
    浏览(39)
  • C# Microsoft.ClearScript.V8脚本使用

    微软的.net是非常强大和灵活的,除了C#体系脚本扩展,也支持其他流行的脚本扩展,Microsoft.ClearScript.V8就是一个.NET绑定到Google V8的脚本引擎。它允许.NET应用程序直接从JavaScript代码中调用函数,并返回JavaScript类型。ClearScript.V8可以使用各种JavaScript库(比如jQuery)来提高工作效

    2024年02月08日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包