From f040ca36b238437685734b78792f07ab78f66c53 Mon Sep 17 00:00:00 2001 From: amandaghassaei <amandaghassaei@gmail.com> Date: Mon, 6 Mar 2017 02:09:07 -0500 Subject: [PATCH] added in crease reaction --- index.html | 52 +++++++++++++++++++++++++++++++++------------- js/controls.js | 2 +- js/crease.js | 19 ++++++++++++++++- js/dynamicModel.js | 23 ++++++++++++++------ js/node.js | 12 +++++++++++ 5 files changed, 86 insertions(+), 22 deletions(-) diff --git a/index.html b/index.html index 46cc853..0d81137 100644 --- a/index.html +++ b/index.html @@ -165,7 +165,7 @@ float nodeCreaseIndex1D = meta[2]+float(j); vec2 nodeCreaseIndex = vec2(mod(nodeCreaseIndex1D, u_textureDimNodeCreases.x)+0.5, floor(nodeCreaseIndex1D/u_textureDimNodeCreases.x)+0.5); vec2 scaledNodeCreaseIndex = nodeCreaseIndex/u_textureDimNodeCreases; - vec4 creaseMeta2 = texture2D(u_creaseMeta2, scaledNodeCreaseIndex);//[creaseIndex, length to node, nodeIndex (1/2)] + vec4 creaseMeta2 = texture2D(u_creaseMeta2, scaledNodeCreaseIndex);//[creaseIndex, length to node, nodeType (1 or 2), isReaction] float creaseIndex1D = creaseMeta2[0]; vec2 creaseIndex = vec2(mod(creaseIndex1D, u_textureDimCreases.x)+0.5, floor(creaseIndex1D/u_textureDimCreases.x)+0.5); @@ -174,21 +174,45 @@ vec4 thetas = texture2D(u_theta, scaledCreaseIndex); vec3 creaseMeta = texture2D(u_creaseMeta, scaledCreaseIndex).xyz;//[k, d, targetTheta] - float nodeNum = creaseMeta2[2]; - float normalIndex1D = thetas[2];//node #1 - float targetTheta = creaseMeta[2] * u_creasePercent; - if (nodeNum > 1.1) { - normalIndex1D = thetas[3];//node #2 + if (creaseMeta2[3] < 0.0){//crease reaction + float nodeNum = creaseMeta2[2]; + + //node #1 + float normalIndex1D = thetas[2]; + vec2 normalsIndex = vec2(mod(normalIndex1D, u_textureDimFaces.x)+0.5, floor(normalIndex1D/u_textureDimFaces.x)+0.5); + vec2 scaledNormalsIndex = normalsIndex/u_textureDimFaces; + vec3 normal1 = texture2D(u_normals, scaledNormalsIndex).xyz; + + //node #2 + normalIndex1D = thetas[3]; + normalsIndex = vec2(mod(normalIndex1D, u_textureDimFaces.x)+0.5, floor(normalIndex1D/u_textureDimFaces.x)+0.5); + scaledNormalsIndex = normalsIndex/u_textureDimFaces; + vec3 normal2 = texture2D(u_normals, scaledNormalsIndex).xyz; + + float targetTheta = creaseMeta[2] * u_creasePercent; + + float angForce = creaseMeta[0]*(targetTheta-thetas[0]);// + creaseMeta[1]*thetas[1]; + + vec3 _force = -0.5*(angForce/creaseMeta2[1]*normal1 + angForce/creaseMeta2[2]*normal2); + force += _force; + } else { + float nodeNum = creaseMeta2[2]; + float normalIndex1D = thetas[2];//node #1 + float targetTheta = creaseMeta[2] * u_creasePercent; + if (nodeNum > 1.1) { + normalIndex1D = thetas[3];//node #2 + } + vec2 normalsIndex = vec2(mod(normalIndex1D, u_textureDimFaces.x)+0.5, floor(normalIndex1D/u_textureDimFaces.x)+0.5); + vec2 scaledNormalsIndex = normalsIndex/u_textureDimFaces; + vec3 normal = texture2D(u_normals, scaledNormalsIndex).xyz; + + float angForce = creaseMeta[0]*(targetTheta-thetas[0]);// + creaseMeta[1]*thetas[1]; + float momentArm = creaseMeta2[1]; + + vec3 _force = angForce/momentArm*normal; + force += _force; } - vec2 normalsIndex = vec2(mod(normalIndex1D, u_textureDimFaces.x)+0.5, floor(normalIndex1D/u_textureDimFaces.x)+0.5); - vec2 scaledNormalsIndex = normalsIndex/u_textureDimFaces; - vec3 normal = texture2D(u_normals, scaledNormalsIndex).xyz; - float angForce = creaseMeta[0]*(targetTheta-thetas[0]);// + creaseMeta[1]*thetas[1]; - float momentArm = creaseMeta2[1]; - - vec3 _force = angForce/momentArm*normal; - force += _force; } vec3 velocity = force*u_dt/mass[0] + lastVelocity; diff --git a/js/controls.js b/js/controls.js index 25c3bc7..a3d1e2e 100644 --- a/js/controls.js +++ b/js/controls.js @@ -68,7 +68,7 @@ function initControls(globals){ globals.shouldResetDynamicSim = true; }); - setSliderInput("#creasePercent", globals.creasePercent, 0, 1, 0.01, function(val){ + setSliderInput("#creasePercent", globals.creasePercent, -1, 1, 0.01, function(val){ globals.creasePercent = val; globals.shouldChangeCreasePercent = true; }); diff --git a/js/crease.js b/js/crease.js index 74d0e9f..cee922a 100644 --- a/js/crease.js +++ b/js/crease.js @@ -2,10 +2,14 @@ * Created by amandaghassaei on 2/25/17. */ -function Crease(edge, face1Index, face2Index, targetTheta, type, node1, node2, index){//type = 0 panel, 1 crease +function Crease(edge, face1Index, face2Index, targetTheta, type, node1, node2, index){ + //type = 0 panel, 1 crease //face1 corresponds to node1, face2 to node2 this.edge = edge; + for (var i=0;i<edge.nodes.length;i++){ + edge.nodes[i].addInvCrease(this); + } this.face1Index = face1Index; this.face2Index = face2Index; this.targetTheta = targetTheta; @@ -51,6 +55,14 @@ Crease.prototype.getIndex = function(){ return this.index; }; +Crease.prototype.getLengthToNode1 = function(){ + return this.getLengthTo(this.node1); +}; + +Crease.prototype.getLengthToNode2 = function(){ + return this.getLengthTo(this.node2); +}; + Crease.prototype.getLengthTo = function(node){ var vector1 = this.getVector().normalize(); var nodePosition = node.getOriginalPosition(); @@ -69,6 +81,11 @@ Crease.prototype.getNodeIndex = function(node){ Crease.prototype.destroy = function(){ this.node1.removeCrease(this); this.node2.removeCrease(this); + if (this.edge && this.edge.nodes){ + for (var i=0;i<this.edge.nodes.length;i++){ + this.edge.nodes[i].removeInvCrease(this); + } + } this.edge = null; this.face1Index = null; this.face2Index = null; diff --git a/js/dynamicModel.js b/js/dynamicModel.js index 84ea445..a7c010b 100644 --- a/js/dynamicModel.js +++ b/js/dynamicModel.js @@ -28,7 +28,8 @@ function initDynamicModel(globals){ var normals; var creaseMeta;//[k, d, targetTheta] - var creaseMeta2;//[creaseIndex, length to node, nodeIndex (1/2)] + var creaseMeta2;//[creaseIndex (thetaIndex), length to node, nodeIndex (1/2), ] + //[creaseIndex (thetaIndex), length to node1, length to node2, -1] var creaseVectors;//vectors of oriented edges in crease var theta;//[theta, w, normalIndex1, normalIndex2] var lastTheta;//[theta, w, normalIndex1, normalIndex2] @@ -408,18 +409,19 @@ function initDynamicModel(globals){ } textureDimEdges = calcTextureSize(numEdges); + var numCreases = creases.length; + textureDimCreases = calcTextureSize(numCreases); + var numNodeCreases = 0; for (var i=0;i<nodes.length;i++){ numNodeCreases += nodes[i].numCreases(); } + numNodeCreases += numCreases*2; textureDimNodeCreases = calcTextureSize(numNodeCreases); var numFaces = geometry.faces.length; textureDimFaces = calcTextureSize(numFaces); - var numCreases = creases.length; - textureDimCreases = calcTextureSize(numCreases); - originalPosition = new Float32Array(textureDim*textureDim*4); position = new Float32Array(textureDim*textureDim*4); lastPosition = new Float32Array(textureDim*textureDim*4); @@ -459,11 +461,20 @@ function initDynamicModel(globals){ for (var i=0;i<nodes.length;i++){ meta[i*4+2] = index; var nodeCreases = nodes[i].creases; - meta[i*4+3] = nodeCreases.length; + var nodeInvCreases = nodes[i].invCreases; + // console.log(nodeInvCreases); + meta[i*4+3] = nodeCreases.length + nodeInvCreases.length; for (var j=0;j<nodeCreases.length;j++){ creaseMeta2[index*4] = nodeCreases[j].getIndex(); creaseMeta2[index*4+1] = nodeCreases[j].getLengthTo(nodes[i]); - creaseMeta2[index*4+2] = nodeCreases[j].getNodeIndex(nodes[i]); + creaseMeta2[index*4+2] = nodeCreases[j].getNodeIndex(nodes[i]);//type 1 or 2 + index++; + } + for (var j=0;j<nodeInvCreases.length;j++){ + creaseMeta2[index*4] = nodeInvCreases[j].getIndex(); + creaseMeta2[index*4+1] = nodeInvCreases[j].getLengthToNode1(); + creaseMeta2[index*4+2] = nodeInvCreases[j].getLengthToNode2(); + creaseMeta2[index*4+3] = -1; index++; } } diff --git a/js/node.js b/js/node.js index 9f76400..959d0f5 100644 --- a/js/node.js +++ b/js/node.js @@ -22,6 +22,7 @@ function Node(position, index){ this.beams = []; this.creases = []; + this.invCreases = []; this.externalForce = null; this.fixed = false; @@ -92,6 +93,16 @@ Node.prototype.removeCrease = function(crease){ if (index>=0) this.creases.splice(index, 1); }; +Node.prototype.addInvCrease = function(crease){ + this.invCreases.push(crease); +}; + +Node.prototype.removeInvCrease = function(crease){ + if (this.invCreases === null) return; + var index = this.invCreases.indexOf(crease); + if (index>=0) this.invCreases.splice(index, 1); +}; + Node.prototype.addBeam = function(beam){ this.beams.push(beam); @@ -187,5 +198,6 @@ Node.prototype.destroy = function(){ this.object3D = null; this.beams = null; this.creases = null; + this.invCreases = null; this.externalForce = null; }; \ No newline at end of file -- GitLab