예제 #1
0
        private void ApplyTriangleForce(ClothPoint cpA, ClothPoint cpB, ClothPoint cpC, Vector3 force)
        {
            var pA          = cpA.GetPosition();
            var pB          = cpB.GetPosition();
            var pC          = cpC.GetPosition();
            var vAB         = pB - pA;
            var vAC         = pC - pA;
            var nABC        = Vector3.Cross(vAB, vAC).Normalized();
            var actualForce = Vector3.Dot(force, nABC) * nABC;

            cpA.ApplyForce(actualForce);
            cpB.ApplyForce(actualForce);
            cpC.ApplyForce(actualForce);
        }
예제 #2
0
 public ClothSpring(ClothPoint cpA, ClothPoint cpB)
 {
     this.cpA   = cpA;
     this.cpB   = cpB;
     RestLength = (cpB.GetPosition() - cpA.GetPosition()).Length;
 }
예제 #3
0
        private void Window_Load(object sender, EventArgs e)
        {
            GL.ClearColor(Color.FromArgb(0, 0, 0, 0));
            GL.Enable(EnableCap.DepthTest);
            GL.Enable(EnableCap.Texture2D);

            sceneShaderProgram = new ShaderProgram();
            sceneShaderProgram.CreateVertexShader(Utils.LoadShaderCode("vertex.glsl"));
            sceneShaderProgram.CreateFragmentShader(Utils.LoadShaderCode("fragment.glsl"));
            sceneShaderProgram.Link();
            sceneShaderProgram.CreateUniform("viewMatrix");
            sceneShaderProgram.CreateUniform("worldMatrix");
            sceneShaderProgram.CreateUniform("projectionMatrix");
            sceneShaderProgram.CreateUniform("texSampler");

            player = new Player(100f);
            player.SetRotationX(MathHelper.DegreesToRadians(-230f));
            player.SetRotationY(MathHelper.DegreesToRadians(-18f));
            player.SetPosition(new Vector3(-vertRows * gap / 4f, vertColumns * gap / 2, 450f));

            cPoints  = new List <ClothPoint>();
            cSprings = new List <ClothSpring>();

            for (var i = 0; i < vertRows; i++)
            {
                for (var j = 0; j < vertColumns; j++)
                {
                    var cPoint = new ClothPoint(GetIndex(i, j), j * gap, (vertRows - i - 1) * gap, 0f);
                    cPoint.SetColliderRadius(gap / 2);
                    cPoint.SetMass(0.35f);
                    cPoints.Add(cPoint);
                }
            }

            for (var i = 0; i < vertRows - 1; i++)
            {
                for (var j = 0; j < vertColumns - 1; j++)
                {
                    var pA = cPoints.ElementAt(GetIndex(i, j));
                    var pB = cPoints.ElementAt(GetIndex(i, j + 1));
                    var pC = cPoints.ElementAt(GetIndex(i + 1, j));
                    var pD = cPoints.ElementAt(GetIndex(i + 1, j + 1));

                    var sAB = new ClothSpring(pA, pB);
                    var sAC = new ClothSpring(pA, pC);
                    var sAD = new ClothSpring(pA, pD);
                    var sBC = new ClothSpring(pB, pC);

                    cSprings.Add(sAB);
                    cSprings.Add(sAC);
                    cSprings.Add(sAD);
                    cSprings.Add(sBC);
                }
            }

            for (var i = 0; i < vertRows - 1; i++)
            {
                var pLastA = cPoints.ElementAt(GetIndex(i, vertColumns - 1));
                var pLastB = cPoints.ElementAt(GetIndex(i + 1, vertColumns - 1));

                var sLastAB = new ClothSpring(pLastA, pLastB);

                cSprings.Add(sLastAB);
            }

            for (var j = 0; j < vertColumns - 1; j++)
            {
                var pLastA = cPoints.ElementAt(GetIndex(vertRows - 1, j));
                var pLastB = cPoints.ElementAt(GetIndex(vertRows - 1, j + 1));

                var sLastAB = new ClothSpring(pLastA, pLastB);

                cSprings.Add(sLastAB);
            }

            for (var i = 0; i < vertRows; i++)
            {
                cPoints.ElementAt(GetIndex(i, 0)).Lock();
                //cPoints.ElementAt(GetIndex(i, vertColumns - 1)).Lock();
            }

            for (var j = 0; j < vertColumns; j++)
            {
                //cPoints.ElementAt(GetIndex(0, j)).Lock();
                //cPoints.ElementAt(GetIndex(vertRows - 1, j)).Lock();
            }

            clothGrid = new ClothGrid(cPoints, vertRows, vertColumns, "Resources/USA.png");
        }