Exemplo n.º 1
0
        static void btnTest_click(HtmlDomEventArgs e)
        {
            // set the scene size
            float WIDTH  = 400;
            float HEIGHT = 300;

            // set some camera attributes
            float VIEW_ANGLE = 45;
            float ASPECT     = WIDTH / HEIGHT;
            float NEAR       = 0.1f;
            float FAR        = 10000;

            // get the DOM element to attach to
            // - assume we've got jQuery to hand
            jQuery container = J("#container");

            // create a WebGL renderer, camera
            // and a scene
            WebGLRenderer renderer = new WebGLRenderer();
            Camera        camera   = new PerspectiveCamera(VIEW_ANGLE, ASPECT, NEAR, FAR);
            Scene         scene    = new Scene();

            // the camera starts at 0,0,0 so pull it back
            camera.position.z = 300;

            // start the renderer
            renderer.setSize(WIDTH, HEIGHT);

            // attach the render-supplied DOM element
            container.append(renderer.domElement);

            // create the sphere's material
            MeshLambertMaterial sphereMaterial = new MeshLambertMaterial(new MeshLambertMaterialOptions {
                color = 0xcc0000
            });

            // set up the sphere vars
            int radius = 50, segments = 16, rings = 16;

            // create a new mesh with sphere geometry -
            // we will cover the sphereMaterial next!
            Mesh sphere = new Mesh(new SphereGeometry(radius, segments, rings), sphereMaterial);

            // add the sphere to the scene
            scene.add(sphere);

            // create a point light
            var pointLight = new PointLight(0xFFFFFF);

            // set its position
            pointLight.position.x = 10;
            pointLight.position.y = 50;
            pointLight.position.z = 130;

            // add to the scene
            scene.add(pointLight);

            // draw!
            renderer.render(scene, camera);
        }
Exemplo n.º 2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="control"></param>
        public override void Load(Control control)
        {
            base.Load(control);

            camera = new PerspectiveCamera(60, control.Width / (float)control.Height, 0.1f, 1000000.0f);
            this.camera.Position.Z = 0.2f;

            controls = new TrackballControls(control, camera);

            controls.RotateSpeed = 5.0f;
            controls.ZoomSpeed   = 5;
            controls.PanSpeed    = 2;

            controls.NoZoom = false;
            controls.NoPan  = false;

            controls.StaticMoving         = true;
            controls.DynamicDampingFactor = 0.3f;

            scene = new Scene();

            scene.Add(camera);

            // light

            var dirLight = new DirectionalLight(Color.White);

            dirLight.Position = new Vector3(200, 200, 1000).Normalize();

            camera.Add(dirLight);
            camera.Add(dirLight.target);

            var material = new MeshLambertMaterial()
            {
                Color = Color.White, Side = ThreeCs.Three.DoubleSide
            };

            // Link in the loader

            var loader = new VTKLoader();

            loader.Loaded += (o, args) =>
            {
                args.BufferGeometry.ComputeVertexNormals();

                var mesh = new Mesh(args.BufferGeometry, material);
                mesh.Position.Y = -0.09f;
                scene.Add(mesh);
            };
            loader.Load(@"examples\models/vtk/bunny.vtk");
        }
