Esempio n. 1
0
        /// <summary>
        ///     Creates a mesh with a horizontal and vertical resolution indicated
        ///     by the input parameters.  It will generate
        ///     (precisionU-1)*(precisionV-1) quads.
        /// </summary>
        public MeshGeometry3D CreateMesh(int precisionU, int precisionV)
        {
            _lengthX = precisionU;
            _lengthY = precisionV;
            _du      = (UMax - UMin) / (precisionU - 1);
            _dv      = (VMax - VMin) / (precisionV - 1);

            _positions     = new Point3D[_lengthX, _lengthY];
            _normals       = new Vector3D[_lengthX, _lengthY];
            _textureCoords = new Point[_lengthX, _lengthY];
            _indices       = new ArrayList();

            var v = VMin;

            for (var y = 0; y < _lengthY; y++)
            {
                var u = UMin;
                if (y == _lengthY - 1)
                {
                    v = VMax;
                }
                for (var x = 0; x < _lengthX; x++)
                {
                    if (x == _lengthX - 1)
                    {
                        u = UMax;
                    }
                    VariableExpression.Define("u", u);
                    VariableExpression.Define("v", v);
                    _positions[x, y] = Evaluate();
                    _normals[x, y]   = GetNormal(u, v);
                    u += _du;
                }
                v += _dv;
            }
            VariableExpression.Undefine("u");
            VariableExpression.Undefine("v");

            SetTextureCoordinates();
            SetIndices();

            var mesh = new MeshGeometry3D();

            for (var y = 0; y < _lengthY; y++)
            {
                for (var x = 0; x < _lengthX; x++)
                {
                    mesh.Positions.Add(_positions[x, y]);
                    mesh.Normals.Add(_normals[x, y]);
                    mesh.TextureCoordinates.Add(_textureCoords[x, y]);
                }
            }
            mesh.TriangleIndices = new Int32Collection();
            foreach (int index in _indices)
            {
                mesh.TriangleIndices.Add(index);
            }

            return(mesh);
        }
        /// <summary>
        ///     Creates a mesh with a horizontal and vertical resolution indicated
        ///     by the input parameters.  It will generate
        ///     (precisionU-1)*(precisionV-1) quads.
        /// </summary>
        public Model3DGroup CreateWireframeModel(int precisionU, int precisionV)
        {
            _lengthX = precisionU;
            _lengthY = precisionV;
            _du      = (UMax - UMin) / (precisionU - 1);
            _dv      = (VMax - VMin) / (precisionV - 1);

            _positions = new Point3D[_lengthX, _lengthY];

            var v = VMin;

            for (var y = 0; y < _lengthY; y++)
            {
                var u = UMin;
                if (y == _lengthY - 1)
                {
                    v = VMax;
                }
                for (var x = 0; x < _lengthX; x++)
                {
                    if (x == _lengthX - 1)
                    {
                        u = UMax;
                    }
                    VariableExpression.Define("u", u);
                    VariableExpression.Define("v", v);
                    _positions[x, y] = Evaluate();
                    u += _du;
                }
                v += _dv;
            }
            VariableExpression.Undefine("u");
            VariableExpression.Undefine("v");

            var group = new Model3DGroup();

            // TODO: Remove
            //ScreenSpaceLines3D lines;

            /*
             * // Create Horizontal lines
             * for ( int y = 0; y < lengthY; y++ )
             * {
             *  lines = new ScreenSpaceLines3D();
             *  lines.Color = Colors.Black;
             *  lines.Thickness = 1;
             *  for ( int x = 0; x < lengthX; x++ )
             *  {
             *      lines.Points.Add( positions[ x,y ] );
             *  }
             *  group.Children.Add( lines );
             * }
             *
             * // Create Vertical lines
             * for ( int x = 0; x < lengthX; x++ )
             * {
             *  lines = new ScreenSpaceLines3D();
             *  lines.Color = Colors.Black;
             *  lines.Thickness = 1;
             *  for ( int y = 0; y < lengthY; y++ )
             *  {
             *      lines.Points.Add( positions[ x,y ] );
             *  }
             *  group.Children.Add( lines );
             * }
             */

            return(group);
        }