2014年7月3日 星期四

[QC] 圓表面運動


 延續兩天前的話題,既然連unity都做過圓球表面運動了,那麼很久沒打開都快生鏽發霉的QC(quartz composer)當然也要來一下。QC的優點就是,跟所有的vj軟體配合度都相當高,內部還支援javascript寫作,所以本範例 登"登" ,只花了一個小時就實做出來(對比 unity,我只能嘆聲連連)。
var first=false;
var x;
var y;
var z;

var radius=0.5;
var theta;
var phi;

var VelT;
var VelP;
var num;

var bx1;
var bx2;
var by1;
var by2;
var bz1;
var bz2;

var mySphere=[];
var myLines=[];

function dis(x1,y1,z1,x2,y2,z2){ 
 return Math.sqrt(Math.pow((x1-x2),2)+Math.pow((y1-y2),2)+Math.pow((z1-z2),2));
}

function (__structure myStructures,__structure myStructures2,__number LinesNum) main (__number time,__number numball,__number limit)
{
  var result = new Object();
  myLines=[];
  
  if(num != numball){
    first=true;
    mySphere=[];
    num= numball;
  }
  
  if(first==true){
    for(var i=0;i<num;i++){
      theta=(6.28*(Math.random()));
      phi=(6.28*(Math.random()));
      
      VelT=0.02*(Math.random())+0.01;
      VelP=0.02*(Math.random())+0.01;
      
      x=radius * Math.cos ((theta)) * Math.cos ((phi));
      y=radius * Math.sin ((phi));
      z=radius * Math.sin ((theta)) * Math.cos ((phi));
      
      mySphere.push({ax:x,ay:y,az:z,
             atheta:theta,aphi:phi,
             avelt:VelT,avelp:VelP
             });
      first=false;
    }
  }

  for(var i=0;i<mySphere.length;i++){    
    
    mySphere[i].atheta = mySphere[i].atheta + mySphere[i].avelt ;
    mySphere[i].aphi =    mySphere[i].aphi + mySphere[i].avelp ;
    mySphere[i].ax = radius * Math.cos ((mySphere[i].atheta)) * Math.cos ((mySphere[i].aphi));
    mySphere[i].ay = radius * Math.sin ((mySphere[i].aphi));
    mySphere[i].az = radius * Math.sin ((mySphere[i].atheta)) * Math.cos ((mySphere[i].aphi));  }
    
  for (var i=0; i<mySphere.length; i++) {
    for (var j=i+1; j<mySphere.length; j++) {  
      bx1=mySphere[i].ax;
      by1=mySphere[i].ay;
      bz1=mySphere[i].az;
      bx2=mySphere[j].ax;
      by2=mySphere[j].ay;
      bz2=mySphere[j].az;
    
      if(dis(bx1,by1,bz1,bx2,by2,bz2)<limit){
        myLines.push({lx1:bx1,ly1:by1,lz1:bz1,
              lx2:bx2,ly2:by2,lz2:bz2
                });
  
      }
    }  
  }

  result.myStructures=mySphere;
  result.myStructures2=myLines;
  result.LinesNum=myLines.length;
  return result;
}


本支程式要轉成32位元開啟,然後還要加裝kineme的GL Line 套件。

Download

2014年7月2日 星期三

[unity3d] 偵測聲音的大小



不管是在Pd,QC,P5等軟體上,即時偵測聲音的大小並用於互動都算是非常簡單的基本功,但在unity好像就沒那麼容易!?我猜測很可能因為unity是遊戲引擎,所以對於訊號輸入都著重在於體感或是傳統鍵盤、搖桿上,所以像是聲音振幅影響物件大小這麼簡單的效果,卻也讓我花了一天時間研究,也有可能是我unity太弱啦(哭哭)。

過程中最主要遇到的問題時,unity可以錄音(Microphone in),但因為他最少都要錄完一秒才存在buffer後才能分析,這也是造成無法即時互動的原因,因為最少都會延遲一秒。在網路上找了又找,玩家們對這件事似乎也都很苦惱,但總算神人到處有,總算在這討論串上找到方法:http://answers.unity3d.com/questions/394158/real-time-microphone-line-input-fft-analysis.html,透過一些延遲的方法,unity總算能夠即時聲音偵測啦。

這邊是我修改後的code,可以下載來玩看看。download




2014年6月27日 星期五

[unity3d] 圓球表面運動



回頭看:[跟p5以及pd的比較]

最近因為工作的需求,開始得使用一些商業軟體去執行專案,而unity就是目前互動業界最愛的工具軟體之一,所以這幾周花了一些時間了解unity的工作環境跟c#這語言。這兩天接觸的心得是,unity程式寫作的方式跟p5(java)也還算是大同小異,只是prefabs以及gameObject的用法上我還是有些無法捉摸,常常會動態產生無法預期的物件..真是苦惱啊...

而這支程式跟過往p5寫作一樣,是利用arraylist的方式產生多顆動態的球,不過在畫線方面,因為unity畫線的功能比較不完善,所以是利用第三方的套件Vectrosity去完成,並且線的產生方式因為跟gameObject產生方式也不同,所以也是讓我苦惱了好一陣。

總之目前這一年看來是會跟unity綁在一起了,也只能努力適應了~~
SoureceCode

2014年6月16日 星期一

[GLSL]入門-7 實做克拉尼圖形



德國物理學家Ernst Florens Friedrich Chladni,於1786年開始從數學方面研究聲波,他是算出有關聲音傳播的數量關係的第一個人,因此被譽為聲學之父。

克拉尼的最有名的成就之一是發明一種技術來表明剛性表面振動的各種模式,此模式產生的圖形稱為克拉尼圖形(chladni pattern)。他在金屬片表面鋪上沙子並用一張弓拉動金屬片邊緣,金屬版的振動導致沙子移動和集中在節線上, 也就是震動較小的地方。