Exemplo n.º 3
0
        private MeshBasicMaterial CreateMaterial(Renderer renderer, JToken materialJson, string texturePath = null)
        {
            dynamic material = new MeshLambertMaterial(renderer);

            var shadingData = materialJson["shading"];

            if (shadingData != null)
            {
                var shading = shadingData.Value <string>().ToLower();
                if (shading == "phong")
                {
                    throw new NotImplementedException();
                }
                else if (shading == "basic")
                {
                    material = new MeshBasicMaterial(renderer);
                }
            }

            material.DiffuseColor = new Color(0xeeeeee);
            //material.Opacity = 1;
            material.UseWireframe = false;

            var blendingData = materialJson["blending"];

            if (blendingData != null)
            {
                BlendMode mode;
                switch (blendingData.Value <string>())
                {
                case "NormalBlending": mode = BlendMode.Normal; break;

                default: throw new NotSupportedException();
                }
                material.Blending = mode;
            }

            var transparentData = materialJson["transparent"];

            if (transparentData != null)
            {
                material.IsTransparent = transparentData.Value <bool>();
            }

            var depthTestData = materialJson["depthTest"];

            if (depthTestData != null)
            {
                material.ShouldDepthTest = depthTestData.Value <bool>();
            }

            var depthWriteData = materialJson["depthWrite"];

            if (depthWriteData != null)
            {
                material.ShouldDepthWrite = depthWriteData.Value <bool>();
            }

            var isVisibleData = materialJson["visible"];

            if (isVisibleData != null)
            {
                material.isVisible = isVisibleData.Value <bool>();
            }

            var isFlipSidedData = materialJson["flipSided"];

            if (isFlipSidedData != null)
            {
                material.side = SideMode.Back;
            }

            var isDoubleSidedData = materialJson["doubleSided"];

            if (isFlipSidedData != null)
            {
                material.side = SideMode.Double;
            }

            var useWireframeData = materialJson["wireframe"];

            if (useWireframeData != null)
            {
                material.useWireframe = useWireframeData.Value <bool>();
            }

            var vertexColorsData = materialJson["vertexColors"];

            if (vertexColorsData != null)
            {
                if (vertexColorsData.Value <string>() == "face")
                {
                    material.VertexColors = VertexColorMode.Face;
                }
                else
                {
                    material.VertexColors = VertexColorMode.Vertex;
                }
            }

            #region colors

            var colorDiffuseData = materialJson["colorDiffuse"];
            if (colorDiffuseData != null)
            {
                var rgb = colorDiffuseData.Values <float>().ToArray();
                material.DiffuseColor = new Color(rgb[0], rgb[1], rgb[2]);
            }
            else
            {
                var debugColorData = materialJson["DbgColor"];
                if (debugColorData != null)
                {
                    material.DiffuseColor = new Color(debugColorData.Value <uint>());
                }
            }

            var colorSpecularData = materialJson["colorSpecular"];
            if (material is MeshPhongMaterial && colorSpecularData != null)
            {
                var rgb = colorSpecularData.Values <float>().ToArray();
                material.Specular = new Color(rgb[0], rgb[1], rgb[2]);
            }

            var ambientData = materialJson["colorAmbient"];
            if (ambientData != null)
            {
                var rgb = ambientData.Values <float>().ToArray();
                material.Ambient = new Color(rgb[0], rgb[1], rgb[2]);
            }

            var emissiveData = materialJson["colorEmissive"];
            if (emissiveData != null)
            {
                var rgb = emissiveData.Values <float>().ToArray();
                material.Emissive = new Color(rgb[0], rgb[1], rgb[2]);
            }
            #endregion

            #region modifiers
            // TODO is opactiy needed?
            //if (transparentData != null)
            //{
            //    material.opacity = transparentData.Value<float>();
            //}

            var shininessData = materialJson["shininess"];
            if (shininessData != null)
            {
                material.shininess = shininessData.Value <float>();
            }
            #endregion

            #region textures
            var mapDiffuseData = materialJson["mapDiffuse"];
            if (mapDiffuseData != null && texturePath != null)
            {
                var      d        = materialJson["mapDiffuse"].Value <string>();
                var      r        = materialJson["mapDiffuseRepeat"];
                var      o        = materialJson["mapDiffuseOffset"];
                var      wrapData = materialJson["mapDiffuseWrap"];
                WrapMode wrapS;
                switch (wrapData[0].Value <string>())
                {
                case "repeat": wrapS = WrapMode.Repeat; break;

                default: throw new NotSupportedException();
                }
                WrapMode wrapT;
                switch (wrapData[1].Value <string>())
                {
                case "repeat": wrapT = WrapMode.Repeat; break;

                default: throw new NotSupportedException();
                }

                var a = materialJson["mapDiffuseAnisotropy"];
                CreateTexture(texturePath, materialJson, "map", d, null, null, wrapS, wrapT, null);
            }

            var mapLightData = materialJson["mapLight"];
            if (mapLightData != null && texturePath != null)
            {
                var d = materialJson["mapLight"];
                var r = materialJson["mapLightRepeat"];
                var o = materialJson["mapLightOffset"];
                var w = materialJson["mapLightWrap"];
                var a = materialJson["mapLightAnisotropy"];
                throw new NotImplementedException();//CreateTexture( mpars, "lightMap", d,r, o, w, a);
            }


            var mapBumpData = materialJson["mapBump"];
            if (mapBumpData != null && texturePath != null)
            {
                var d = materialJson["mapBump"];
                var r = materialJson["mapBumpRepeat"];
                var o = materialJson["mapBumpOffset"];
                var w = materialJson["mapBumpWrap"];
                var a = materialJson["mapBumpAnisotropy"];
                throw new NotImplementedException();//CreateTexture( mpars, "bumpMap", d,r, o, w, a);
            }

            var mapNormalData = materialJson["mapNormal"];
            if (mapNormalData != null && texturePath != null)
            {
                var d = materialJson["mapNormal"];
                var r = materialJson["mapNormalRepeat"];
                var o = materialJson["mapNormalOffset"];
                var w = materialJson["mapNormalWrap"];
                var a = materialJson["mapNormalAnisotropy"];
                throw new NotImplementedException();//CreateTexture( mpars, "normalMap", d,r, o, w, a);
            }

            var mapSpecularData = materialJson["mapSpecular"];
            if (mapSpecularData != null && texturePath != null)
            {
                var d = materialJson["mapSpecular"];
                var r = materialJson["mapSpecularRepeat"];
                var o = materialJson["mapSpecularOffset"];
                var w = materialJson["mapSpecularWrap"];
                var a = materialJson["mapSpecularAnisotropy"];
                throw new NotImplementedException();//CreateTexture( mpars, "specularMap", d,r, o, w, a);
            }

            var mapAlphaData = materialJson["mapAlpha"];
            if (mapAlphaData != null && texturePath != null)
            {
                var d = materialJson["mapAlpha"];
                var r = materialJson["mapAlphaRepeat"];
                var o = materialJson["mapAlphaOffset"];
                var w = materialJson["mapAlphaWrap"];
                var a = materialJson["mapAlphaAnisotropy"];
                throw new NotImplementedException();//CreateTexture( mpars, "alphaMap", d,r, o, w, a);
            }
            #endregion

            var mapBumpScaleData = materialJson["mapBumpScale"];
            if (mapBumpScaleData != null)
            {
                material.bumpScale = mapBumpScaleData.Value <float>();
            }

            if (mapNormalData != null)
            {
                throw new NotImplementedException();
            }

            return(material);
        }
