专业实训9.4

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了专业实训9.4相关的知识,希望对你有一定的参考价值。

上次开发结束,开发到在窗体中天剑一个Panel控件,使得3d的效果图像在Panel中显示,今天我们继续向后面开发。

完成功能:简单载入3d模型

1.添加初始化图形设备

            PresentParameters presentParams = new PresentParameters();//设置变量

设置其在窗口模式下运行,并将交换效果为Discard;创建设备。

2.导入3d模型函数

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;
            }
        }

 设置摄像头

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(0, 0, 630.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;

        }

 绘制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);
            }
        }

 最后在窗体界面中双击panel控件,加载private void panel1Paint(object sender, PaintEventArgs e)函数

private 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 Mesh
            DrawMesh(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();
        }

 付上源代码及程序:

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D; 

namespace _3dmodel
{
    public partial class Form1 : 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

        public Form1()
        {
            InitializeComponent();//asp.net自带且自动执行的初始化工作
        }

        //初始化图形设备
        public void InitializeGraphics()
        {
            //设置变量
            PresentParameters presentParams = new PresentParameters();
            //设置在窗口模式下运行
            presentParams.Windowed = true;
            //设置交换效果为Discard
            presentParams.SwapEffect = SwapEffect.Discard;
            presentParams.AutoDepthStencilFormat = DepthFormat.D16;
            presentParams.EnableAutoDepthStencil = true;
            //创建设备
            
            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);
        }
        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;
            }
        }
        //设置摄像头
        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(0, 0, 630.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;

        }
        //绘制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 Render()
        {
            if (device == null)
                return;
            device.Clear(ClearFlags.Target, System.Drawing.Color.Black, 1.0f, 0);
            SetupCamera();
            device.BeginScene();
            Material boxMaterial = new Material();
            boxMaterial.Ambient = Color.Pink;
            boxMaterial.Diffuse = Color.White;
            device.Material = boxMaterial;
            device.Transform.World = Matrix.Translation(0, 50, 0);
            device.Transform.World = Matrix.Identity;
            mesh.DrawSubset(0);
            device.EndScene();
            device.Present();
          
        }
        
  
        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            InitializeGraphics();
            device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.SkyBlue, 1.0f, 1);
            SetupCamera();
            device.Present();
            device.BeginScene();
            // Draw our Mesh
            DrawMesh(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();
        }
    }
}

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

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

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

<?xml version="1.0"?>
<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>

 

以上是关于专业实训9.4的主要内容,如果未能解决你的问题,请参考以下文章

专业实训9.5

大学计算机相关专业实验实训整理

大学计算机相关专业实验实训整理

大学计算机相关专业实验实训整理

专业实训9.7

专业实训日志02