{"id":1434,"date":"2012-11-12T00:47:39","date_gmt":"2012-11-11T21:47:39","guid":{"rendered":"http:\/\/unitycoder.com\/blog\/?p=1434"},"modified":"2014-12-18T17:12:17","modified_gmt":"2014-12-18T14:12:17","slug":"marching-tetrahedrons","status":"publish","type":"post","link":"https:\/\/unitycoder.com\/blog\/2012\/11\/12\/marching-tetrahedrons\/","title":{"rendered":"Marching Tetrahedrons"},"content":{"rendered":"<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"1435\" data-permalink=\"https:\/\/unitycoder.com\/blog\/2012\/11\/12\/marching-tetrahedrons\/marching_tetrahedrons_unity3d_1\/\" data-orig-file=\"https:\/\/i0.wp.com\/unitycoder.com\/blog\/wp-content\/uploads\/2012\/11\/marching_tetrahedrons_unity3d_1.jpg?fit=680%2C507&amp;ssl=1\" data-orig-size=\"680,507\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}\" data-image-title=\"marching_tetrahedrons_unity3d_1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/unitycoder.com\/blog\/wp-content\/uploads\/2012\/11\/marching_tetrahedrons_unity3d_1.jpg?fit=680%2C507&amp;ssl=1\" class=\"alignnone size-full wp-image-1435\" title=\"marching_tetrahedrons_unity3d_1\" src=\"https:\/\/i0.wp.com\/unitycoder.com\/blog\/wp-content\/uploads\/2012\/11\/marching_tetrahedrons_unity3d_1.jpg?resize=680%2C507\" alt=\"\" width=\"680\" height=\"507\" srcset=\"https:\/\/i0.wp.com\/unitycoder.com\/blog\/wp-content\/uploads\/2012\/11\/marching_tetrahedrons_unity3d_1.jpg?w=680&amp;ssl=1 680w, https:\/\/i0.wp.com\/unitycoder.com\/blog\/wp-content\/uploads\/2012\/11\/marching_tetrahedrons_unity3d_1.jpg?resize=300%2C223&amp;ssl=1 300w\" sizes=\"auto, (max-width: 680px) 100vw, 680px\" \/><\/p>\n<p>Tried to convert this\u00a0 <a title=\"http:\/\/mikolalysenko.github.com\/Isosurface\/\" href=\"http:\/\/mikolalysenko.github.com\/Isosurface\/\" target=\"_blank\">marching tetrahedrons<\/a> (<em>by Mikola Lysenko<\/em>) to Unity Javascript.. but its not working yet (^ that should be a sphere..)<\/p>\n<p><strong>Source (bugged, see the original source above and try to fix this?..<\/strong>Oo<strong> )<\/strong><\/p>\n<p><em>** See comments section for fixed version<\/em><\/p>\n<p>\/\/#pragma strict<br \/>\nimport System.Collections.Generic;<\/p>\n<p>var res = new Array(3);<br \/>\nprivate var\u00a0 grid:float[] = new float[8];<br \/>\nprivate \u00a0\u00a0 \u00a0var cube_vertices = [<br \/>\n[0,0,0]<br \/>\n, [1,0,0]<br \/>\n, [1,1,0]<br \/>\n, [0,1,0]<br \/>\n, [0,0,1]<br \/>\n, [1,0,1]<br \/>\n, [1,1,1]<br \/>\n, [0,1,1] ];<\/p>\n<p>private var\u00a0 x:int[] = new int[3];<br \/>\nprivate var vertices:List.<Vector3> = new List.<Vector3>();<br \/>\nprivate var faces:List.<int> = new List.<int>();<\/p>\n<p>function Awake ()<br \/>\n{<br \/>\nx[0]=0;<br \/>\nx[1]=0;<br \/>\nx[2]=0;<br \/>\n}<\/p>\n<p>function Start ()<br \/>\n{<br \/>\nvar verts:Vector3[] = MarchingTetrahedra(makeVolume(),res);<br \/>\nvar triangles : int[] = faces.ToArray();<\/p>\n<p>for (var n=0;n<triangles.length;n++)\n{\n\/\/print (triangles[n]);\n}\nvar mesh : Mesh = GetComponent(MeshFilter).mesh;\nmesh.vertices = verts;\nmesh.triangles = triangles;\nmesh.RecalculateBounds();\n}\n\n\/**\n* Marching Tetrahedra in Javascript\n*\n* Based on Paul Bourke's implementation\n*\u00a0 http:\/\/local.wasp.uwa.edu.au\/~pbourke\/geometry\/polygonise\/\n*\n* (Several bug fixes were made to deal with oriented faces)\n*\n* Javascript port by Mikola Lysenko : http:\/\/0fps.wordpress.com\/\n*\/\nfunction MarchingTetrahedra(data, dims)\n{\nvar tetra_list = [\n[0,2,3,7]\n, [0,6,2,7]\n, [0,4,6,7]\n, [0,6,1,2]\n, [0,1,6,4]\n, [5,6,1,4] ];\n\nvar\u00a0 n:int = 0;\nvar\u00a0 edges:int[] = new int[12];\n\n\/\/March over the volume\nfor (x[2]=0; x[2]<dims[2]-1; ++x[2])\n{\nfor(x[1]=0; x[1]<dims[1]-1; ++x[1])\n{\nfor(x[0]=0; x[0]<dims[0]-1; ++x[0])\n{\n\/\/Read in cube\nfor(var i=0; i<8; ++i)\n{\ngrid[i] = data[n + cube_vertices[i][0] + dims[0] * (cube_vertices[i][1] + dims[1] * cube_vertices[i][2])];\n}\n\nfor(i=0; i<tetra_list.length; ++i)\n{\nvar T:int[] = tetra_list[i];\nvar triindex:int = 0;\nif (grid[T[0]] < 0) triindex |= 1;\nif (grid[T[1]] < 0) triindex |= 2;\nif (grid[T[2]] < 0) triindex |= 4;\nif (grid[T[3]] < 0) triindex |= 8;\n\n\/\/Handle each case\nswitch (triindex)\n{\ncase 0x00:\ncase 0x0F:\nbreak;\ncase 0x0E:\nfaces.Add(interp(T[0],T[1]));\nfaces.Add(interp(T[0],T[3]));\nfaces.Add(interp(T[0],T[2]));\nbreak;\ncase 0x01:\nfaces.Add(interp(T[0], T[1]));\nfaces.Add(interp(T[0], T[2]));\nfaces.Add(interp(T[0], T[3]));\nbreak;\ncase 0x0D:\nfaces.Add(interp(T[1], T[0]));\nfaces.Add(interp(T[1], T[2]));\nfaces.Add(interp(T[1], T[3]));\nbreak;\ncase 0x02:\nfaces.Add(interp(T[1], T[0]));\nfaces.Add(interp(T[1], T[3]));\nfaces.Add(interp(T[1], T[2]));\nbreak;\ncase 0x0C:\nfaces.Add(interp(T[1], T[2]));\nfaces.Add(interp(T[1], T[3]));\nfaces.Add(interp(T[0], T[3]));\nfaces.Add(interp(T[0], T[2]));\nbreak;\ncase 0x03:\nfaces.Add(interp(T[1], T[2]));\nfaces.Add(interp(T[0], T[2]));\nfaces.Add(interp(T[0], T[3]));\nfaces.Add(interp(T[1], T[3]));\nbreak;\ncase 0x04:\nfaces.Add(interp(T[2], T[0]));\nfaces.Add(interp(T[2], T[1]));\nfaces.Add(interp(T[2], T[3]));\nbreak;\ncase 0x0B:\nfaces.Add(interp(T[2], T[0]));\nfaces.Add(interp(T[2], T[3]));\nfaces.Add(interp(T[2], T[1]));\nbreak;\ncase 0x05:\nfaces.Add(interp(T[0], T[1]));\nfaces.Add(interp(T[1], T[2]));\nfaces.Add(interp(T[2], T[3]));\nfaces.Add(interp(T[0], T[3]));\nbreak;\ncase 0x0A:\nfaces.Add(interp(T[0], T[1]));\nfaces.Add(interp(T[0], T[3]));\nfaces.Add(interp(T[2], T[3]));\nfaces.Add(interp(T[1], T[2]));\nbreak;\ncase 0x06:\nfaces.Add(interp(T[2], T[3]));\nfaces.Add(interp(T[0], T[2]));\nfaces.Add(interp(T[0], T[1]));\nfaces.Add(interp(T[1], T[3]));\nbreak;\ncase 0x09:\nfaces.Add(interp(T[2], T[3]));\nfaces.Add(interp(T[1], T[3]));\nfaces.Add(interp(T[0], T[1]));\nfaces.Add(interp(T[0], T[2]));\nbreak;\ncase 0x07:\nfaces.Add(interp(T[3], T[0]));\nfaces.Add(interp(T[3], T[1]));\nfaces.Add(interp(T[3], T[2]));\nbreak;\ncase 0x08:\nfaces.Add(interp(T[3], T[0]));\nfaces.Add(interp(T[3], T[2]));\nfaces.Add(interp(T[3], T[1]));\nbreak;\n}\n}\n++n;\n}\n++n;\n}\nn+=dims[0];\n}\n\nreturn vertices.ToArray();\n}\n\nfunction interp(i0:float, i1:float)\n{\nvar g0 = grid[i0];\nvar\u00a0 g1 = grid[i1];\nvar\u00a0 p0 = cube_vertices[i0];\nvar\u00a0 p1 = cube_vertices[i1];\nvar\u00a0 v:int[]\u00a0 = [x[0], x[1], x[2]];\nvar\u00a0 t = g0 - g1;\n\nif(Mathf.Abs(t) > 1e-6) {<br \/>\nt = g0 \/ t;<br \/>\n}<br \/>\nfor(var i=0; i<3; ++i) {\nv[i] += p0[i] + t * (p1[i] - p0[i]);\n}\nvertices.Add(new Vector3(v[0],v[1],v[2]));\nreturn vertices.Count - 1;\n}\n\nfunction makeVolume()\n{\n\nvar dims = [[-1.0, 1.0, 0.25],\n[-1.0, 1.0, 0.25],\n[-1.0, 1.0, 0.25]];\nfor(var i1=0; i1<3; ++i1) {\nres[i1] = 2 + Mathf.Ceil((dims[i1][1] - dims[i1][0]) \/ dims[i1][2]);\n}\nvar volume = new Array(res[0] * res[1] * res[2]);\nvar n:int = 0;\nvar zz:float=dims[2][0]-dims[2][2];\nfor(var k=0; k<res[2]; ++k) \/\/z\n{\nzz+=dims[2][2];\nvar yy:float=dims[1][0]-dims[1][2];\nfor(var j=0; j<res[1]; ++j) \/\/ y\n{\nyy+=dims[1][2];\nvar xx:float=dims[0][0]-dims[0][2];\nfor(var i=0; i<res[0]; ++i) \/\/ x\n{\nxx+=dims[0][2];\nvolume[n] = makeSphere(xx,yy,zz);\n++n;\n}\n}\n}\nreturn volume;\n}\n\nfunction makeSphere(x:float,y:float,z:float)\n{\nreturn x*x + y*y + z*z - 1.0;\n}\n\n[\/javascript]\n\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tried to convert this\u00a0 marching tetrahedrons (by Mikola Lysenko) to Unity Javascript.. but its not working yet (^ that should be a sphere..) Source (bugged, see the original source above and try to fix this?..Oo ) ** See comments section for fixed version \/\/#pragma strict [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1435,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[4,3],"tags":[366,365],"class_list":["post-1434","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-demos","category-unity3d","tag-isosurface","tag-marching-tetrahedrons"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/unitycoder.com\/blog\/wp-content\/uploads\/2012\/11\/marching_tetrahedrons_unity3d_1.jpg?fit=680%2C507&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/p1KTaT-n8","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/unitycoder.com\/blog\/wp-json\/wp\/v2\/posts\/1434","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/unitycoder.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/unitycoder.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/unitycoder.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/unitycoder.com\/blog\/wp-json\/wp\/v2\/comments?post=1434"}],"version-history":[{"count":5,"href":"https:\/\/unitycoder.com\/blog\/wp-json\/wp\/v2\/posts\/1434\/revisions"}],"predecessor-version":[{"id":3509,"href":"https:\/\/unitycoder.com\/blog\/wp-json\/wp\/v2\/posts\/1434\/revisions\/3509"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/unitycoder.com\/blog\/wp-json\/wp\/v2\/media\/1435"}],"wp:attachment":[{"href":"https:\/\/unitycoder.com\/blog\/wp-json\/wp\/v2\/media?parent=1434"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/unitycoder.com\/blog\/wp-json\/wp\/v2\/categories?post=1434"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/unitycoder.com\/blog\/wp-json\/wp\/v2\/tags?post=1434"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}