{
   "labels" : [
      "graphic",
      "animation",
      "3d"
   ],
   "code" : "//req. Canvas3D quark: Quarks.install(\"Canvas3D\");\r\n//works with both cocoa and qt GUI\r\n//see thread https://www.listarc.bham.ac.uk/lists/sc-users/msg06458.html for more examples\r\n//cmd+period to stop\r\n\r\n(\r\n\tvar width = 500, height = 400;\r\n\tvar w, u;\r\n\t\r\n\tvar segments= 40;\r\n\tvar minorRadius= 0.667;\r\n\tvar majorRadius= 1;\r\n\t\r\n\tw = Window(\"spinning doughnut\", Rect(128, 64, width, height), false)\r\n\t\t.front;\r\n\tu = Canvas3D(w, Rect(0, 0, width, height));\r\n\tu.add(Canvas3DItem()\r\n\t\t.paths_(\r\n\t\t\tArray.fill(segments+1, {|i|\r\n\t\t\t\tvar u= i/segments*2pi;\r\n\t\t\t\tArray.fill(segments+1, {|j|\r\n\t\t\t\t\t\tvar v= j/segments*2pi;\r\n\t\t\t\t\t\tvar x= (minorRadius*cos(v)+majorRadius)*cos(u);\r\n\t\t\t\t\t\tvar y= (minorRadius*cos(v)+majorRadius)*sin(u);\r\n\t\t\t\t\t\tvar z= minorRadius*sin(v);\r\n\t\t\t\t\t\t[x, y, z];\r\n\t\t\t\t\t});\r\n\t\t\t\t})\r\n\t\t)\r\n\t);\r\n\tu.animate(40, {|t|\r\n\t\tu.transforms = [\r\n\t\t\tCanvas3D.mRotateY(t/52%2pi*sin(t/30)),\r\n\t\t\tCanvas3D.mRotateX(t/50%2pi),\r\n\t\t\tCanvas3D.mScale(1, 1, sin(t/32)*2)\r\n\t\t];\r\n\t});\r\n\tCmdPeriod.doOnce({w.close});\r\n)\r\n\r\n\r\n\r\n//and with trails\r\n(\r\n\tvar width = 500, height = 400;\r\n\tvar w, u;\r\n\t\r\n\tvar segments= 40;\r\n\tvar minorRadius= 2;\r\n\tvar majorRadius= 1;\r\n\t\r\n\tw = Window(\"spinning doughnut tails\", Rect(128, 64, width, height), false)\r\n\t\t.front;\r\n\tu = Canvas3D(w, Rect(0, 0, width, height));\r\n\tu.view.clearOnRefresh= false;\r\n\tu.add(Canvas3DItem()\r\n\t\t.paths_(\r\n\t\t\tArray.fill(segments+1, {|i|\r\n\t\t\t\tvar u= i/segments*2pi;\r\n\t\t\t\tArray.fill(segments+1, {|j|\r\n\t\t\t\t\t\tvar v= j/segments*2pi;\r\n\t\t\t\t\t\tvar x= (minorRadius*cos(v)+majorRadius)*cos(u);\r\n\t\t\t\t\t\tvar y= (minorRadius*cos(v)+majorRadius)*sin(u);\r\n\t\t\t\t\t\tvar z= minorRadius*sin(v);\r\n\t\t\t\t\t\t[x, y, z];\r\n\t\t\t\t\t});\r\n\t\t\t\t})\r\n\t\t)\r\n\t);\r\n\tu.view.drawFunc= {\r\n\t\tPen.fillColor= Color.grey(1, 0.1);\t//alpha set trail amount\r\n\t\tPen.fillRect(Rect(0, 0, width, height));\r\n\t}<>u.view.drawFunc;\r\n\tu.animate(40, {|t|\r\n\t\tu.transforms = [\r\n\t\t\tCanvas3D.mRotateY(t/22),\r\n\t\t\tCanvas3D.mRotateX(t/25*sin(t/23)),\r\n\t\t\tCanvas3D.mScale(1, 1, sin(t/24))\r\n\t\t];\r\n\t});\r\n\tCmdPeriod.doOnce({w.close});\r\n)\r\n\r\n\r\n\r\n//and with sound input from mic\r\n(\r\n\tvar width = 500, height = 400;\r\n\tvar w, u, amp= 0.1;\r\n\t\r\n\tvar segments= 25;\r\n\tvar minorRadius= 0.5;\r\n\tvar majorRadius= 1.5;\r\n\t\r\n\tw = Window(\"spinning wireframe doughnut\", Rect(128, 64, width, height), false)\r\n\t\t.front;\r\n\tu = Canvas3D(w, Rect(0, 0, width, height));\r\n\tu.add(Canvas3DItem()\r\n\t\t.paths_(\r\n\t\t\tArray.fill(segments+1, {|i|\r\n\t\t\t\tvar u= i/segments*2pi;\r\n\t\t\t\tArray.fill(segments+1, {|j|\r\n\t\t\t\t\tvar v= j/segments*2pi;\r\n\t\t\t\t\tvar x= (minorRadius*cos(v)+majorRadius)*cos(u);\r\n\t\t\t\t\tvar y= (minorRadius*cos(v)+majorRadius)*sin(u);\r\n\t\t\t\t\tvar z= minorRadius*sin(v);\r\n\t\t\t\t\t[x, y, z];\r\n\t\t\t\t});\r\n\t\t\t})\r\n\t\t\t++\r\n\t\t\tArray.fill(segments+1, {|i|\r\n\t\t\t\tvar u= i/segments*2pi;\r\n\t\t\t\tArray.fill(segments+1, {|j|\r\n\t\t\t\t\tvar v= j/segments*2pi;\r\n\t\t\t\t\tvar x= (minorRadius*cos(u)+majorRadius)*cos(v);\r\n\t\t\t\t\tvar y= (minorRadius*cos(u)+majorRadius)*sin(v);\r\n\t\t\t\t\tvar z= minorRadius*sin(u);\r\n\t\t\t\t\t[x, y, z];\r\n\t\t\t\t});\r\n\t\t\t})\r\n\t\t)\r\n\t);\r\n\tu.animate(60, {|t|\r\n\t\tu.transforms = [\r\n\t\t\tCanvas3D.mRotateY(sin(t/42)*sin(t/53)),\r\n\t\t\tCanvas3D.mRotateX(sin(t/31)*sin(t/64)),\r\n\t\t\tCanvas3D.mRotateX(sin(t/20)*sin(t/75)),\r\n\t\t\tCanvas3D.mScale(amp, amp, sin(t/9)*sin(t/86))\r\n\t\t];\r\n\t});\r\n\t\r\n\t//--sound input\r\n\ts.waitForBoot{\r\n\t\tOSCFunc({|m| amp= m[3].explin(0.01, 1, 0.667, 1)}, \\tr, s.addr);\r\n\t\t{SendTrig.kr(Impulse.kr(60), 0, Amplitude.kr(SoundIn.ar, 0.1, 0.4)); DC.ar(0)}.play;\r\n\t};\r\n\t\r\n\tCmdPeriod.doOnce({w.close});\r\n)",
   "is_private" : null,
   "id" : "1-4S0",
   "name" : "spinning doughnut",
   "author" : "Fredrik Olofsson",
   "description" : "",
   "ancestor_list" : []
}
