Скачать 0.6 Mb.
|
class Material using System; using Tao.OpenGl; namespace Самолет { public class Material { public float[] Ambient = new float [] { 0.5f, 0.5f, 0.5f }; public float[] Diffuse = new float [] { 0.5f, 0.5f, 0.5f }; public float[] Specular = new float [] { 0.5f, 0.5f, 0.5f }; public int Shininess = 50; int textureid = -1; public int TextureId { get { return textureid; } } public void BindTexture ( int width, int height, IntPtr data ) { Gl.glEnable( Gl.GL_TEXTURE_2D ); int[] textures = new int [1]; Gl.glGenTextures(1, textures); textureid = textures[0]; Gl.glBindTexture( Gl.GL_TEXTURE_2D, textureid ); Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR); Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR_MIPMAP_NEAREST); Gl.glTexEnvf(Gl.GL_TEXTURE_ENV, Gl.GL_TEXTURE_ENV_MODE, Gl.GL_MODULATE); Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA8, width, height, 0, Gl.GL_BGRA_EXT, Gl.GL_UNSIGNED_BYTE, data ); Glu.gluBuild2DMipmaps( Gl.GL_TEXTURE_2D, 4, width, height, Gl.GL_BGRA_EXT, Gl.GL_UNSIGNED_BYTE, data ); Gl.glDisable( Gl.GL_TEXTURE_2D ); } } } class Model using System; using System.Collections.Generic; namespace Самолет { public class Model : IRenderable { public List public void Render () { foreach ( Entity e in Entities ) e.Render (); } } } class ThreeDSFile using System; using System.IO; using System.Text; using System.Collections.Generic; using System.Drawing; namespace Самолет { public class ThreeDSFile { #region classes public class ThreeDSChunk { public ushort ID; public uint Length; public int BytesRead; public ThreeDSChunk ( BinaryReader reader ) { // 2 byte ID ID = reader.ReadUInt16(); // 4 byte length Length = reader.ReadUInt32 (); // = 6 BytesRead = 6; } } #endregion #region Enums enum Groups { C_PRIMARY = 0x4D4D, C_OBJECTINFO = 0x3D3D, C_VERSION = 0x0002, C_EDITKEYFRAME = 0xB000, C_MATERIAL = 0xAFFF, C_MATNAME = 0xA000, C_MATAMBIENT = 0xA010, C_MATDIFFUSE = 0xA020, C_MATSPECULAR = 0xA030, C_MATSHININESS = 0xA040, C_MATMAP = 0xA200, C_MATMAPFILE = 0xA300, C_OBJECT = 0x4000, C_OBJECT_MESH = 0x4100, C_OBJECT_VERTICES = 0x4110, C_OBJECT_FACES = 0x4120, C_OBJECT_MATERIAL = 0x4130, C_OBJECT_UV = 0x4140 } #endregion #region Vars Dictionary < string, Material > materials = new Dictionary < string, Material > (); string base_dir; BinaryReader reader; double maxX, maxY, maxZ, minX, minY, minZ; int version = -1; #endregion #region public properties Model model = new Model (); public Model Model { get { return model; } } public int Version { get { return version; } } public double MaxX { get { return maxX; } } public double MaxY { get { return maxY; } } public double MaxZ { get { return maxZ; } } public double MinX { get { return minX; } } public double MinY { get { return minY; } } public double MinZ { get { return minZ; } } #endregion #region Constructors public ThreeDSFile ( string file_name ) { if (string.IsNullOrEmpty(file_name)) { throw new ArgumentNullException("file_name"); } if (!File.Exists(file_name)) { throw new ArgumentException("3ds file could not be found", "file_name"); } base_dir = new FileInfo ( file_name ).DirectoryName + "/"; maxX = maxY = maxZ = double.MinValue; minX = minY = minZ = double.MaxValue; FileStream file = null; try { file = new FileStream(file_name, FileMode.Open, FileAccess.Read); reader = new BinaryReader ( file ); reader.BaseStream.Seek (0, SeekOrigin.Begin); ThreeDSChunk chunk = new ThreeDSChunk ( reader ); if ( chunk.ID != (short) Groups.C_PRIMARY ) { throw new FormatException ( "Not a proper 3DS file." ); } ProcessChunk ( chunk ); } finally { if (reader != null) reader.Close (); if (file != null) file.Close (); } } #endregion #region Helper methods void ProcessChunk ( ThreeDSChunk chunk ) { while ( chunk.BytesRead < chunk.Length ) { ThreeDSChunk child = new ThreeDSChunk ( reader ); switch ((Groups) child.ID) { case Groups.C_VERSION: version = reader.ReadInt32 (); child.BytesRead += 4; break; case Groups.C_OBJECTINFO: break; case Groups.C_MATERIAL: ProcessMaterialChunk ( child ); break; case Groups.C_OBJECT: ProcessString ( child ); Entity e = ProcessObjectChunk ( child ); e.CalculateNormals (); model.Entities.Add ( e ); break; default: SkipChunk ( child ); break; } chunk.BytesRead += child.BytesRead; } } void ProcessMaterialChunk ( ThreeDSChunk chunk ) { string name = string.Empty; Material m = new Material (); while ( chunk.BytesRead < chunk.Length ) { ThreeDSChunk child = new ThreeDSChunk ( reader ); switch ((Groups) child.ID) { case Groups.C_MATNAME: name = ProcessString ( child ); break; case Groups.C_MATAMBIENT: m.Ambient = ProcessColorChunk ( child ); break; case Groups.C_MATDIFFUSE: m.Diffuse = ProcessColorChunk ( child ); break; case Groups.C_MATSPECULAR: m.Specular = ProcessColorChunk ( child ); break; case Groups.C_MATSHININESS: m.Shininess = ProcessPercentageChunk ( child ); break; case Groups.C_MATMAP: ProcessPercentageChunk ( child ); ProcessTexMapChunk ( child , m ); break; default: SkipChunk ( child ); break; } chunk.BytesRead += child.BytesRead; } materials.Add ( name, m ); } void ProcessTexMapChunk ( ThreeDSChunk chunk, Material m ) { while ( chunk.BytesRead < chunk.Length ) { ThreeDSChunk child = new ThreeDSChunk ( reader ); switch ((Groups) child.ID) { case Groups.C_MATMAPFILE: string name = ProcessString ( child ); Bitmap bmp; try { bmp = new Bitmap ( base_dir + name ); } catch ( Exception ex ) { Console.WriteLine ( " ERROR: could not load file '{0}': {1}", base_dir + name, ex.Message ); break; } bmp.RotateFlip(RotateFlipType.RotateNoneFlipY); System.Drawing.Imaging.BitmapData imgData = bmp.LockBits ( new Rectangle(new Point(0, 0), bmp.Size), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); m.BindTexture ( imgData.Width, imgData.Height, imgData.Scan0 ); bmp.UnlockBits(imgData); bmp.Dispose(); break; default: SkipChunk ( child ); break; } chunk.BytesRead += child.BytesRead; } } float[] ProcessColorChunk ( ThreeDSChunk chunk ) { ThreeDSChunk child = new ThreeDSChunk ( reader ); float[] c = new float[] { (float) reader.ReadByte() / 256 , (float) reader.ReadByte() / 256 , (float) reader.ReadByte() / 256 }; chunk.BytesRead += (int) child.Length; return c; } int ProcessPercentageChunk ( ThreeDSChunk chunk ) { ThreeDSChunk child = new ThreeDSChunk ( reader ); int per = reader.ReadUInt16 (); child.BytesRead += 2; chunk.BytesRead += child.BytesRead; return per; } Entity ProcessObjectChunk ( ThreeDSChunk chunk ) { return ProcessObjectChunk ( chunk, new Entity() ); } Entity ProcessObjectChunk ( ThreeDSChunk chunk, Entity e ) { while ( chunk.BytesRead < chunk.Length ) { ThreeDSChunk child = new ThreeDSChunk ( reader ); switch ((Groups) child.ID) { case Groups.C_OBJECT_MESH: ProcessObjectChunk ( child , e ); break; case Groups.C_OBJECT_VERTICES: e.vertices = ReadVertices ( child ); break; case Groups.C_OBJECT_FACES: e.indices = ReadIndices ( child ); if ( child.BytesRead < child.Length ) ProcessObjectChunk ( child, e ); break; case Groups.C_OBJECT_MATERIAL: string name2 = ProcessString ( child ); Material mat; if ( materials.TryGetValue ( name2, out mat ) ) { MaterialFaces m = new MaterialFaces(); m.Material = mat; int nfaces = reader.ReadUInt16 (); child.BytesRead += 2; m.Faces = new UInt16[nfaces]; for ( int ii=0; ii { m.Faces[ii] = reader.ReadUInt16 (); child.BytesRead += 2; } e.MaterialFaces.Add(m); } else { SkipChunk ( child ); } break; case Groups.C_OBJECT_UV: int cnt = reader.ReadUInt16 (); child.BytesRead += 2; e.texcoords = new TexCoord [ cnt ]; for ( int ii=0; ii e.texcoords [ii] = new TexCoord ( reader.ReadSingle (), reader.ReadSingle () ); child.BytesRead += ( cnt * ( 4 * 2 ) ); break; default: SkipChunk ( child ); break; } chunk.BytesRead += child.BytesRead; } return e; } void SkipChunk ( ThreeDSChunk chunk ) { int length = (int) chunk.Length - chunk.BytesRead; reader.ReadBytes ( length ); chunk.BytesRead += length; } string ProcessString ( ThreeDSChunk chunk ) { StringBuilder sb = new StringBuilder (); byte b = reader.ReadByte (); int idx = 0; while ( b != 0 ) { sb.Append ( (char) b); b = reader.ReadByte (); idx++; } chunk.BytesRead += idx+1; return sb.ToString(); } Vector[] ReadVertices ( ThreeDSChunk chunk ) { ushort numVerts = reader.ReadUInt16 (); chunk.BytesRead += 2; Vector[] verts = new Vector[numVerts]; for ( int ii=0; ii < verts.Length ; ii++ ) { float f1 = reader.ReadSingle(); float f2 = reader.ReadSingle(); float f3 = reader.ReadSingle(); Vector v = new Vector ( f1, f3, -f2 ); if (v.X > maxX) maxX = v.X; if (v.Y > maxY) maxY = v.Y; if (v.Z > maxZ) maxZ = v.Z; if (v.X < minX) minX = v.X; if (v.Y < minY) minY = v.Y; if (v.Z < minZ) minZ = v.Z; verts[ii] = v; } chunk.BytesRead += verts.Length * ( 3 * 4 ) ; return verts; } Triangle[] ReadIndices ( ThreeDSChunk chunk ) { ushort numIdcs = reader.ReadUInt16 (); chunk.BytesRead += 2; Triangle[] idcs = new Triangle[numIdcs]; for ( int ii=0; ii < idcs.Length ; ii++ ) { idcs [ii] = new Triangle ( reader.ReadUInt16(), reader.ReadUInt16(), reader.ReadUInt16() ); reader.ReadUInt16 (); } chunk.BytesRead += ( 2 * 4 ) * idcs.Length; return idcs; } #endregion } } class Particle using System; using System.Collections.Generic; using System.Collections; using System.Text; namespace Самолет { class Particle { private float angle; private float radius; private float [] position_emmit = new float[3]; public CVertex3f[] points; public int index; public int maxIndex; private Random rnd; private static float RADIUS_BOOM = 600.0f; float x, y,z; private CalcBurst burst; public Particle(float x_, float y_, float z_, CalcBurst burst_, Random rnd_) { position_emmit[0] = x_; position_emmit[1] = y_; position_emmit[2] = z_; burst = burst_; rnd = rnd_; index = 0; angle = 6.2831852f * (float)rnd.NextDouble(); radius = 5.0f + (RADIUS_BOOM - 5.0f) * (float)rnd.NextDouble(); x = radius * (float)Math.Cos(angle) + position_emmit[0]; z = radius * (float)Math.Sin(angle) + position_emmit[2]; y = 600 + 400 * (float)rnd.NextDouble() + position_emmit[1]; } public void Calculate() { List float deltaTime = 0.50f; Boolean flag = true; while (flag) { CVertex3f temp = new CVertex3f(); burst.VV(x, y, z); if (burst.Len < 1 || Math.Sqrt(Math.Pow(position_emmit[0] - x, 2) + Math.Pow(position_emmit[2] - z, 2)) > 2000|| list.Count > 700) // Math.Abs(y) + Math.Abs(z) + Math.Abs(x) < 2 || { flag = false; } else { x = x + burst.Wx * deltaTime; y = y + burst.Wy * deltaTime; z = z + burst.Wz * deltaTime; temp.x = x; temp.y = y; temp.z = z; list.Add(temp); } } points = list.ToArray(); maxIndex = points.GetLength(0); index = rnd.Next(maxIndex); } } } class MainForm using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; //using System.Linq; using System.Text; using System.Windows.Forms; using Tao.OpenGl; using Tao.FreeGlut; using Tao.Platform.Windows; namespace Самолет { public partial class MainForm : Form { private float[] whiteLight = { 0.2f, 0.2f, 0.2f, 1.0f }; private float[] sourceLight = { 0.8f, 1.0f, 0.8f, 1.0f }; private float[] lightPos = { 1.0f, 100.0f, 0.0f, 0.0f }; private float[] grey = { 0.1f, 0.1f, 0.1f, 1.0f}; private Boolean btnchk= true; //true, if movie stop private string fileName ; private string fileModel ; private float theta =45.0f, phi = 45.0f, r = 1000.0f, pogr_v = 0.0f; private float x = 0.0f, y = 90.0f; private int count = 0; private float dAngle = 2.0f; private float t = -40.0f; private float size = 6000.0f; private float[] shadowM = new float[16]; private Boolean canMove = false; private Point p; private LoadData load; private ForXML xml; static ThreeDSFile file; static Model model; private AirCorridor cor; private Deviation dev; private LoadProperty loadProperty; private Property property; private double def_time = -120; private int def_count = 1; private float[] speed = { 0.5f, 1.0f, 2.0f, 4.0f}; private static float WheelSpeed = 1.0f / 15; private Explosion burst ; private float transparency; bool dontCount = true; public MainForm() { InitializeComponent(); ShowDisplay.InitializeContexts(); this.SetDesktopLocation(0, 0); this.ShowDisplay.MouseLeave += new EventHandler(ShowDisplay_MouseLeave); this.ShowDisplay.MouseDown += new MouseEventHandler(ShowDisplay_MouseDown); this.ShowDisplay.MouseUp += new MouseEventHandler(ShowDisplay_MouseUp); this.ShowDisplay.MouseMove += new MouseEventHandler(ShowDisplay_MouseMove); this.ShowDisplay.MouseWheel += new MouseEventHandler(ShowDisplay_MouseWheel); Box1.SelectedIndex=0; comboBox1.SelectedIndex = 3; load = new LoadData(); loadProperty = new LoadProperty(); property = loadProperty.Load(); fileModel = property.modelFile; fileName = property.dataFile; checkBoxParticle.Checked = property.particleState; checkBoxGlide.Checked = property.glideState; checkBoxDev.Checked = property.deviationState; checkBoxPlane.Checked = property.planeState; transparency = property.transparency; Size size = SystemInformation.PrimaryMonitorSize; if ( size.Width != 1366) { this.Width = size.Width; this.Height = size.Height- 30; panel1.Location = new Point(this.Width - 200, panel1.Location.Y);//153; 121 panel3.Location = new Point(this.Width - 200, panel3.Location.Y); this.ShowDisplay.Height = this.Height - 120 - 40-30; this.ShowDisplay.Width = panel1.Location.X; panel2.Location = new Point(0, this.Height - 120-40); //784; 116 } } private void ShowDisplay_MouseLeave(object sender, EventArgs e) { canMove = false; } private void ShowDisplay_MouseDown(object sender, MouseEventArgs e) { canMove = true; p = e.Location; } private void ShowDisplay_MouseUp(object sender, MouseEventArgs e) { canMove = false; } private void ShowDisplay_MouseMove(object sender, MouseEventArgs e) { if (canMove&(xml!=null) ) { float a, b, s; a = (e.X - p.X); b = (e.Y - p.Y); s = (float)Math.Sqrt(a * a + b * b); if (s >= 20) { theta -= dAngle * b / s; if (theta < -180) { theta += 360; } else { if (theta > 180) { theta -= 360; } } if (theta < 0) { phi += dAngle * a / s; } else { phi -= dAngle * a / s; } if (phi > 360) { phi -= 360; } else { if (phi < 0) { phi += 360; } } p = e.Location; Draw(); } } } void ShowDisplay_MouseWheel(object sender, MouseEventArgs e) { if (r + e.Delta * WheelSpeed > 10.0f) { r += e.Delta * WheelSpeed; } if (xml != null) { Draw(); } } private void Form1_Load(object sender, EventArgs e) { float fAspect; Glut.glutInit(); Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH); Gl.glViewport(0, 0, ShowDisplay.Width, ShowDisplay.Height); fAspect = (float)ShowDisplay.Width / (float)ShowDisplay.Height; Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glLoadIdentity(); Glu.gluPerspective(75, Width / Height, 2, 10000); Gl.glMatrixMode(Gl.GL_MODELVIEW); Gl.glLoadIdentity(); Gl.glEnable(Gl.GL_DEPTH_TEST); Gl.glFrontFace(Gl.GL_CCW); Gl.glEnable(Gl.GL_CULL_FACE); Gl.glCullFace(Gl.GL_BACK); Gl.glEnable(Gl.GL_LIGHTING); Gl.glLightModelfv(Gl.GL_LIGHT_MODEL_AMBIENT, whiteLight); Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, sourceLight); Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, lightPos); Gl.glEnable(Gl.GL_LIGHT0); Gl.glEnable(Gl.GL_COLOR_MATERIAL); Gl.glColorMaterial(Gl.GL_FRONT, Gl.GL_AMBIENT_AND_DIFFUSE); Gl.glClearColor(0.8f, 0.8f, 0.8f, 1.0f); loadModel(); Gl.glEnable(Gl.GL_NORMALIZE); float[] dot1 = { -30.0f, 0.0f, -20.0f }; float[] dot2 = { -30.0f, 0.0f, 20.0f }; float[] dot3 = { 40.0f, 0.0f, 20.0f }; Lib lib = new Lib(); lib.gltMakeShadowMatrix(dot1, dot2, dot3, lightPos, shadowM); Begin(); burst = new Explosion(property.explosion.x, property.explosion.y, property.explosion.z, property.V0, property.H0, property.R0, property.particleNumber); burst.Boooom(); } private void barPlay_Scroll(object sender, EventArgs e) { count = barPlay.Value; lblShowTime.Text = xml.data[count].t.ToString("0.0000"); lblx.Text = "x: " + xml.data[count].x.ToString("0.0000"); lbly.Text = "y: " + xml.data[count].y.ToString("0.0000"); lblz.Text = "z: " + xml.data[count].z.ToString("0.0000"); lblTheta.Text = "theta: " + xml.data[count].theta.ToString("0.0000"); lblPsi.Text = "psi: " + xml.data[count].psi.ToString("0.0000"); lblGamma.Text = "gamma: " + xml.data[count].gamma.ToString("0.0000"); Draw(); } private void btnLoadData_Click(object sender, EventArgs e) { } private void btnPause_Click(object sender, EventArgs e) { if (btnPause.Text == "Pause") { dontCount = true; // btnchk = true; btnPause.Text = "Play"; } else { timer1.Start(); dontCount = false; // btnchk = false; btnPause.Text = "Pause"; } } private void timer1_Tick(object sender, EventArgs e) { lblShowTime.Text = xml.data[count].t.ToString("0.0000"); lblx.Text = "x: " + xml.data[count].x.ToString("0.0000"); lbly.Text = "y: " + xml.data[count].y.ToString("0.0000"); lblz.Text = "z: " + xml.data[count].z.ToString("0.0000"); lblTheta.Text = "theta: " + xml.data[count].theta.ToString("0.0000"); lblPsi.Text = "psi: " + xml.data[count].psi.ToString("0.0000"); lblGamma.Text = "gamma: " + xml.data[count].gamma.ToString("0.0000"); barPlay.Value = count; Draw(); if (dontCount == false) { count += 1; } if (count >= barPlay.Maximum) { //btnchk = true; btnPause.Text = "Play"; dontCount = true; count = barPlay.Maximum; } } private void exitToolStripMenuItem_Click(object sender, EventArgs e) { Application.Exit(); } private void Draw() { Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT); Gl.glMatrixMode(Gl.GL_MODELVIEW); Gl.glLoadIdentity(); switch (Box1.SelectedIndex) { case 0: { Glu.gluLookAt(xml.data[count].x + r * Math.Sin(-theta * 3.14 / 180) * Math.Sin(phi * 3.14 / 180), xml.data[count].y + r * Math.Cos(-theta * 3.14 / 180), xml.data[count].z + r * Math.Sin(-theta * 3.14 / 180) * Math.Cos(phi * 3.14 / 180), xml.data[count].x, xml.data[count].y, xml.data[count].z, 0, Math.Sign(theta), 0); break; } case 1: { Glu.gluLookAt(r * Math.Sin(theta * 3.14 / 180) * Math.Sin(phi * 3.14 / 180), r * Math.Cos(theta * 3.14 / 180), r * Math.Sin(theta * 3.14 / 180) * Math.Cos(phi * 3.14 / 180), 0, 0, 0, 0, Math.Sign(theta), 0); break; } } Gl.glPushMatrix(); Gl.glPushMatrix(); Gl.glEnable(Gl.GL_LIGHTING); Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, lightPos); Gl.glDisable(Gl.GL_LIGHTING); DrawGround(-size, -size / 2, size+500, size); Gl.glDisable(Gl.GL_DEPTH_TEST); DrawRect(0, -50, 500,100); Gl.glEnd(); Gl.glPushMatrix(); Gl.glMultMatrixf(shadowM); Gl.glTranslated(xml.data[count].x , xml.data[count].y, xml.data[count].z); Gl.glRotated(xml.data[count].gamma * 180.0f / 3.14159265f, 1, 0, 0); Gl.glRotated(xml.data[count].psi * 180.0f / 3.14159265f, 0, 1, 0); Gl.glRotated(xml.data[count].theta * 180.0f / 3.14159265f, 0, 0, 1); Gl.glColor3ub(0, 0, 0); //Gl.glRotated(-90, 0, 1, 0); //Gl.glTranslated(0.0f, 4.0f, -4.0f); //Gl.glScalef(0.7f, 1.0f, 0.65f); model.Render(); Gl.glPopMatrix(); Gl.glPopMatrix(); Gl.glPushMatrix(); Gl.glColor3ub(0, 0, 0); Gl.glPopMatrix(); Gl.glEnable(Gl.GL_DEPTH_TEST); Gl.glEnable(Gl.GL_LIGHTING); Gl.glPushMatrix(); Gl.glDisable(Gl.GL_COLOR_MATERIAL); Gl.glTranslated(xml.data[count].x, xml.data[count].y, xml.data[count].z); Gl.glRotated(xml.data[count].gamma * 180.0f / 3.14159265f, 1, 0, 0); Gl.glRotated(xml.data[count].psi * 180.0f / 3.14159265f, 0, 1, 0); Gl.glRotated(xml.data[count].theta * 180.0f / 3.14159265f, 0, 0, 1); // Gl.glRotated(-90, 0, 1, 0); //Gl.glTranslated(0.0f, -1.0f, -4.0f); //Gl.glScalef(0.7f, 1.0f, 0.65f); model.Render(); Gl.glEnable(Gl.GL_COLOR_MATERIAL); Gl.glPopMatrix(); Gl.glDisable(Gl.GL_LIGHTING); if (checkBoxParticle.Checked) { burst.Render(); } dev.Render(checkBoxGlide.Checked, checkBoxDev.Checked, checkBoxPlane.Checked, transparency); Gl.glEnable(Gl.GL_LIGHTING); Gl.glPopMatrix(); Gl.glFlush(); ShowDisplay.Invalidate(); } void DrawGround(float x, float y, float len, float width) { int n = 10; float lStep = len / n; float wStep = width / n; Gl.glBegin(Gl.GL_LINES); Gl.glEnd(); Gl.glColor3ub(200, 173, 20); for (int i = 0; i < n; i++) { Gl.glBegin(Gl.GL_TRIANGLE_STRIP); Gl.glNormal3f(0.0f, 1.0f, 0.0f); for (int j = n; j >= 0; j--) { Gl.glVertex3f(x + i * lStep, 0, y + j * wStep); Gl.glVertex3f(x + (i + 1) * lStep, 0, y + j * wStep); } Gl.glEnd(); } } void DrawRect(float x, float y, float len, float width) { int n=10; float lStep = len/n; float wStep = width / n; Gl.glColor3ub(100, 100, 100); for (int i = 0; i < n; i++) { Gl.glBegin(Gl.GL_TRIANGLE_STRIP); Gl.glNormal3f(0.0f, 1.0f, 0.0f); for (int j = n; j >=0; j--) { Gl.glVertex3f(x+i*lStep, 0, y + j*wStep); Gl.glVertex3f(x + (i+1) * lStep, 0, y + j * wStep); } Gl.glEnd(); } Gl.glColor3ub(255, 255, 255); n = 20; lStep = len / n; wStep = width / n; for (int i = 0; i < n ; i += 2) { Gl.glBegin(Gl.GL_QUADS); Gl.glNormal3f(0.0f, 1.0f, 0.0f); Gl.glVertex3f(x + i * lStep, 0, y + width / 2 - 5); Gl.glVertex3f(x + i * lStep, 0, y + width / 2 + 5); Gl.glVertex3f(x + (i + 1) * lStep, 0, y + width / 2 + 5); Gl.glVertex3f(x + (i + 1) * lStep, 0, y + width / 2 - 5); Gl.glEnd(); } Gl.glLineWidth(2.0f); Gl.glBegin(Gl.GL_LINES); Gl.glVertex3f(x , 0, y ); Gl.glVertex3f(x + len, 0, y); Gl.glVertex3f(x, 0, y + width); Gl.glVertex3f(x+len, 0, y + width); Gl.glEnd(); } private void label1_Click(object sender, EventArgs e) { } private void AxesBox_CheckedChanged(object sender, EventArgs e) { Draw(); } private void loadToolStripMenuItem_Click(object sender, EventArgs e) { timer1.Stop(); OpenFileDialog openFileDialog1 = new OpenFileDialog(); openFileDialog1.InitialDirectory = AppDomain.CurrentDomain.BaseDirectory; openFileDialog1.Filter = "xml file (*.xml)|*.xml|All files (*.*)|*.*"; openFileDialog1.RestoreDirectory = true; if (openFileDialog1.ShowDialog() == DialogResult.OK) { try { fileName = openFileDialog1.FileName; Begin(); } catch (Exception ex) { MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message); } } } private void Begin() { try { load.ReadPO(fileName); xml = null; xml = load.forXML; dev = new Deviation(xml.data, property.beginGlide, property.endGlide); dev.Calculate(); def_time = xml.data[0].t; def_count = xml.data.Count; timer1.Interval = (int)(-def_time / def_count * 1000 / speed[comboBox1.SelectedIndex]); size = (float)-xml.data[0].x; barPlay.Maximum = xml.data.Count - 1; btnPause.Show(); lblShowTime.Text = xml.data[0].t.ToString("0.0000"); barPlay.Value = 0; count = 0; barPlay.Enabled = true; comboBox1.Enabled = true; } catch (System.IO.FileNotFoundException) { } btnchk = true; btnPause.Text = "Play"; } private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { try { timer1.Interval = (int)(-def_time / def_count * 1000 / speed[comboBox1.SelectedIndex]); } catch (System.Exception a) { System.Console.WriteLine(a.TargetSite); } } private void loadModelToolStripMenuItem_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog1 = new OpenFileDialog(); openFileDialog1.InitialDirectory = AppDomain.CurrentDomain.BaseDirectory; openFileDialog1.Filter = "3DS file (*.3ds)|*.3DS|All files (*.*)|*.*"; openFileDialog1.RestoreDirectory = true; if (openFileDialog1.ShowDialog() == DialogResult.OK) { try { fileModel = openFileDialog1.FileName; loadModel(); } catch (Exception ex) { MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message); } } } private void loadModel() { file = null; file = new ThreeDSFile(fileModel); model = null; model = file.Model; } private void checkBoxGlide_CheckedChanged(object sender, EventArgs e) { if (xml != null) { Draw(); } } private void checkBoxDev_CheckedChanged(object sender, EventArgs e) { if (xml != null) { Draw(); } } private void checkBoxParticle_CheckedChanged(object sender, EventArgs e) { if (xml != null) { Draw(); } } private void checkBoxScale_CheckedChanged(object sender, EventArgs e) { if (xml != null) { Draw(); } } private void AxesToolStripMenuItem_Click(object sender, System.EventArgs e) { throw new System.NotImplementedException(); } private void DrawUnitAxes() { throw new System.NotImplementedException(); } } } class Program using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; namespace Самолет { static class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Form MF = new MainForm(); MF.Text = "Трехмерная визуализация"; Application.Run(MF); } } } |
Дипломная работа Мамзеров Д. В., навигация и интерфейс в средах виртуальной реальности, дипломная работа | Дипломная работа по теме: “ Интерактивная база данных по дендроклиматологии” Работу Моя дипломная работа очень актуальна, потому что дендроклиматология – малоизученная и малоизвестная область биологии. Дендроклиматология... | ||
Дипломная работа содержит 104 листа, 6 таблиц, 35 рисунков. Тема:... Данная дипломная работа посвящена проблемам разработки и внедрения устройств связи высокочастотного и сверхвысокочастотного диапазона.... | Название организации Заголовок «Дипломная работа» или «Курсовая работа»: Times New Roman, 14 (вопреки П. 113), по центру. Затем – 2 пустые строки | ||
Реферат. Содержание Дипломная работа (далее просто работа) выполняется на листах формата А4 с размерами полей: сверху – 20 мм, снизу – 20мм, справа –... | 2 требования к содержанию работы Дипломная работа (далее просто работа) выполняется на листах формата А4 с соблюдением следующих размеров полей: правое – 10 мм, верхнее... | ||
Дипломная работа | Реферат. Содержание Дипломная работа (далее просто работа) выполняется на листах формата А4 с размерами полей: сверху – 20 мм, снизу –20мм, справа- 15мм,... | ||
Дипломная работа пгу 030501 | Книга 1 Объем работы – реферат от 12 до 25 печатных листов, курсовая работа – от 20 до 30 страниц, дипломная работа 60-70 страниц компьютерного... | ||
Требования к дипломной работе учащихся 10 11-х классов Дипломная работа заключительная работа учебно-исследовательского характера, выполняемая оканчивающими университеты, экономические,... | Латинские заимствования в современном русском литературном языке (дипломная работа) | ||
Дипломная работа Создание программы помогающей изучать английский язык | Дипломная работа на тему: «Совершенствование организации поддержки... Дипломная работа «Совершенствование организации поддержки и развития малого предпринимательства в муниципальном районе на примере... | ||
Дипломная работа Соответствие современной интернет-рекламы психологическим особенностям подростков | Дипломная работа не менее 65 страниц без приложения Курсовая работа выполняется на одной стороне листа белой бумаги формата А4 (210 Х 297 мм). Иллюстрированный материал (таблицы, схемы,... |