public DisPreLink(JellyVertex a, JellyVertex b, float ks, float kd) { jva = a; jvb = b; KS = ks; KD = kd; OrgDistance = (a.Position - b.Position).Length(); }
public void GetVertices() { jellyVertices = new JellyVertex[mesh.vertices.Length]; currentMeshVertices = mesh.vertices; for (int i = 0; i < mesh.vertices.Length; i++) { jellyVertices[i] = new JellyVertex(i, mesh.vertices[i], mesh.vertices[i], Vector3.zero); } }
private void GetVertices() { jellyVerts = new JellyVertex[mesh.vertices.Length]; currentMeshVerts = new Vector3[mesh.vertices.Length]; for (int i = 0; i < mesh.vertices.Length; i++) { jellyVerts[i] = new JellyVertex(i, mesh.vertices[i], mesh.vertices[i], Vector3.zero); currentMeshVerts[i] = mesh.vertices[i]; } }
private void GetVertices() { _jellyVertices = new JellyVertex[_mesh.vertices.Length]; currentMeshVertices = new Vector3[_mesh.vertices.Length]; for (int i = 0; i < _mesh.vertices.Length; i++) { _jellyVertices[i] = new JellyVertex(i, _mesh.vertices[i], _mesh.vertices[i], Vector3.zero); currentMeshVertices[i] = _mesh.vertices[i]; } }
public ArePreLink(JellyVertex a, JellyVertex b, JellyVertex c, float ka, JellyVector2 nab, JellyVector2 nbc, JellyVector2 nca) { jva = a; jvb = b; jvc = c; KA = ka; NorAB = nab; NorBC = nbc; NorCA = nca; OrgDoubleArea = DoubleArea; }
// Awake is called when the gameobject becomes active void Awake() { OriginalMesh = GetComponent <MeshFilter>().sharedMesh; MeshClone = Instantiate(OriginalMesh); GetComponent <MeshFilter>().sharedMesh = MeshClone; renderer = GetComponent <MeshRenderer>(); jv = new JellyVertex[MeshClone.vertices.Length]; for (int i = 0; i < MeshClone.vertices.Length; i++) { jv[i] = new JellyVertex(i, transform.TransformPoint(MeshClone.vertices[i])); } }
// Start is called before the first frame update void Start() { baseScale = transform.localScale; OriginalMesh = GetComponent <MeshFilter>().sharedMesh; MeshClone = Instantiate(OriginalMesh); GetComponent <MeshFilter>().sharedMesh = MeshClone; flubberRenderer = GetComponent <MeshRenderer>(); jv = new JellyVertex[MeshClone.vertices.Length]; for (int i = 0; i < MeshClone.vertices.Length; i++) { jv[i] = new JellyVertex(i, transform.TransformPoint(MeshClone.vertices[i])); } }
private void Start() { _originalMesh = GetComponent <MeshFilter>().sharedMesh; _cloneMesh = Instantiate(_originalMesh); GetComponent <MeshFilter>().sharedMesh = _cloneMesh; _meshRenderer = GetComponent <MeshRenderer>(); _jellyVertexes = new JellyVertex[_cloneMesh.vertices.Length]; for (int i = 0; i < _jellyVertexes.Length; i++) { _jellyVertexes[i] = new JellyVertex(i, transform.TransformPoint(_cloneMesh.vertices[i])); } }
private void Start() { originalMesh = GetComponent <MeshFilter>().sharedMesh; cloneMesh = Instantiate(originalMesh); GetComponent <MeshFilter>().sharedMesh = cloneMesh; meshRenderer = GetComponent <MeshRenderer>(); rg = GetComponent <Rigidbody>(); jv = new JellyVertex[cloneMesh.vertices.Length]; for (int i = 0; i < cloneMesh.vertices.Length; i++) { jv[i] = new JellyVertex(i, transform.TransformPoint(cloneMesh.vertices[i])); } }
private void GetVertices() { jellyVertices = new JellyVertex[mesh.vertices.Length]; currentMeshVertices = new Vector3[mesh.vertices.Length]; for (int i = 0; i < mesh.vertices.Length; i++) { jellyVertices[i] = new JellyVertex(i, mesh.vertices[i], mesh.vertices[i], Vector3.zero); currentMeshVertices[i] = mesh.vertices[i]; } mesh.vertices = currentMeshVertices; mesh.RecalculateBounds(); mesh.RecalculateNormals(); mesh.RecalculateTangents(); }
public JellyDouble(GraphicsDevice gd, float mass, float size, Color color, JellyVector2 pos) : base(gd, mass, size, color, 6) { //nodes _nodes = new JellyVertex[8]; _nodes[0] = new JellyVertex(new JellyVector2(pos.X + -2 * size, pos.Y + 1 * size)); _nodes[1] = new JellyVertex(new JellyVector2(pos.X + 0 * size, pos.Y + 1 * size)); _nodes[2] = new JellyVertex(new JellyVector2(pos.X + 2 * size, pos.Y + 1 * size)); _nodes[3] = new JellyVertex(new JellyVector2(pos.X + -1 * size, pos.Y + 0 * size)); _nodes[4] = new JellyVertex(new JellyVector2(pos.X + 1 * size, pos.Y + 0 * size)); _nodes[5] = new JellyVertex(new JellyVector2(pos.X + -2 * size, pos.Y + -1 * size)); _nodes[6] = new JellyVertex(new JellyVector2(pos.X + 0 * size, pos.Y + -1 * size)); _nodes[7] = new JellyVertex(new JellyVector2(pos.X + 2 * size, pos.Y + -1 * size)); InitExceptNode(); }
void Start() { MeshFilter mesh = GetComponent <MeshFilter>(); renderer = GetComponent <MeshRenderer>(); originalMesh = mesh.sharedMesh; clonedMesh = Instantiate(originalMesh); mesh.sharedMesh = clonedMesh; Vector3[] vertices = originalMesh.vertices; jellyVertices = new JellyVertex[vertices.Length]; for (int i = 0; i < vertices.Length; ++i) { jellyVertices[i] = new JellyVertex(transform.TransformPoint(vertices[i])); } }
internal JellyDouble(GraphicsDevice gd, float mass, float size, Color col, JellyVector2 a, JellyVector2 b) : base(gd, mass, size, col, 6) { //nodes _nodes = new JellyVertex[8]; JellyVector2 mid = (a + b) * 0.5f; _nodes[0] = new JellyVertex(new JellyVector2(mid.X + -2 * size, mid.Y + 1 * size)); _nodes[1] = new JellyVertex(new JellyVector2(mid.X + 0 * size, mid.Y + 1 * size)); _nodes[2] = new JellyVertex(new JellyVector2(mid.X + 2 * size, mid.Y + 1 * size)); _nodes[3] = new JellyVertex(new JellyVector2(mid.X + -1 * size, mid.Y + 0 * size)); _nodes[4] = new JellyVertex(new JellyVector2(mid.X + 1 * size, mid.Y + 0 * size)); _nodes[5] = new JellyVertex(new JellyVector2(mid.X + -2 * size, mid.Y + -1 * size)); _nodes[6] = new JellyVertex(new JellyVector2(mid.X + 0 * size, mid.Y + -1 * size)); _nodes[7] = new JellyVertex(new JellyVector2(mid.X + 2 * size, mid.Y + -1 * size)); InitExceptNode(); }
void FixedUpdate() { vertices = originalMesh.vertices; for (int i = 0; i < jellyVertices.Length; ++i) { JellyVertex jellyVertex = jellyVertices[i]; Vector3 vertex = vertices[i]; Vector3 target = transform.TransformPoint(vertex); float factor = (1 - (renderer.bounds.max.y - target.y) / renderer.bounds.size.y) * intensity; jellyVertex.Shake(target, mass, stiffness, damping); target = transform.InverseTransformPoint(jellyVertex.position); vertices[i] = Vector3.Lerp(vertex, target, factor); } clonedMesh.vertices = vertices; }
public JellyBox(GraphicsDevice gd, float mass, float size, Color color, JellyVector2 pos) : base(gd, mass, size, color, 4) { //nodes _nodes = new JellyVertex[5]; _nodes[0] = new JellyVertex(new JellyVector2(pos.X + -1 * size, pos.Y + 1 * size)); _nodes[1] = new JellyVertex(new JellyVector2(pos.X + 1 * size, pos.Y + 1 * size)); _nodes[2] = new JellyVertex(new JellyVector2(pos.X + 0 * size, pos.Y + 0 * size)); _nodes[3] = new JellyVertex(new JellyVector2(pos.X + -1 * size, pos.Y + -1 * size)); _nodes[4] = new JellyVertex(new JellyVector2(pos.X + 1 * size, pos.Y + -1 * size)); //distance links float KS = JellyWorld.KS; float KD = JellyWorld.KD; _disprelinks = new DisPreLink[8]; _disprelinks[0] = new DisPreLink(_nodes[0], _nodes[1], KS, KD); _disprelinks[1] = new DisPreLink(_nodes[1], _nodes[4], KS, KD); _disprelinks[2] = new DisPreLink(_nodes[4], _nodes[3], KS, KD); _disprelinks[3] = new DisPreLink(_nodes[3], _nodes[0], KS, KD); _disprelinks[4] = new DisPreLink(_nodes[2], _nodes[0], KS, KD); _disprelinks[5] = new DisPreLink(_nodes[2], _nodes[1], KS, KD); _disprelinks[6] = new DisPreLink(_nodes[2], _nodes[4], KS, KD); _disprelinks[7] = new DisPreLink(_nodes[2], _nodes[3], KS, KD); //area links float KA = JellyWorld.KA; _areprelinks = new ArePreLink[4]; _areprelinks[0] = new ArePreLink(_nodes[2], _nodes[1], _nodes[0], KA, _disprelinks[5].PosNormal, _disprelinks[0].NegNormal, _disprelinks[4].NegNormal); _areprelinks[1] = new ArePreLink(_nodes[2], _nodes[4], _nodes[1], KA, _disprelinks[6].PosNormal, _disprelinks[1].NegNormal, _disprelinks[5].NegNormal); _areprelinks[2] = new ArePreLink(_nodes[2], _nodes[3], _nodes[4], KA, _disprelinks[7].PosNormal, _disprelinks[2].NegNormal, _disprelinks[6].NegNormal); _areprelinks[3] = new ArePreLink(_nodes[2], _nodes[0], _nodes[3], KA, _disprelinks[4].PosNormal, _disprelinks[3].NegNormal, _disprelinks[7].NegNormal); //edges _edge[0] = _nodes[0]; _edge[1] = _nodes[1]; _edge[2] = _nodes[4]; _edge[3] = _nodes[3]; //edges' normals _edgenor[0] = _disprelinks[0].NegNormal; _edgenor[1] = _disprelinks[1].NegNormal; _edgenor[2] = _disprelinks[2].NegNormal; _edgenor[3] = _disprelinks[3].NegNormal; _cellNodes = new int[] { 2 }; _extverid = new int[] { 2 }; short[] tri = { ExtVIdx(4, 0), ExtVIdx(4, 0), ExtVIdx(4, 0), ExtVIdx(4, 0) }; short[] e_tri = { }; //XNA InitXNA(1, tri, e_tri); SetupUV(); _texture = ResourceManager.LoadImage("Jelly/Jelly_Base_1"); _face_node_id = 2; }
public JellyTShape(GraphicsDevice gd, float mass, float size, Color color, JellyVector2 pos) : base(gd, mass, size, color, 10) { //nodes _nodes = new JellyVertex[14]; _nodes[0] = new JellyVertex(new JellyVertex(pos.X + -1 * size, pos.Y + 2 * size)); _nodes[1] = new JellyVertex(new JellyVertex(pos.X + 1 * size, pos.Y + 2 * size)); _nodes[2] = new JellyVertex(new JellyVertex(pos.X + 0 * size, pos.Y + 1 * size)); _nodes[3] = new JellyVertex(new JellyVertex(pos.X + -3 * size, pos.Y + 0 * size)); _nodes[4] = new JellyVertex(new JellyVertex(pos.X + -1 * size, pos.Y + 0 * size)); _nodes[5] = new JellyVertex(new JellyVertex(pos.X + 1 * size, pos.Y + 0 * size)); _nodes[6] = new JellyVertex(new JellyVertex(pos.X + 3 * size, pos.Y + 0 * size)); _nodes[7] = new JellyVertex(new JellyVertex(pos.X + -2 * size, pos.Y + -1 * size)); _nodes[8] = new JellyVertex(new JellyVertex(pos.X + 0 * size, pos.Y + -1 * size)); _nodes[9] = new JellyVertex(new JellyVertex(pos.X + 2 * size, pos.Y + -1 * size)); _nodes[10] = new JellyVertex(new JellyVertex(pos.X + -3 * size, pos.Y + -2 * size)); _nodes[11] = new JellyVertex(new JellyVertex(pos.X + -1 * size, pos.Y + -2 * size)); _nodes[12] = new JellyVertex(new JellyVertex(pos.X + 1 * size, pos.Y + -2 * size)); _nodes[13] = new JellyVertex(new JellyVertex(pos.X + 3 * size, pos.Y + -2 * size)); //distance links float KS = JellyWorld.KS; float KD = JellyWorld.KD; _disprelinks = new DisPreLink[29]; _disprelinks[0] = new DisPreLink(_nodes[0], _nodes[1], KS, KD); _disprelinks[1] = new DisPreLink(_nodes[1], _nodes[5], KS, KD); _disprelinks[2] = new DisPreLink(_nodes[5], _nodes[6], KS, KD); _disprelinks[3] = new DisPreLink(_nodes[6], _nodes[13], KS, KD); _disprelinks[4] = new DisPreLink(_nodes[13], _nodes[12], KS, KD); _disprelinks[5] = new DisPreLink(_nodes[12], _nodes[11], KS, KD); _disprelinks[6] = new DisPreLink(_nodes[11], _nodes[10], KS, KD); _disprelinks[7] = new DisPreLink(_nodes[10], _nodes[3], KS, KD); _disprelinks[8] = new DisPreLink(_nodes[3], _nodes[4], KS, KD); _disprelinks[9] = new DisPreLink(_nodes[4], _nodes[0], KS, KD); _disprelinks[10] = new DisPreLink(_nodes[5], _nodes[4], KS, KD); _disprelinks[11] = new DisPreLink(_nodes[5], _nodes[12], KS, KD); _disprelinks[12] = new DisPreLink(_nodes[4], _nodes[11], KS, KD); _disprelinks[13] = new DisPreLink(_nodes[2], _nodes[0], KS, KD); _disprelinks[14] = new DisPreLink(_nodes[2], _nodes[1], KS, KD); _disprelinks[15] = new DisPreLink(_nodes[2], _nodes[5], KS, KD); _disprelinks[16] = new DisPreLink(_nodes[2], _nodes[4], KS, KD); _disprelinks[17] = new DisPreLink(_nodes[8], _nodes[4], KS, KD); _disprelinks[18] = new DisPreLink(_nodes[8], _nodes[5], KS, KD); _disprelinks[19] = new DisPreLink(_nodes[8], _nodes[12], KS, KD); _disprelinks[20] = new DisPreLink(_nodes[8], _nodes[11], KS, KD); _disprelinks[21] = new DisPreLink(_nodes[7], _nodes[3], KS, KD); _disprelinks[22] = new DisPreLink(_nodes[7], _nodes[4], KS, KD); _disprelinks[23] = new DisPreLink(_nodes[7], _nodes[11], KS, KD); _disprelinks[24] = new DisPreLink(_nodes[7], _nodes[10], KS, KD); _disprelinks[25] = new DisPreLink(_nodes[9], _nodes[5], KS, KD); _disprelinks[26] = new DisPreLink(_nodes[9], _nodes[6], KS, KD); _disprelinks[27] = new DisPreLink(_nodes[9], _nodes[13], KS, KD); _disprelinks[28] = new DisPreLink(_nodes[9], _nodes[12], KS, KD); //area links float KA = JellyWorld.KA; _areprelinks = new ArePreLink[16]; _areprelinks[0] = new ArePreLink(_nodes[2], _nodes[1], _nodes[0], KA, _disprelinks[14].PosNormal, _disprelinks[0].NegNormal, _disprelinks[13].NegNormal); _areprelinks[1] = new ArePreLink(_nodes[2], _nodes[5], _nodes[1], KA, _disprelinks[15].PosNormal, _disprelinks[1].NegNormal, _disprelinks[14].NegNormal); _areprelinks[2] = new ArePreLink(_nodes[2], _nodes[4], _nodes[5], KA, _disprelinks[16].PosNormal, _disprelinks[10].NegNormal, _disprelinks[15].NegNormal); _areprelinks[3] = new ArePreLink(_nodes[2], _nodes[0], _nodes[4], KA, _disprelinks[13].PosNormal, _disprelinks[9].NegNormal, _disprelinks[16].NegNormal); _areprelinks[4] = new ArePreLink(_nodes[7], _nodes[4], _nodes[3], KA, _disprelinks[22].PosNormal, _disprelinks[8].NegNormal, _disprelinks[21].NegNormal); _areprelinks[5] = new ArePreLink(_nodes[7], _nodes[11], _nodes[4], KA, _disprelinks[23].PosNormal, _disprelinks[12].NegNormal, _disprelinks[22].NegNormal); _areprelinks[6] = new ArePreLink(_nodes[7], _nodes[10], _nodes[11], KA, _disprelinks[24].PosNormal, _disprelinks[6].NegNormal, _disprelinks[23].NegNormal); _areprelinks[7] = new ArePreLink(_nodes[7], _nodes[3], _nodes[10], KA, _disprelinks[21].PosNormal, _disprelinks[7].NegNormal, _disprelinks[24].NegNormal); _areprelinks[8] = new ArePreLink(_nodes[8], _nodes[5], _nodes[4], KA, _disprelinks[18].PosNormal, _disprelinks[10].PosNormal, _disprelinks[17].NegNormal); _areprelinks[9] = new ArePreLink(_nodes[8], _nodes[12], _nodes[5], KA, _disprelinks[19].PosNormal, _disprelinks[11].NegNormal, _disprelinks[18].NegNormal); _areprelinks[10] = new ArePreLink(_nodes[8], _nodes[11], _nodes[12], KA, _disprelinks[20].PosNormal, _disprelinks[5].NegNormal, _disprelinks[19].NegNormal); _areprelinks[11] = new ArePreLink(_nodes[8], _nodes[4], _nodes[11], KA, _disprelinks[17].PosNormal, _disprelinks[12].PosNormal, _disprelinks[20].NegNormal); _areprelinks[12] = new ArePreLink(_nodes[9], _nodes[6], _nodes[5], KA, _disprelinks[26].PosNormal, _disprelinks[2].NegNormal, _disprelinks[25].NegNormal); _areprelinks[13] = new ArePreLink(_nodes[9], _nodes[13], _nodes[6], KA, _disprelinks[27].PosNormal, _disprelinks[3].NegNormal, _disprelinks[26].NegNormal); _areprelinks[14] = new ArePreLink(_nodes[9], _nodes[12], _nodes[13], KA, _disprelinks[28].PosNormal, _disprelinks[4].NegNormal, _disprelinks[27].NegNormal); _areprelinks[15] = new ArePreLink(_nodes[9], _nodes[5], _nodes[12], KA, _disprelinks[25].PosNormal, _disprelinks[11].PosNormal, _disprelinks[28].NegNormal); //edges _edge[0] = _nodes[0]; _edge[1] = _nodes[1]; _edge[2] = _nodes[5]; _edge[3] = _nodes[6]; _edge[4] = _nodes[13]; _edge[5] = _nodes[12]; _edge[6] = _nodes[11]; _edge[7] = _nodes[10]; _edge[8] = _nodes[3]; _edge[9] = _nodes[4]; //edges' normals _edgenor[0] = _disprelinks[0].NegNormal; _edgenor[1] = _disprelinks[1].NegNormal; _edgenor[2] = _disprelinks[2].NegNormal; _edgenor[3] = _disprelinks[3].NegNormal; _edgenor[4] = _disprelinks[4].NegNormal; _edgenor[5] = _disprelinks[5].NegNormal; _edgenor[6] = _disprelinks[6].NegNormal; _edgenor[7] = _disprelinks[7].NegNormal; _edgenor[8] = _disprelinks[8].NegNormal; _edgenor[9] = _disprelinks[9].NegNormal; _cellNodes = new int[] { 2, 7, 8, 9 }; _extverid = new int[] { 2, 7, 8, 9 }; short[] tri = { ExtVIdx(10, 0), ExtVIdx(10, 0), ExtVIdx(10, 3), ExtVIdx(10, 3),ExtVIdx(10, 3), ExtVIdx(10, 2), ExtVIdx(10, 1), ExtVIdx(10, 1),ExtVIdx(10, 1), ExtVIdx(10, 0) }; short[] e_tri = { EgeVIdx(9), EgeVIdx(2), ExtVIdx(10, 0), EgeVIdx(9), EgeVIdx(2), ExtVIdx(10, 2), EgeVIdx(5), EgeVIdx(2), ExtVIdx(10, 2), EgeVIdx(5), EgeVIdx(2), ExtVIdx(10, 3), EgeVIdx(9), EgeVIdx(6), ExtVIdx(10, 2), EgeVIdx(9), EgeVIdx(6), ExtVIdx(10, 1) }; //XNA InitXNA(4, tri, e_tri); SetupUV(); _texture = ResourceManager.LoadImage("Jelly/Jelly_Base_1"); _face_node_id = 8; }
public static void ProcessEdgeForce(JellyVertex[] polygon, JellyVertex jv) { if (JellyMath.PointInPolygon(polygon, jv.Position, new JellyVector2(-10000, -10000))) { jv.Velocity.X = -jv.Velocity.X * JellyWorld.Friciton; jv.Velocity.Y = -jv.Velocity.Y * JellyWorld.Friciton; jv.FX = jv.FY = 0; jv.Position = ClosestPoint(jv.Position, polygon); } else { #if _DIS_RANGE_ const float threshold = 44.7213595499958f; #else const float threshold = 3162.27766016838f; #endif const float forcek = 100000; int i = 0; JellyVector2 cpt; bool inVertex, inThreshold, inBack; while (i < polygon.Length - 1) { FindClosestPointThreshold(jv.Position, polygon[i].Position, polygon[i + 1].Position, threshold * threshold, out cpt, out inVertex, out inThreshold, out inBack); ++i; if (!inBack && inThreshold) { JellyVector2 diff = jv.Position - cpt; float dissq = diff.LengthSquared(); dissq = dissq == 0 ? 0.001f : dissq; #if _DIS_RANGE_ float norsize = forcek / dissq - 50; #else float norsize = forcek / dissq; #endif norsize = norsize < 0 ? 0 : norsize; if (inVertex) { norsize *= 0.5f; } diff.Normalize(); diff *= norsize; jv.Force += diff; } } FindClosestPointThreshold(jv.Position, polygon[i].Position, polygon[0].Position, threshold * threshold, out cpt, out inVertex, out inThreshold, out inBack); if (!inBack && inThreshold) { JellyVector2 diff = jv.Position - cpt; float dissq = diff.LengthSquared(); dissq = dissq == 0 ? 0.001f : dissq; #if _DIS_RANGE_ float norsize = forcek / dissq - 50; #else float norsize = forcek / dissq; #endif norsize = norsize < 0 ? 0 : norsize; if (inVertex) { norsize *= 0.5f; } diff.Normalize(); diff *= norsize; jv.Force += diff; } } }
private void UpdateVertex(JellyVertex jv, float delay) { jv.Integrate(delay, Mass); jv.Restrict(); }