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); }
public ClothSpring(ClothPoint cpA, ClothPoint cpB) { this.cpA = cpA; this.cpB = cpB; RestLength = (cpB.GetPosition() - cpA.GetPosition()).Length; }
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"); }