Exemplo n.º 4
0
 public MorphAnimMesh(object geometry, MeshLambertMaterial material)
 {
     // TODO: Complete member initialization
     this.material = material;
 }
Exemplo n.º 5
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="openTKcontrol"></param>
        public override void Load(Control openTKcontrol)
        {
            base.Load(openTKcontrol);

            camera          = new PerspectiveCamera(70, openTKcontrol.Width / (float)openTKcontrol.Height, 1, 3000);
            camera.Position = new Vector3(1000, 500, 1000);
            camera.LookAt(new Vector3(0, 200, 0));

            scene = new Scene();
            scene.Add(new GridHelper(500, 100));

            var light = new DirectionalLight(Color.White, 2);

            light.Position = new Vector3(1, 1, 1);
            scene.Add(light);

            var texture = ImageUtils.LoadTexture(@"examples/textures/crate.gif");

            texture.Anisotropy = this.renderer.MaxAnisotropy;

            var geometry = new BoxGeometry(200, 200, 200);
            var material = new MeshLambertMaterial(null)
            {
                Map = texture
            };


//var arrowGeometry = new Geometry();

//var cm = new Mesh(new CylinderGeometry(0, 200, 1000, 12, 1, false));
//cm.Position.Y = 100;
//cm.UpdateMatrix();

//arrowGeometry.Merge((Geometry)cm.Geometry, cm.Matrix);

//var ww = new Mesh(arrowGeometry);


//scene.Add(ww);



            control = new TransformControls(camera, openTKcontrol);
            control.PropertyChanged += control_PropertyChanged;

            mesh = new Mesh(geometry, material);
            scene.Add(mesh);

            control.Attach(mesh);
            scene.Add(control);

            openTKcontrol.KeyDown += (o, args) =>
            {
                switch (args.KeyValue)
                {
                case 81:         // Q
                    control.setSpace(control.space == "local" ? "world" : "local");
                    break;

                case 87:         // W
                    control.SetMode("translate");
                    break;

                case 69:         // E
                    control.SetMode("rotate");
                    break;

                case 82:         // R
                    control.SetMode("scale");
                    break;

                case 187:
                case 107:         // +,=,num+
                    control.setSize(control.size + 0.1f);
                    break;

                case 189:
                case 10:         // -,_,num-
                    control.setSize(Math.Max(control.size - 0.1f, 0.1f));
                    break;
                }
            };
        }
