public CameraModel3D() { var b1 = new MeshBuilder(); b1.AddBox(new Vector3(), 1f, 1f, 1.2f, BoxFaces.All); var body = new MeshGeometryModel3D() { CullMode = CullMode.Back }; body.Geometry = b1.ToMeshGeometry3D(); body.Material = PhongMaterials.Gray; body.SceneNode.OnSetRenderTechnique = (h) => { return(h.EffectsManager[DefaultRenderTechniqueNames.Diffuse]); }; this.Children.Add(body); b1 = new MeshBuilder(); b1.AddCone(new Vector3(0, 0, -1.2f), new Vector3(0, 0f, 0), 0.4f, true, 12); var lens = new MeshGeometryModel3D() { CullMode = CullMode.Back }; lens.Geometry = b1.ToMeshGeometry3D(); lens.Material = PhongMaterials.Yellow; lens.SceneNode.OnSetRenderTechnique = (h) => { return(h.EffectsManager[DefaultRenderTechniqueNames.Diffuse]); }; this.Children.Add(lens); var builder = new LineBuilder(); builder.AddLine(Vector3.Zero, new Vector3(2, 0, 0)); builder.AddLine(Vector3.Zero, new Vector3(0, 2, 0)); builder.AddLine(Vector3.Zero, new Vector3(0, 0, -2)); var mesh = builder.ToLineGeometry3D(); var arrowMeshModel = new LineGeometryModel3D(); arrowMeshModel.Geometry = mesh; arrowMeshModel.Color = System.Windows.Media.Colors.White; arrowMeshModel.IsHitTestVisible = false; int segment = mesh.Positions.Count / 3; var colors = new Core.Color4Collection(Enumerable.Repeat <Color4>(Color.Black, mesh.Positions.Count)); int i = 0; for (; i < segment; ++i) { colors[i] = Color.Red; } for (; i < segment * 2; ++i) { colors[i] = Color.Green; } for (; i < segment * 3; ++i) { colors[i] = Color.Blue; } mesh.Colors = colors; this.Children.Add(arrowMeshModel); SceneNode.OnTransformChanged += SceneNode_OnTransformChanged; }
public void Setup() { closePoint = InitializePointWithId("closePoint"); farPoint = InitializePointWithId("farPoint", new Vector3(10000, 10000, 10000)); var builder = new MeshBuilder(); builder.AddBox(new Vector3(-10000, -10000, -5000), 5, 5, 5, BoxFaces.All); var boxGeom = builder.ToMeshGeometry3D(); cube = new MeshGeometryModel3D() { Geometry = boxGeom, Name = "cube" }; }
public Watch3DxControl() { InitializeComponent(); // DataContext = this; // titles view1.Title = "Watch3DxNode"; view1.SubTitle = "SharpDX"; // camera setup view1.Camera = new PerspectiveCamera { Position = new Point3D(3, 3, 5), LookDirection = new Vector3D(-3, -3, -5), UpDirection = new Vector3D(0, 1, 0), FarPlaneDistance = 5000000 }; // default render technique view1.RenderTechniquesManager = new DefaultRenderTechniquesManager(); view1.RenderTechnique = view1.RenderTechniquesManager.RenderTechniques[DefaultRenderTechniqueNames.Phong]; view1.EffectsManager = new DefaultEffectsManager(view1.RenderTechniquesManager); // Setup lights var directionalLight3D = new DirectionalLight3D { Color = Color.White, Direction = new Vector3(-2, -5, -2) }; var ambientLight3D = new AmbientLight3D {Color = Color.White}; view1.Items.Add(ambientLight3D); view1.Items.Add(directionalLight3D); // Geometry var mb = new MeshBuilder(); mb.AddSphere(new Vector3(0, 0, 0), 0.5); mb.AddBox(new Vector3(0, 0, 0), 1, 0.5, 2, BoxFaces.All); var meshGeometry = mb.ToMeshGeometry3D(); var meshGeomModel = new MeshGeometryModel3D { Geometry = meshGeometry, Material = PhongMaterials.Red }; // Add the Model to the viewport view1.Items.Add(meshGeomModel); }
public Helix.GroupModel3D GenerateModelNoInstance(Action <Helix.MeshGeometryModel3D, int> applyMaterial) { var group = new Helix.GroupModel3D(); for (int i = 0; i < submeshCount; i++) { var mesh = new Helix.MeshGeometryModel3D { Geometry = submeshes[i], }; applyMaterial(mesh, matIndex[i]); group.Children.Add(mesh); } return(group); }
public Watch3DNodeDx(Core.VplControl hostCanvas) : base(hostCanvas) { // Add Control s _control = new Watch3DxControl(); AddControlToNode(_control); // Set Node resizable ... IsResizeable = true; // Add Control s _control = new Watch3DxControl(); /* { ViewPort3D = { Background = new SolidColorBrush(Colors.White), Camera = new PerspectiveCamera { Position = new Point3D(0, 0, 0), NearPlaneDistance = 0.1, FarPlaneDistance = double.PositiveInfinity, LookDirection = new Vector3D(-3, -3, -5), UpDirection = new Vector3D(0, 1, 0) }, RenderTechnique = Techniques.RenderBlinn, MaximumFieldOfView = 45, MinimumFieldOfView = 20 } }; */ // ViewPort3D = _control.ViewPort3D; var mb = new MeshBuilder(); for (var i = 0; i < 1000; i++) { mb.AddBox(new Vector3(i + 15, i + 15, i + 15), 100, 100, 100, BoxFaces.All); } // _control.meshModel.Material = PhongMaterials.Orange; // _control.meshModel.Geometry = mb.ToMeshGeometry3D(); //_control.meshModel.Visibility = Visibility.Visible; var model = new MeshGeometryModel3D(); model.Geometry = mb.ToMeshGeometry3D(); model.Material = PhongMaterials.Orange; // {Geometry = mb.ToMeshGeometry3D(), Material = PhongMaterials.Orange, Visibility = Visibility.Visible}; _control.ViewPort3D.Items.Add(model); _control.ViewPort3D.Items.Add(new AmbientLight3D {Color = Color4.White}); // control.ViewPort3D.Items.Add(new DirectionalLight3D() { Color = Color4.White , Direction = new Vector3(0,0,1)}); // _control.ViewPort3D.ShowTriangleCountInfo = true; // _control.ViewPort3D.ShowFieldOfView = true; AddControlToNode(_control); AddInputPortToNode("Elements", typeof (object)); }
public CameraModel3D() { var b1 = new MeshBuilder(); b1.AddBox(new Vector3(), 1f, 1f, 1.2f, BoxFaces.All); var body = new MeshGeometryModel3D() { CullMode = CullMode.Back }; body.Geometry = b1.ToMeshGeometry3D(); body.Material = new DiffuseMaterial() { DiffuseColor = Color.Gray }; this.Children.Add(body); b1 = new MeshBuilder(); b1.AddCone(new Vector3(0, 0, -1.2f), new Vector3(0, 0f, 0), 0.4f, true, 12); var lens = new MeshGeometryModel3D() { CullMode = CullMode.Back }; lens.Geometry = b1.ToMeshGeometry3D(); lens.Material = new DiffuseMaterial() { DiffuseColor = Color.Yellow }; this.Children.Add(lens); var builder = new LineBuilder(); builder.AddLine(Vector3.Zero, new Vector3(2, 0, 0)); builder.AddLine(Vector3.Zero, new Vector3(0, 2, 0)); builder.AddLine(Vector3.Zero, new Vector3(0, 0, -2)); var mesh = builder.ToLineGeometry3D(); var arrowMeshModel = new LineGeometryModel3D { Geometry = mesh, Color = System.Windows.Media.Colors.White, IsHitTestVisible = false }; int segment = mesh.Positions.Count / 3; var colors = new Color4Collection(Enumerable.Repeat <Color4>(Color.Black, mesh.Positions.Count)); int i = 0; for (; i < segment; ++i) { colors[i] = Color.Red; } for (; i < segment * 2; ++i) { colors[i] = Color.Green; } for (; i < segment * 3; ++i) { colors[i] = Color.Blue; } mesh.Colors = colors; this.Children.Add(arrowMeshModel); SceneNode.TransformChanged += SceneNode_OnTransformChanged; }
public void AddMeshGeometry(MeshGeometryModel3D meshGeometry) { view1.Items.Add(meshGeometry); }
private void OnModelSelected(MeshGeometryModel3D model) { if (_selectedIfcItem != null) { FillMeshByIfcColor(_selectedIfcItem); _selectedIfcItem = null; } Redraw(); }
private void OnModelHovered(MeshGeometryModel3D model) { if (_hoverIfcItem != null) { FillMeshByIfcColor(_hoverIfcItem); _hoverIfcItem = null; } if (model != null) { var mesh = (model as MeshGeometryModel3D); if (mesh != null && _meshToIfcItems.ContainsKey(mesh)) { mesh.Material = PhongMaterials.Chrome; _hoverIfcItem = _meshToIfcItems[mesh]; } } Redraw(); }
private void CreateFaceModels(IFCItem item, Vector3D center) { while (item != null) { if (item.ifcID != IntPtr.Zero && item.noVerticesForFaces != 0 && item.noPrimitivesForFaces != 0) { var positions = new List<Vector3>(); var normals = new List<Vector3>(); if (item.verticesForFaces != null) { for (int i = 0; i < item.noVerticesForFaces; i++) { var point = new Point3D(item.verticesForFaces[6 * i + 0] - center.X, item.verticesForFaces[6 * i + 1] - center.Y, item.verticesForFaces[6 * i + 2] - center.Z); var normal = new Vector3D(item.verticesForFaces[6 * i + 3], item.verticesForFaces[6 * i + 4], item.verticesForFaces[6 * i + 5]); positions.Add(new Vector3((float)point.X, (float)point.Y, (float)point.Z)); normals.Add(new Vector3((float)normal.X, (float)normal.Y, (float)normal.Z)); } Debug.Assert(item.verticesForFaces.Length == item.noVerticesForFaces * 6); } var indices = new Int32Collection(); if (item.indicesForFaces != null) { for (int i = 0; i < 3 * item.noPrimitivesForFaces; i++) { indices.Add(item.indicesForFaces[i]); } } List<Vector2> textureCoords = positions.Select(o => new Vector2(o.X, o.Y)).ToList(); var meshBuilder = new MeshBuilder(); meshBuilder.Append(positions, indices,normals,textureCoords); MeshGeometryModel3D mesh = new MeshGeometryModel3D() { Geometry = meshBuilder.ToMeshGeometry3D() }; item.Mesh3d = mesh; _meshToIfcItems[mesh] = item; #if DEBUG //OutputObj(item.ifcID.ToString(), mesh); #endif FillMeshByIfcColor(item); model.Add(mesh); } CreateFaceModels(item.child, center); item = item.next; } }
public static void OutputObj(string ifcId, MeshGeometryModel3D rep) { using (var writer = new StreamWriter("./" + ifcId + ".obj")) { for (int i = 0, count = rep.Geometry.Positions.Count; i < count; i++) { writer.WriteLine("v {0} {1} {2}", rep.Geometry.Positions[i].X, rep.Geometry.Positions[i].Y, rep.Geometry.Positions[i].Z); } List<int> dummyList = rep.Geometry.Indices; dummyList.Reverse(); var indices = dummyList;//HACK winding for (int i = 0, count = indices.Count / 3; i < count; i++) { writer.WriteLine("f {0}//{0} {1}//{1} {2}//{2}", indices[i * 3] + 1, indices[i * 3 + 1] + 1, indices[i * 3 + 2] + 1); } } }
public override void Calculate() { if (InputPorts[0].Data == null) return; // Use Tesselation Render Technique _control.view1.RenderTechniquesManager = new TessellationTechniquesManager(); _control.view1.RenderTechnique = _control.view1.RenderTechniquesManager.RenderTechniques[TessellationRenderTechniqueNames.PNTriangles]; _control.view1.EffectsManager = new TessellationEffectsManager(_control.view1.RenderTechniquesManager); // _control.view1.RenderTechniquesManager = new DefaultRenderTechniquesManager(); // _control.view1.RenderTechnique = _control.view1.RenderTechniquesManager.RenderTechniques[DefaultRenderTechniqueNames.Blinn]; // _control.view1.EffectsManager = new DefaultEffectsManager(_control.view1.RenderTechniquesManager); _control.RemoveGeometryModels(); // Input is of Type GenericElement if (InputPorts[0].Data != null && InputPorts[0].Data.GetType() == typeof(List<DtObject>)) { var elements = InputPorts[0].Data as List<DtObject>; // Loop the items of each list foreach (var item in elements) { // Init the MeshBuilde var mb = new MeshBuilder(); var points = item.AttributeGroups["geometry"].GetProperty("threejspoints") as List<Point3D>; var indices = item.AttributeGroups["geometry"].GetProperty("geometryindices") as List<uint>; var color = item.AttributeGroups["geometry"].GetProperty("color") is System.Drawing.Color ? (System.Drawing.Color) item.AttributeGroups["geometry"].GetProperty("color") : new System.Drawing.Color(); var listIndices = indices.Select(value => (int) value).ToList(); for (var i = 0; i < indices.Count; i++) { switch (indices[i]) { case 0: mb.AddPolygon(new List<Vector3> { new Vector3((float)points[listIndices[i]].X, (float)points[listIndices[i]].Y, (float)points[listIndices[i]].Z), new Vector3((float)points[listIndices[i + 1]].X, (float)points[listIndices[i + 1]].Y, (float)points[listIndices[i + 1]].Z), new Vector3((float)points[listIndices[i + 2]].X, (float)points[listIndices[i + 2]].Y, (float)points[listIndices[i + 2]].Z) }); i = i + 3; break; case 1: mb.AddPolygon(new List<Vector3> { new Vector3((float)points[listIndices[i]].X, (float)points[listIndices[i]].Y, (float)points[listIndices[i]].Z), new Vector3((float)points[listIndices[i + 1]].X, (float)points[listIndices[i + 1]].Y, (float)points[listIndices[i + 1]].Z), new Vector3((float)points[listIndices[i + 2]].X, (float)points[listIndices[i + 2]].Y, (float)points[listIndices[i + 2]].Z), new Vector3((float)points[listIndices[i + 3]].X, (float)points[listIndices[i + 3]].Y, (float)points[listIndices[i + 3]].Z) }); i = i + 4; break; } } // for (var i = 0; i < indices.Count; i++) // { // switch (indices[i]) // { // case 0: // mb.AddTriangle( // new Vector3((float)points[(int)indices[i]].X, (float)points[(int)indices[i]].Y, (float)points[(int)indices[i]].Z), // new Vector3((float)points[(int)indices[i + 1]].X, (float)points[(int)indices[i + 1]].Y, (float)points[(int)indices[i + 1]].Z), // new Vector3((float)points[(int)indices[i + 2]].X, (float)points[(int)indices[i + 2]].Y, (float)points[(int)indices[i + 2]].Z)); // i = i + 3; // break; // case 1: // mb.AddQuad( // new Vector3((float)points[(int)indices[i]].X, (float)points[(int)indices[i]].Y, (float)points[(int)indices[i]].Z), // new Vector3((float)points[(int)indices[i + 1]].X, (float)points[(int)indices[i + 1]].Y, (float)points[(int)indices[i + 1]].Z), // new Vector3((float)points[(int)indices[i + 2]].X, (float)points[(int)indices[i + 2]].Y, (float)points[(int)indices[i + 2]].Z), // new Vector3((float)points[(int)indices[i + 3]].X, (float)points[(int)indices[i + 3]].Y, (float)points[(int)indices[i + 3]].Z)); // i = i + 4; // break; // } // } mb.ComputeNormalsAndTangents(MeshFaces.QuadPatches, true); var meshGeometry = mb.ToMeshGeometry3D(); var meshGeomModel = new MeshGeometryModel3D { Geometry = meshGeometry, Material = PhongMaterials.Red, // Material = new PhongMaterial // { // AmbientColor = new Color4 { Alpha = color.A, Red = color.R, Blue = color.B, Green = color.G }, // // DiffuseColor = new Color4 { Alpha = color.A, Red = color.R, Blue = color.B, Green = color.G }, // // SpecularColor = new Color4 { Alpha = color.A, Red = color.R, Blue = color.B, Green = color.G }, // // EmissiveColor = new Color4 { Alpha = color.A, Red = color.R, Blue = color.B, Green = color.G }, // // SpecularShininess = 89.6f, // }, Transform = new TranslateTransform3D() }; // Add the Model to the viewport base.VisualizeMesh(meshGeomModel); } } else { base.Calculate(); } }
private void CreateFaceModels(IFCItem item, Vector3 center) { while (item != null) { if (item.ifcID != IntPtr.Zero && item.noVerticesForFaces != 0 && item.noPrimitivesForFaces != 0) { var positions = new Vector3Collection(); var normals = new Vector3Collection(); if (item.verticesForFaces != null) { for (int i = 0; i < item.noVerticesForFaces; i++) { var point = new Vector3(item.verticesForFaces[6 * i + 0] - center.X, item.verticesForFaces[6 * i + 1] - center.Y, item.verticesForFaces[6 * i + 2] - center.Z); var normal = new Vector3(item.verticesForFaces[6 * i + 3], item.verticesForFaces[6 * i + 4], item.verticesForFaces[6 * i + 5]); positions.Add(point); normals.Add(normal); } Debug.Assert(item.verticesForFaces.Length == item.noVerticesForFaces * 6); } var indices = new IntCollection(); if (item.indicesForFaces != null) { for (int i = 0; i < 3 * item.noPrimitivesForFaces; i++) { indices.Add(item.indicesForFaces[i]); } } var meshGeometry = new MeshGeometry3D(); meshGeometry.Positions = positions; meshGeometry.Normals = normals; meshGeometry.Indices = indices; meshGeometry.TextureCoordinates = null; meshGeometry.Colors = null; meshGeometry.Tangents = null; meshGeometry.BiTangents = null; MeshGeometryModel3D mesh = new MeshGeometryModel3D() { Geometry = meshGeometry }; // var builder = new MeshBuilder(true, false); // builder.Positions.AddRange(positions); // builder.Normals.AddRange(normals); // builder.TriangleIndices.AddRange(indices); // MeshGeometryModel3D mesh = new MeshGeometryModel3D() { Geometry = builder.ToMeshGeometry3D() }; item.Mesh3d = mesh; _meshToIfcItems[mesh] = item; //#if DEBUG // OutputObj(item.ifcID.ToString(), meshGeometry); //#endif FillMeshByIfcColor(item); mesh.Tag = item.ifcType + ":" + item.ifcID; model.Add(mesh); } CreateFaceModels(item.child, center); item = item.next; } }
public void VisualizeMesh(MeshGeometryModel3D model) { _control.AddMeshGeometry(model); }
public void ComputeBoundsForSelectedNodeGeometry_OnePointOneCubeSelected_BoundingBoxIsCorrect() { var pointA = InitializePointWithId("A"); var builder = new MeshBuilder(); builder.AddBox(new Vector3(1000000, 1000000, 1000000), 5, 5, 5, BoxFaces.All); var boxGeom = builder.ToMeshGeometry3D(); var boxB = new MeshGeometryModel3D() { Geometry = boxGeom, Name = "B" }; var bounds = HelixWatch3DViewModel.ComputeBoundsForGeometry(new GeometryModel3D[] { pointA, boxB }); Assert.AreEqual(bounds.Minimum, pointA.Bounds().Minimum); Assert.AreEqual(bounds.Maximum, boxB.Bounds().Maximum); }