private void ParseFace(string v, Action <Queue <Point3d>, Queue <Vector3d>, SceneFaceHandlerParams> faceHandler, SceneFaceHandlerParams args) { Queue <string> tokens = new Queue <string>(); v = v.Trim(); foreach (var item in v.Split(' ')) { tokens.Enqueue(item); } Queue <Point3d> vertex = new Queue <Point3d>(); Queue <Vector3d> normVector = new Queue <Vector3d>(); int vertexIndex = 0; int textureIndex = 0; int normIndex = 0; while (tokens.Count > 0) { var token = tokens.Dequeue(); ParseFaceStr(token, out vertexIndex, out textureIndex, out normIndex); vertex.Enqueue(vertexes[vertexIndex - 1]); if (normIndex > 0) { normVector.Enqueue(normVectors[normIndex - 1]); } } faceHandler(vertex, normVector, args); }
public void SetDefaultScene() { Scene.AddModel(CreateSphere()); SceneFaceHandlerParams loadParams = new SceneFaceHandlerParams(Scene, // scale: 80f, // move dx, dy, dz: 0, 50, 0, // rotate around axises x, y, z: 0, 0, (float)Math.PI / 4f + 0.01f, // color new Color(255, 255, 255), // surface params new Material(5, 10, 5, 7, 0, 10) ); CreateModel(loadParams, "./models/figure1.obj"); }
public void Avion() { SceneFaceHandlerParams loadParams = new SceneFaceHandlerParams(_builder.Scene, // scale: 15f, // move dx, dy, dz: 0, 50, 0, // rotate around axises x, y, z: 0, 0, (float)Math.PI / 4f + 0.01f, // color new Structs.Color(100, 100, 100), // surface params new Material(5, 10, 5, 0, 0, 10) ); _builder.CreateModel(loadParams, "./models/cessna.obj"); _render.Scene.PrepareScene(); _history.Clear(); }
public void LoadObj(string filename, Action <Queue <Point3d>, Queue <Vector3d>, SceneFaceHandlerParams> faceHandler, SceneFaceHandlerParams args) { using (var stream = new StreamReader(filename)) { string line; while (!stream.EndOfStream) { line = stream.ReadLine(); line = line.Replace('.', ','); if (string.IsNullOrEmpty(line)) { continue; } if ((line[0] != 'v') && (line[0] != 'f')) { continue; } if ((line[0] == 'v') && (line[1] == ' ')) { ParseVertex(line.Substring(2)); } if ((line[0] == 'v') && (line[1] == 'n')) { ParseNormVector(line.Substring(3)); } if ((line[0] == 'f') && (line[1] == ' ')) { ParseFace(line.Substring(2), faceHandler, args); } } } }
public void SceneFaceHandler(Queue <Point3d> vertexes, Queue <Vector3d> normVectors, SceneFaceHandlerParams arg) { Scene scene = arg.Scene; float scale = arg.Scale; float dx = arg.dx; float dy = arg.dy; float dz = arg.dz; float sin_al_x = (float)Math.Sin(arg.X); float cos_al_x = (float)Math.Cos(arg.X); float sin_al_y = (float)Math.Sin(arg.Y); float cos_al_y = (float)Math.Cos(arg.Y); float sin_al_z = (float)Math.Sin(arg.Z); float cos_al_z = (float)Math.Cos(arg.Z); Color default_color = arg.DefaultColor; Material default_material = arg.DefaultMaterial; Point3d p_p1 = vertexes.Dequeue(); Point3d p_p2 = vertexes.Dequeue(); Point3d p_p3; Vector3d p_v1 = new Vector3d(); Vector3d p_v2 = new Vector3d(); Vector3d p_v3 = new Vector3d(); bool isQueueFull = false; if (normVectors.Count > 0) { p_v1 = normVectors.Dequeue(); p_v2 = normVectors.Dequeue(); isQueueFull = true; } Point3d p1; Point3d p2; Point3d p3; Vector3d v1; Vector3d v2; Vector3d v3; var model = new SceneObject(); while (vertexes.Count > 0) { p_p3 = vertexes.Dequeue(); if (normVectors.Count > 0 || isQueueFull) { p_v3 = normVectors.Dequeue(); } p1 = Point3d.RatatePointX(p_p1, sin_al_x, cos_al_x); p1 = Point3d.RatatePointY(p1, sin_al_y, cos_al_y); p1 = Point3d.RatatePointZ(p1, sin_al_z, cos_al_z); p2 = Point3d.RatatePointX(p_p2, sin_al_x, cos_al_x); p2 = Point3d.RatatePointY(p2, sin_al_y, cos_al_y); p2 = Point3d.RatatePointZ(p2, sin_al_z, cos_al_z); p3 = Point3d.RatatePointX(p_p3, sin_al_x, cos_al_x); p3 = Point3d.RatatePointY(p3, sin_al_y, cos_al_y); p3 = Point3d.RatatePointZ(p3, sin_al_z, cos_al_z); if (isQueueFull) { v1 = Vector3d.RatateVectorX(p_v1, sin_al_x, cos_al_x); v1 = Vector3d.RatateVectorY(v1, sin_al_y, cos_al_y); v1 = Vector3d.RatateVectorZ(v1, sin_al_z, cos_al_z); v2 = Vector3d.RatateVectorX(p_v2, sin_al_x, cos_al_x); v2 = Vector3d.RatateVectorY(v2, sin_al_y, cos_al_y); v2 = Vector3d.RatateVectorZ(v2, sin_al_z, cos_al_z); v3 = Vector3d.RatateVectorX(p_v3, sin_al_x, cos_al_x); v3 = Vector3d.RatateVectorY(v3, sin_al_y, cos_al_y); v3 = Vector3d.RatateVectorZ(v3, sin_al_z, cos_al_z); model.AddObject( new Triangle3dn( new Point3d(p1.X * scale + dx, p1.Y * scale + dy, p1.Z * scale + dz), new Point3d(p2.X * scale + dx, p2.Y * scale + dy, p2.Z * scale + dz), new Point3d(p3.X * scale + dx, p3.Y * scale + dy, p3.Z * scale + dz), v1, v2, v3, default_color, default_material) ); } else { model.AddObject( new Triangle3d( new Point3d(p1.X * scale + dx, p1.Y * scale + dy, p1.Z * scale + dz), new Point3d(p2.X * scale + dx, p2.Y * scale + dy, p2.Z * scale + dz), new Point3d(p3.X * scale + dx, p3.Y * scale + dy, p3.Z * scale + dz), default_color, default_material) ); } p_p2 = p_p3; p_v2 = p_v3; } if (model.Count > 0) { scene.AddModel(model); } }
public frmSettingsObject(SceneFaceHandlerParams settings) { InitializeComponent(); _settings = settings; }
public void CreateModel(SceneFaceHandlerParams settings, string filename) { loader.LoadObj(filename, loader.SceneFaceHandler, settings); }