Exemplo n.º 6
0
        /// <summary>
        ///
        /// </summary>
        private Object3D Parse(string text)
        {
            // v float float float

            var vertex_pattern = @"v( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)";

            // vn float float float

            var normal_pattern = @"vn( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)";

            // vt float float

            var uv_pattern = @"vt( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)";

            // f vertex vertex vertex ...

            var face_pattern1 = @"f( +-?\d+)( +-?\d+)( +-?\d+)( +-?\d+)?";

            // f vertex/uv vertex/uv vertex/uv ...

            var face_pattern2 = @"f( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))?";

            // f vertex/uv/normal vertex/uv/normal vertex/uv/normal ...

            var face_pattern3 = @"f( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))?";

            // f vertex//normal vertex//normal vertex//normal ...

            var face_pattern4 = @"f( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))?";


            var lines = text.Split('\n');

            for (var i = 0; i < lines.Length; i++)
            {
                var line = lines[i];
                line = line.Trim();

                if (line.Length == 0 || line[0] == '#')
                {
                    continue;
                }

                {
                    var rgx     = new Regex(vertex_pattern, RegexOptions.IgnoreCase);
                    var matches = rgx.Matches(line);

                    foreach (Match match in matches)
                    {
                        this._vertices.AddRange(new [] { floatParse(match.Groups[1].Value), floatParse(match.Groups[2].Value), floatParse(match.Groups[3].Value) });
                    }

                    if (matches.Count > 0)
                    {
                        continue;
                    }
                }

                {
                    var rgx     = new Regex(normal_pattern, RegexOptions.IgnoreCase);
                    var matches = rgx.Matches(line);

                    foreach (Match match in matches)
                    {
                        this._normals.AddRange(new[] { floatParse(match.Groups[1].Value), floatParse(match.Groups[2].Value), floatParse(match.Groups[3].Value) });
                    }

                    if (matches.Count > 0)
                    {
                        continue;
                    }
                }

                {
                    var rgx     = new Regex(uv_pattern, RegexOptions.IgnoreCase);
                    var matches = rgx.Matches(line);

                    foreach (Match match in matches)
                    {
                        this._uvs.AddRange(new[] { floatParse(match.Groups[1].Value), floatParse(match.Groups[2].Value) });
                    }

                    if (matches.Count > 0)
                    {
                        continue;
                    }
                }

                {
                    var rgx     = new Regex(face_pattern1, RegexOptions.IgnoreCase);
                    var matches = rgx.Matches(line);

                    foreach (Match match in matches)
                    {
                        addFace(
                            intParse(match.Groups[1].Value), intParse(match.Groups[2].Value), intParse(match.Groups[3].Value), intParse(match.Groups[4].Value),
                            null, null, null, null,
                            null, null, null, null);
                    }

                    if (matches.Count > 0)
                    {
                        continue;
                    }
                }

                {
                    var rgx     = new Regex(face_pattern2, RegexOptions.IgnoreCase);
                    var matches = rgx.Matches(line);

                    foreach (Match match in matches)
                    {
                        addFace(
                            intParse(match.Groups[2].Value), intParse(match.Groups[5].Value), intParse(match.Groups[8].Value), intParse(match.Groups[11].Value),
                            intParse(match.Groups[3].Value), intParse(match.Groups[6].Value), intParse(match.Groups[9].Value), intParse(match.Groups[12].Value),
                            null, null, null, null);
                    }

                    if (matches.Count > 0)
                    {
                        continue;
                    }
                }

                {
                    var rgx     = new Regex(face_pattern3, RegexOptions.IgnoreCase);
                    var matches = rgx.Matches(line);

                    foreach (Match match in matches)
                    {
                        addFace(
                            intParse(match.Groups[2].Value), intParse(match.Groups[6].Value), intParse(match.Groups[10].Value), intParse(match.Groups[14].Value),
                            intParse(match.Groups[3].Value), intParse(match.Groups[7].Value), intParse(match.Groups[11].Value), intParse(match.Groups[15].Value),
                            intParse(match.Groups[4].Value), intParse(match.Groups[8].Value), intParse(match.Groups[12].Value), intParse(match.Groups[16].Value));
                    }

                    if (matches.Count > 0)
                    {
                        continue;
                    }
                }


                {
                    var rgx     = new Regex(face_pattern4, RegexOptions.IgnoreCase);
                    var matches = rgx.Matches(line);

                    foreach (Match match in matches)
                    {
                        addFace(
                            intParse(match.Groups[2].Value), intParse(match.Groups[5].Value), intParse(match.Groups[8].Value), intParse(match.Groups[11].Value),
                            null, null, null, null,
                            intParse(match.Groups[3].Value), intParse(match.Groups[6].Value), intParse(match.Groups[9].Value), intParse(match.Groups[12].Value));
                    }

                    if (matches.Count > 0)
                    {
                        continue;
                    }
                }

                if (line.Contains("o "))
                {
                    this._geometry = new Geometry();

                    this._material = new Material();

                    this._object = new Objekt {
                        name = line.Substring(2, line.Length - 2).Trim(), Geometry = this._geometry, Material = this._material
                    };

                    this._objects.Add(this._object);

                    continue;
                }

                if (line.Contains("g "))
                {
                    // group
                    continue;
                }

                if (line.Contains("usemtl "))
                {
                    // material

                    this._material.name = line.Substring(7, line.Length - 7).Trim();

                    continue;
                }

                if (line.Contains("mtllib "))
                {
                    // mtl file
                    continue;
                }

                if (line.Contains("s "))
                {
                    // // smooth shading
                    continue;
                }

                Trace.TraceInformation("OBJLoader: Unhandled line " + line);
            }

            var container = new Object3D();

            for (var i = 0; i < this._objects.Count; i++)
            {
                var obj  = this._objects[i];
                var geom = obj.Geometry;

                var buffergeometry = new BufferGeometry();

                buffergeometry.AddAttribute("position", new BufferAttribute <float>(geom.Vertices.ToArray(), 3));

                if (geom.Normals.Count > 0)
                {
                    buffergeometry.AddAttribute("normal", new BufferAttribute <float>(geom.Normals.ToArray(), 3));
                }

                if (geom.Uvs.Count > 0)
                {
                    buffergeometry.AddAttribute("uv", new BufferAttribute <float>(geom.Uvs.ToArray(), 2));
                }

                var mat = new MeshLambertMaterial();
                mat.Name = obj.Material.name;

                var mesh = new Mesh(buffergeometry, mat);
                mesh.Name = obj.name;

                container.Add(mesh);
            }

            return(container);
        }
