WinForm显示3D图(Sharpgl)
生活随笔
收集整理的這篇文章主要介紹了
WinForm显示3D图(Sharpgl)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
總述
Sharpgl是.NET平臺的Opengl,可以用來繪畫、展示3D圖,本文將介紹如何顯示SOlidWorks等軟件制作的3D模型。
安裝Sharpgl
下載SharpGL.vsix文件并點擊安裝,VS中就會有相應的項目出現了,之后創建工程時選擇這個項目建立即可。
解析模型
在網上不難找到個人寫的3DS解析庫,直接使用即可。一般這些解析庫針對的是3ds或者obj文件,對于SolidWorks創建的模型就需要一些轉換工作了。
解析器代碼
using System; using System.Collections.Generic; using System.Linq; using System.Text; using SharpGL; using System.IO; using System.Collections;namespace _3D繪圖 {class read_obj{public class POINT3{public double X;public double Y;public double Z;};public class WenLi{public double TU;public double TV;};public class FaXiangLiang{public double NX;public double NY;public double NZ;};public class Mian{public int[] V = new int[3];public int[] T = new int[3];public int[] N = new int[3];};public class Model{public List<POINT3> V = new List<POINT3>();//V:代表頂點。格式為V X Y Z,V后面的X Y Z表示三個頂點坐標。浮點型public List<WenLi> VT = new List<WenLi>();//表示紋理坐標。格式為VT TU TV。浮點型public List<FaXiangLiang> VN = new List<FaXiangLiang>();//VN:法向量。每個三角形的三個頂點都要指定一個法向量。格式為VN NX NY NZ。浮點型public List<Mian> F = new List<Mian>();//F:面。面后面跟著的整型值分別是屬于這個面的頂點、紋理坐標、法向量的索引。//面的格式為:f Vertex1/Texture1/Normal1 Vertex2/Texture2/Normal2 Vertex3/Texture3/Normal3}public Model mesh = new Model();public float movX;public float movY;public float movZ;public float xRotate;public float yRotate;public float x;public float y;//放縮參數public static float scale;//顯示列表public uint showFaceList;public int YU = 1;public void loadFile(String fileName){// Mian[] f;//POINT3[] v;//FaXiangLiang[] vn;//WenLi[] vt;StreamReader objReader = new StreamReader(fileName);ArrayList al = new ArrayList();string texLineTem = "";while (objReader.Peek() != -1){texLineTem = objReader.ReadLine();if (texLineTem.Length < 2) continue;if (texLineTem.IndexOf("v") == 0){if (texLineTem.IndexOf("t") == 1)//vt 0.581151 0.979929 紋理{string[] tempArray = texLineTem.Split(' ');WenLi vt = new WenLi();vt.TU = double.Parse(tempArray[1]);vt.TV = double.Parse(tempArray[2]);mesh.VT.Add(vt);}else if (texLineTem.IndexOf("n") == 1)//vn 0.637005 -0.0421857 0.769705 法向量{string[] tempArray = texLineTem.Split(new char[] { '/', ' ' }, System.StringSplitOptions.RemoveEmptyEntries);FaXiangLiang vn = new FaXiangLiang();vn.NX = double.Parse(tempArray[1]);vn.NY = double.Parse(tempArray[2]);if (tempArray[3] == "\\"){texLineTem = objReader.ReadLine();vn.NZ = double.Parse(texLineTem);}else vn.NZ = double.Parse(tempArray[3]);mesh.VN.Add(vn);}else{//v -53.0413 158.84 -135.806 點string[] tempArray = texLineTem.Split(' ');POINT3 v = new POINT3();v.X = double.Parse(tempArray[1]);v.Y = double.Parse(tempArray[2]);v.Z = double.Parse(tempArray[3]);mesh.V.Add(v);}}else if (texLineTem.IndexOf("f") == 0){//f 2443//2656 2442//2656 2444//2656 面string[] tempArray = texLineTem.Split(new char[] { '/', ' ' }, System.StringSplitOptions.RemoveEmptyEntries);Mian f = new Mian();int i = 0;int k = 1;while (i < 3){if (mesh.V.Count() != 0){f.V[i] = int.Parse(tempArray[k]) - 1;k++;}if (mesh.VT.Count() != 0){f.T[i] = int.Parse(tempArray[k]) - 1;k++;}if (mesh.VN.Count() != 0){f.N[i] = int.Parse(tempArray[k]) - 1;k++;}i++;}mesh.F.Add(f);}}}public uint createListFace(ref SharpGL.OpenGL gl){gl.NewList(showFaceList, OpenGL.GL_COMPILE);if (mesh.V.Count() == 0) return 119;for (int i = 0; i < mesh.F.Count(); i++){gl.Begin(OpenGL.GL_TRIANGLES); // 繪制三角形if (mesh.VT.Count() != 0) gl.TexCoord(mesh.VT[mesh.F[i].T[0]].TU, mesh.VT[mesh.F[i].T[0]].TV); //紋理 if (mesh.VN.Count() != 0) gl.Normal(mesh.VN[mesh.F[i].N[0]].NX, mesh.VN[mesh.F[i].N[0]].NY, mesh.VN[mesh.F[i].N[0]].NZ);//法向量gl.Vertex(mesh.V[mesh.F[i].V[0]].X / YU, mesh.V[mesh.F[i].V[0]].Y / YU, mesh.V[mesh.F[i].V[0]].Z / YU); // 上頂點if (mesh.VT.Count() != 0) gl.TexCoord(mesh.VT[mesh.F[i].T[1]].TU, mesh.VT[mesh.F[i].T[1]].TV); //紋理if (mesh.VN.Count() != 0) gl.Normal(mesh.VN[mesh.F[i].N[1]].NX, mesh.VN[mesh.F[i].N[1]].NY, mesh.VN[mesh.F[i].N[1]].NZ);//法向量gl.Vertex(mesh.V[mesh.F[i].V[1]].X / YU, mesh.V[mesh.F[i].V[1]].Y / YU, mesh.V[mesh.F[i].V[1]].Z / YU); // 左下if (mesh.VT.Count() != 0) gl.TexCoord(mesh.VT[mesh.F[i].T[2]].TU, mesh.VT[mesh.F[i].T[2]].TV); //紋理if (mesh.VN.Count() != 0) gl.Normal(mesh.VN[mesh.F[i].N[2]].NX, mesh.VN[mesh.F[i].N[2]].NY, mesh.VN[mesh.F[i].N[2]].NZ);//法向量gl.Vertex(mesh.V[mesh.F[i].V[2]].X / YU, mesh.V[mesh.F[i].V[2]].Y / YU, mesh.V[mesh.F[i].V[2]].Z / YU); // 右下gl.End(); // 三角形繪制結束 }gl.EndList();return showFaceList;}} }整個資料下載
關注微信公眾號,發送 sharpgl
總結
以上是生活随笔為你收集整理的WinForm显示3D图(Sharpgl)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ipv6格式介绍和地址数量计算
- 下一篇: 层次聚类算法的原理及实现Hierarch