Дипломная работа





НазваниеДипломная работа
страница12/12
Дата публикации14.12.2014
Размер0.6 Mb.
ТипДиплом
100-bal.ru > Информатика > Диплом
1   ...   4   5   6   7   8   9   10   11   12

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 Entities = new 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 list = new 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);

}

}

}

1   ...   4   5   6   7   8   9   10   11   12

Похожие:

Дипломная работа iconДипломная работа
Мамзеров Д. В., навигация и интерфейс в средах виртуальной реальности, дипломная работа
Дипломная работа iconДипломная работа по теме: “ Интерактивная база данных по дендроклиматологии” Работу
Моя дипломная работа очень актуальна, потому что дендроклиматология – малоизученная и малоизвестная область биологии. Дендроклиматология...
Дипломная работа iconДипломная работа содержит 104 листа, 6 таблиц, 35 рисунков. Тема:...
Данная дипломная работа посвящена проблемам разработки и внедрения устройств связи высокочастотного и сверхвысокочастотного диапазона....
Дипломная работа iconНазвание организации
Заголовок «Дипломная работа» или «Курсовая работа»: Times New Roman, 14 (вопреки П. 113), по центру. Затем – 2 пустые строки
Дипломная работа iconРеферат. Содержание
Дипломная работа (далее просто работа) выполняется на листах формата А4 с размерами полей: сверху – 20 мм, снизу – 20мм, справа –...
Дипломная работа icon2 требования к содержанию работы
Дипломная работа (далее просто работа) выполняется на листах формата А4 с соблюдением следующих размеров полей: правое – 10 мм, верхнее...
Дипломная работа iconДипломная работа

Дипломная работа iconРеферат. Содержание
Дипломная работа (далее просто работа) выполняется на листах формата А4 с размерами полей: сверху – 20 мм, снизу –20мм, справа- 15мм,...
Дипломная работа iconДипломная работа пгу 030501

Дипломная работа iconКнига 1
Объем работы – реферат от 12 до 25 печатных листов, курсовая работа – от 20 до 30 страниц, дипломная работа 60-70 страниц компьютерного...
Дипломная работа iconТребования к дипломной работе учащихся 10 11-х классов
Дипломная работа заключительная работа учебно-исследовательского характера, выполняемая оканчивающими университеты, экономические,...
Дипломная работа iconЛатинские заимствования в современном русском литературном языке (дипломная работа)

Дипломная работа iconДипломная работа Создание программы помогающей изучать английский язык

Дипломная работа iconДипломная работа на тему: «Совершенствование организации поддержки...
Дипломная работа «Совершенствование организации поддержки и развития малого предпринимательства в муниципальном районе на примере...
Дипломная работа iconДипломная работа
Соответствие современной интернет-рекламы психологическим особенностям подростков
Дипломная работа iconДипломная работа не менее 65 страниц без приложения
Курсовая работа выполняется на одной стороне листа белой бумаги формата А4 (210 Х 297 мм). Иллюстрированный материал (таблицы, схемы,...


Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
100-bal.ru
Поиск