Monday, May 30, 2011

Follow the leader randomly

   อ่านในกระทู้แล้วเห็นน่าสนใจดี เป็นการใส่ Expression ให้บรรดาออบเจคลูกตามออบเจคแม่ แต่จะไม่เหมือนคำสั่ง .valueAtTime ที่จะตามในระยะเวลาที่เท่ากัน คำสั่งนี้ระยะเวลาจะสะเปะสะปะ เป็น Random ไป
( อ้างอิงจากกระทู้นี้ http://forums.creativecow.net/thread/227/13771 )

ในเอกเพรสชันนี้ต้องมีตัวควบคุมสองตัวคือ Layer Control และ Slider Control ซึ่งจะใส่ไว้ที่ไหนก็ได้แล้วลิงค์ให้ถูกต้อง ผมใส่ไว้ที่ตัวที่เป็น Leader


ซึ่ง Layer Control มีไว้เพื่อเลือกตัวที่จะมาเป็น Parent และ Slider Control มีไว้กำหนดค่าความหน่วง ว่าจะตามช้าไปกี่วินาที และเป็นตัวกำหนดค่า Random ด้วย
ส่วนตัว Expression ใส่ที่ Position ของ Child ทุกตัวดังนี้

target = effect("Layer Control")("Layer").position; //select which layes it will follow
seedRandom(index, true);
delay = random(effect("Slider Control")("Slider"));
delta = target.valueAtTime(time - delay) - target.valueAtTime(0);
value + delta

อนิเมทแค่ออบเจคสีแดง ก็จะได้อนิเมชันในรูปแบบนี้


ยังไม่พอ ตอนท้ายๆของกระทู้ เขาถามต่อไปถึงถ้าต้องการสปริงในการเคลื่อนไหวของ Child ด้วยจะทำยังไง คำตอบก็คือ เติม Expression ทำให้เป็นสปริงซะ ได้ดังนี้

target = effect("Layer Control")("Layer").position; //select which layes it will follow
seedRandom(index, true);
delay = random(effect("Slider Control")("Slider"));
delta = target.valueAtTime(time - delay) - target.valueAtTime(0);
n = 0;
  if (target.numKeys > 0){ n = target.nearestKey(time-delay).index;
 if (target.key(n).time > time-delay){ n--; } } if (n == 0){ t = 0; }else{ t = time - delay - target.key(n).time; } if (n > 0){ v = target.velocityAtTime(target.key(n).time - thisComp.frameDuration/10);
amp = .05;
freq = 4.0;
decay = 2.0;
value + delta + v*amp*Math.sin(freq*t*2*Math.PI)/Math.exp(decay*t);
}else{ value + delta }


ก็จะได้อนิเมชันรูปแบบนี้


จริงๆแล้วยังคิดไม่ออกเหมือนกันว่าจะเอาไปใช้งานไหนดี แต่มันก็เจ๋งดีครับ น่าจะทำให้ชีวิตง่ายขึ้นอีกนิด ยังไงเจออะไรน่าสนใจจะเอามาแชร์อีกนะจ๊ะ

No comments:

Post a Comment