Exemplo n.º 7
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="control"></param>
        public override void Load(Control control)
        {
            base.Load(control);

            camera = new PerspectiveCamera(45, control.Width / (float)control.Height, 0.1f, 15000);
            this.camera.Position.Z = 1000;

            controls = new FlyControls(control, camera);
            controls.MovementSpeed = 1000.0f;
            controls.RollSpeed     = (float)Math.PI / 10;

            scene            = new Scene();
            scene.Fog        = new Fog(Color.Black, 1, 15000);
            scene.AutoUpdate = false;

            var light1 = new PointLight((Color)colorConvertor.ConvertFromString("#ff2200"));

            light1.Position = new Vector3(0, 0, 0);
            scene.Add(light1);

            var light2 = new DirectionalLight(Color.White);

            light2.Position = new Vector3(0, 0, 1).Normalize();
            scene.Add(light2);

            var geometry = new List <GeometryEx>();

            geometry.Add(new GeometryEx()
            {
                distance = 50, geometry = new IcosahedronGeometry(100, 4)
            });
            geometry.Add(new GeometryEx()
            {
                distance = 300, geometry = new IcosahedronGeometry(100, 3)
            });
            geometry.Add(new GeometryEx()
            {
                distance = 1000, geometry = new IcosahedronGeometry(100, 2)
            });
            geometry.Add(new GeometryEx()
            {
                distance = 2000, geometry = new IcosahedronGeometry(100, 1)
            });
            geometry.Add(new GeometryEx()
            {
                distance = 8000, geometry = new IcosahedronGeometry(100, 4)
            });

            var material = new MeshLambertMaterial()
            {
                Color = Color.White, Wireframe = true
            };

            for (var j = 0; j < 1000; j++)
            {
                var lod = new LOD();

                for (var i = 0; i < geometry.Count; i++)
                {
                    var mesh = new Mesh(geometry[i].geometry, material);
                    mesh.Scale = new Vector3(1.5f, 1.5f, 1.5f);
                    mesh.UpdateMatrix();
                    mesh.MatrixAutoUpdate = false;
                    lod.AddLevel(mesh, geometry[i].distance);
                }

                lod.Position.X = 10000 * (0.5f - Mat.Random());
                lod.Position.Y = 7500 * (0.5f - Mat.Random());
                lod.Position.Z = 10000 * (0.5f - Mat.Random());
                lod.UpdateMatrix();
                lod.MatrixAutoUpdate = false;
                scene.Add(lod);
            }

            renderer.SortObjects = false;
        }
Exemplo n.º 8
0
 public MorphAnimMesh(object geometry, MeshLambertMaterial material)
 {
     // TODO: Complete member initialization
     this.material = material;
 }