diff --git a/index.html b/index.html index 6b1485aa2e4a37047177fd7be11272aeafeedd89..11de474367426331f510a790a3a8ac753633c5a1 100755 --- a/index.html +++ b/index.html @@ -164,6 +164,12 @@ return texture2D(tex, scaledIndex); } + vec3 getPosition(float index1D){ + vec2 index = vec2(mod(index1D, u_textureDim.x)+0.5, floor(index1D/u_textureDim.x)+0.5); + vec2 scaledIndex = index/u_textureDim; + return texture2D(u_lastPosition, scaledIndex).xyz + texture2D(u_originalPosition, scaledIndex).xyz; + } + void main(){ vec2 fragCoord = gl_FragCoord.xy; vec2 scaledFragCoord = fragCoord/u_textureDim; @@ -266,24 +272,50 @@ if (j >= int(meta2[1])) break; vec4 faceMeta = getFromArray(meta2[0]+float(j), u_textureDimNodeFaces, u_nodeFaceMeta);//[face index, a, b, c] - vec3 nominalAngles = getFromArray(faceMeta.x, u_textureDimFaces, u_nominalTriangles).xyz;//[angA, angB, angC] + vec3 nominalAngles = getFromArray(faceMeta[0], u_textureDimFaces, u_nominalTriangles).xyz;//[angA, angB, angC] + + int faceIndex = 0; + if (faceMeta[2] < 0.0) faceIndex = 1; + if (faceMeta[3] < 0.0) faceIndex = 2; //get node positions - vec3 a = getFromArray(faceMeta[1], u_textureDim, u_lastPosition).xyz; - vec3 b = getFromArray(faceMeta[2], u_textureDim, u_lastPosition).xyz; - vec3 c = getFromArray(faceMeta[3], u_textureDim, u_lastPosition).xyz; + vec3 a = faceIndex == 0 ? lastPosition+originalPosition : getPosition(faceMeta[1]); + vec3 b = faceIndex == 1 ? lastPosition+originalPosition : getPosition(faceMeta[2]); + vec3 c = faceIndex == 2 ? lastPosition+originalPosition : getPosition(faceMeta[3]); //calc angles - vec3 ab = normalize(b-a); - vec3 ac = normalize(c-a); - vec3 bc = normalize(b-b); + vec3 ab = b-a; + vec3 ac = c-a; + vec3 bc = c-b; - float angA = acos(dot(ab, ac)); - float angB = acos(-1.0*dot(ab, bc)); - float angC = acos(dot(ac, bc)); + float lengthABsq = length(ab); + float lengthACsq = length(ac); + float lengthBCsq = length(bc); + lengthABsq *= lengthABsq; + lengthACsq *= lengthACsq; + lengthBCsq *= lengthBCsq; - //calc forces + vec3 angles = vec3(acos(dot(ab, ac)), acos(-1.0*dot(ab, bc)), acos(dot(ac, bc))); + vec3 anglesDiff = nominalAngles-angles; + + vec3 normal = getFromArray(faceMeta[0], u_textureDimFaces, u_normals).xyz; + //calc forces + float triangleStiffness = 0.1; + anglesDiff *= triangleStiffness; + if (faceIndex == 0){//a + force -= anglesDiff[0]*(cross(ac, normal)/lengthACsq - cross(ab, normal)/lengthABsq); + force += anglesDiff[1]*cross(-ab, normal)/lengthABsq; + force -= anglesDiff[2]*cross(-ac, normal)/lengthACsq; + } else if (faceIndex == 1){ + force -= anglesDiff[0]*cross(ab, normal)/lengthABsq; + force -= anglesDiff[1]*(cross(-ab, normal)/lengthABsq - cross(bc, normal)/lengthBCsq); + force += anglesDiff[2]*cross(-bc, normal)/lengthBCsq; + } else if (faceIndex == 2){ + force += anglesDiff[0]*cross(ac, normal)/lengthACsq; + force -= anglesDiff[1]*cross(bc, normal)/lengthBCsq; + force -= anglesDiff[2]*(cross(-bc, normal)/lengthBCsq - cross(-ac, normal)/lengthACsq); + } } @@ -412,7 +444,7 @@ vec3 node3 = getPosition(creaseMeta[2]); vec3 node4 = getPosition(creaseMeta[3]); - float tol = 0.01; + float tol = 0.000001; vec3 creaseVector = node4-node3; float creaseLength = length(creaseVector); @@ -633,6 +665,10 @@ <span class="label-slider">Axial Strength : </span><div class="flat-slider ui-slider ui-corner-all ui-slider-horizontal ui-widget ui-widget-content"></div> <input value="" placeholder="" class="form-control" type="text"> </div> + <div class="sliderInput paddingBottom" id="triStiffness"> + <span class="label-slider">Triangle Strength : </span><div class="flat-slider ui-slider ui-corner-all ui-slider-horizontal ui-widget ui-widget-content"></div> + <input value="" placeholder="" class="form-control" type="text"> + </div> <div class="sliderInput" id="creaseStiffness"> <span class="label-slider">Fold Strength : </span><div class="flat-slider ui-slider ui-corner-all ui-slider-horizontal ui-widget ui-widget-content"></div> <input value="" placeholder="" class="form-control" type="text"> diff --git a/js/controls.js b/js/controls.js index 7a0f5e8502426d1470c5c305af93f534f3f846dc..1fa8a130e994d8dbfff29294a497c575147428f5 100755 --- a/js/controls.js +++ b/js/controls.js @@ -179,6 +179,11 @@ function initControls(globals){ globals.materialHasChanged = true; }); + setSliderInput("#triStiffness", globals.triStiffness, 0, 10, 0.01, function(val){ + globals.triStiffness = val;//todo update + // globals.materialHasChanged = true; + }); + setSliderInput("#creaseStiffness", globals.creaseStiffness, 0, 3, 0.01, function(val){ globals.creaseStiffness = val; globals.creaseMaterialHasChanged = true; diff --git a/js/dynamic/dynamicSolver.js b/js/dynamic/dynamicSolver.js index 96158cf350d3498a60df949f2c46b1e777319c4b..3c96830bfa8d0ebaa17fc614bae4a12cf1770b41 100755 --- a/js/dynamic/dynamicSolver.js +++ b/js/dynamic/dynamicSolver.js @@ -556,9 +556,9 @@ function initDynamicSolver(globals){ var _index = (index+j)*4; var face = faces[nodeFaces[i][j]]; nodeFaceMeta[_index] = nodeFaces[i][j]; - nodeFaceMeta[_index+1] = face[0]; - nodeFaceMeta[_index+2] = face[1]; - nodeFaceMeta[_index+3] = face[2]; + nodeFaceMeta[_index+1] = face[0] == i ? -1 : face[0]; + nodeFaceMeta[_index+2] = face[1] == i ? -1 : face[1]; + nodeFaceMeta[_index+3] = face[2] == i ? -1 : face[2]; } index+=num; } diff --git a/js/globals.js b/js/globals.js index 9163d4d528675b7de9915525478547d4df687fc7..31925f9de5987a57b92d1d1dd5f14b057ebf129b 100755 --- a/js/globals.js +++ b/js/globals.js @@ -46,6 +46,7 @@ function initGlobals(){ axialStiffness: 20, creaseStiffness: 0.7, panelStiffness: 0.7, + triStiffness: 1, //dynamic sim settings percentDamping: 0.5,