Saturday, December 5, 2009

Полигоны бүтэц


3 хэмжээст объектыг бүрдүүлэгч үндсэн элемент нь полигон буюу олон өнцөгт юм.3 хэмжээст график програмчлалд гурвалжин хамгийн чухал полигон юм.Учир нь гурвалжин доорхи гурван шинжийг байнга хадгалж байдаг.
1) Гурвалжин гүдгэр хэлбэртэй
2) Гурван орой нь байнга нэг хавтгайд оршино.
3) Өөрөө өөрийгөө огтлохгүй.
Гүдгэр хэлбэртэй гэдэг нь дурын шулуун татахад зөвхөн хоёр талыг л дайрч огтлох бөгөөд  дотоод өнцөгүүд нь 180 градусаас бага байна. Жирийн нэг дөрвөлжин шооноос эхлээд машины загвар хүртэл бүгд л хоорондоо ирмэгээр холбогдсон вертекс оройнуудын цуглуулга юм. Тиймээс вертексүүд хаана  байрлаж байгааг мэдэж байх нь тун чухал. 3 хэмжээст графикт загварыг бүрдүүлэгч вертексийг удирдах болон харахдаа Картезын координатын системийг ашигладаг. 10 жилийн алгебрийн хичээл дээр энэхүү системийн хоёр хэмжээст хувилбар дээр график зурж үзээгүй хүн байхгүй байх. Х ба Ү  гэсэн перпендикуляр тэнхлэгийн дагуу харгалзах утгыг оноосон байдаг.
  Вектор ба нормал
Та дэлгүүрт явж байгаад худалдагчаас бие засах газар хаана байгааг асууя гэж бодъё. Тэгтэл 100 метр гэж хариулбал та юу гэж ойлгох вэ? Харин гараараа заагаад тэр зүг рүү 100 метр яв гэж хэлбэл тун төвөггүй олно.Энэ тохиолдолд худалдагч вектор гэсэн үг. Түүний заасан зүг нь векторын чиглэл харин 100 метр гэдэг нь магнитуд буюу урт нь болно гэсэн үг. Координатын эхийг ямар нэг цэгтэй холбосныг вектор гэж ойлгож болно. Хоёр цэгийг холбосон эхлэл ба төгсгөлтэй вектор нь  шугаман алгебрын онолд хэрэглэгддэг боловч компьютер графикт ихэвчлэн координатын эхлэлийг төгсгөлийн цэг гэж  авч үздэг.Векторыг скаляр тоогоор үржүүлэхэд чиглэл өөрчлөгдөхгүй бөгөөд уртын хэмжээ л өөрчлөгдөнө.Вектор нэмж хасах үйлдлүүдийг  хэрхэн гүйцэтгэхийг алгебрын хичээлд үзсэн.
Векторын уртыг олохдоо |v|= √(x2 + y2 + z2) тэнцэтгэлийг ашигладаг.
        Нормал буюу нэгж вектор гэж магнитуд нь 1- тэй тэнцүү векторыг хэлдэг. Нэгж урттай векторыг ашиглан тооцоолол хийхэд тун хялбар. Жишээ v(5,1,2) гэсэн векторыг нормалчилж  үзье. урт(v) =5.47723 байна. к=Нормалчлах(v) үйлдэл хийсний дараа к(x,y,z) нь
 x=0.9128
 y=0.1825
 z=0.3651
болсон байна. Харин урт(к)=1 байна. Нормалчлах үйлдэл хийхэд чиглэл огт өөрчлөгдөхгүй.

3 хэмжээст координатын систем

3 хэмжээст зураг дэлгэцэнд хэрхэн дүрслэгддэг вэ? Бодит байдал бидний нүдэнд яаж харагдаж байна түүнтэй адил зургийг дэлгэцэнд харуулах ёстой. Бодит байдлын   перспектив тусгал бидний нүдэнд буухад  объектуудын хэмжээ, алслалт зэргийг тархи ялгаж өгдөг. Хол байрлаж байгаа нь жижиг ойр байрласан нь том харагдана. Энэ зарчим компьютер графикт ч хүчин төгөлдөр. Ортогонал болон перспектив гэсэн хоёр төрлийн проекцийг ашигладаг.      

Wednesday, December 2, 2009

Хүүхэлдэйн нүүрийг тоноглох (cartoon facial rig)

Визуал эффект болон хүүхэлдэйн анимацын гол ялгаа.
Парадигм гэдэг нь тухайн цаг хугацаанд ямарваа нэг үгийг хэрхэн илэрхийлж байгааг харуулсан перспектив тусгалыг хэлдэг. Өөрөөр хэлбэл тал бүрээс нь харуулах гэсэн үг.Програмчлалын үүднээс харвал класс эсвэл бүлэг процедуруудын нэгдэлтэй ижил. Маяад нүүрний хувирлыг илэрхийлэхэд зарим тохиолдолд төвөгтэй, нийлмэл бүтэцтэй тохиргоо шаардлагатай учраас парадигм гэсэн үгийг ашигладаг.Зөв бүтэцтэй нүүр хувиргах систем нь эцсийн бүтээгдэхүүнд процедур маягаар нэмэгдэн, хэрэглэгдэж болохуйц  үндсэн болон дэд хэсгүүд бүхий мэдээллүүдээс бүрддэг.Визуал эффектийн нүүр хувиргах систем нь дараахь онцлогуудтай.
 -Хүрч болох физик хязгаартай
 -Бодит байдал дээр тулгуурлан загварчлагдсан
 -Ихэвчлэн live action дүрстэй хавсардаг
 -Хэрэв жүжигчний тоон хувилбар нь бол яг л амьд мэт харагдаж хөдлөх ёстой.
Визуал эффектийн хамгийн чухал зүйл нь хэдийгээр характер нь  физикийн хуульд захирагдахгүй хэтрүүлэгтэй хөдөлгөөн хийж байсан ч ямар нэг хэлбэрээр бодит байдалтай холбоотой.Визуал эффектийн дүрийн нүүр царай,бие нь  хийсвэр байсан ч бодит мэт харагдах ёстой. Харин хүүхэлдэйн анимацид энэ нь яг эсрэгээрээ байх ёстой.Хүүхэлдэйн характер хийхдээ зарим нэг дүрэм журмыг таягдан хаяж цоо шинээр эхлэх хэрэгтэй.
 -Ямар нэг физик хязгаар байхгүй.
 -Маш уян хатан, яаж ч тохируулж болдог байх
 -Загварыг өөрийн төсөөллөөрөө хүссэнээрээ хийж болно
 -Бодит амьдрал дээрх хөдөлгөөн, жүжигчлэлтэй ямар ч хамааралгүй.
Нүүрний бүтэц ба задаргаа
Нүүр нь ам, нүд, хөмсөг, уруул, хамар гэсэн үндсэн элемэнтүүдээс бүрддэг. Характер нь бодит эсвэл хүүхэлдэйн дүрээс үл хамааран дээрх элемэнтүүдийг ямар нэг хэлбэрээр зайлшгүй агуулсан байдаг.Хүүхэлдэйн нүүр царай ямар ч байж болно. Дээрх үндсэн элементүүдийн хэлбэр хэмжээ нь том эсвэл жижиг, бүр байхгүй эсвэл олон байсан ч хамаагүй.Ам болон нүд нь хамгийн чухал хэсэг. Хүүхэлдэйн нүүр хэсгийн модел анимаци хийхэд дараахь шаардлагыг хангасан байвал илүү үр дүнтэй.
 -Нэг бүхэл хэсгээс бүрдсэн, тополог нь дотроос гадагш чиглэсэн цагираг хэлбэртэй
 -Нүд нь бөмбөрцөг хэлбэртэй байх
 -Нүүрний поз тун тайван байдалд байх
 -Нүд ба ам хаалттай байх
 -Цагираг хэлбэртэй ирмэгүүд нүд, амнаас гадна тийш зөв чиглэсэн байх
 -Ам хамрын хоорондох агшилт гэх мэтийг хийж чадах зөв геометрийн төрөл байх.Өөрөөр хэлбэл дан дөрвөн өнцөгтөөс тогтсон полигон геометр нэн тохиромжтой. Характер тоноглогчийн хувьд хүүхэлдэйн характерийн тоноглол нь тун ярвигтай.Хүүхэлдэйн характер нь хөдөлгөөний хязгаар байхгүй тун уян хатан.Иймээс ямар нэг эвдрэл, алдаагүй тоноглоход ихээхэн анхаарал шаардана.Хүүхэлдэйн риг нь ямар ч хөдөлгөөнийг хийх чадвартай,ямар ч поз авч болох давуу талуудтай ч анхны хэлбэр дүрсээ алдах,тоноглоход цаг их шаарддаг, алдаа гарахад засахад хүндрэлтэй зэрэг сөрөг талууд ч бий.Хүүхэлдэйн анимаци хийхдээ урьдчилан ямар орчинд ямархуу дүрмийн дагуу хөдлөх вэ гэдгийг нарийн тодорхойлсон байвал зохимжтой.Хүний нүүр  бол хүмүүсийн хоорондоо харилцаж ойлголцох хэрэгсэл. Бидний тархи эдгээр дүр төрхүүдийг хооронд нь тун сайн ялгадаг.Хүүхэлдэйн дүр төрх ч хүмүүстэй харьцаж байгаа учраас хүний нүүртэй төстэй үйлдэл үзүүлэх хэрэгтэй.
Хүүхэлдэй ярих хэрэгцээ гарвал хүний ярьсныг дуурайхаас өөр арга байхгүй.
Нүүр хувиргах системийн дизайн.
Нүүр хувиргах системийн загварыг сайн тодорхойлох нь цаашид гарах ямар нэг хүндрэлээс сэргийлнэ.Цаас харандаа аваад  нүүрний хийх хөдөлгөөнүүд дээр урьдчилж сайн ажиллах хэрэгтэй.Хамгийн нэгдүгээр зорилт бол модулар систем байгуулах явдал. Үүнийг сайн хийж чадвал цаашид олон дахин ашиглах бололцоотой. Нүүр хувиргалтын систем нь дараахи удирдлагын давхаргуудыг агуулж байх хэрэгтэй.(шаардлагатай бол)
-skin cluster- нүүрний ерөнхий FK удирдлагуудыг агуулна.
-blend shape- сэтгэлийн хөдлөл болон харилцан яриа зэрэгт ашиглах
-cluster- тодорхой нэгэн хэсгийг нарийвчлан удирдахад 
-vertex averaging- Бүгдийг хамтад нь багцалж хянахад ашиглана
-accessories- нүд, үс, шүд, хөмсөг
-volume- суналт ба агшилт
Эдгээр давхаргууд нь бүгд нэг  биет дээр байснаас тухайн биетийг хувилан тус тусад нь нэг нэг биетэд оноосон нь үр дүнтэй. Ингэснээр ямар нэг давхаргыг өөрчилж янзлах шаардлагатай болвол бусаддаа нөлөөлөхгүй байх давуу талтай.Хамгийн сүүлд энэ бүхнийг нэгтгэн нэг биетэд онооно.Давхарга бүрийг MEL процедур маягаар программчилж өгвөл тун тохиромжтой бөгөөд хүссэн үедээ дуудаж хэрэглэн засаж янзлах бололцоотой.Дээрх давхаргууд нь нүүр хувиргалтын парадигмын бүрэлдхүүн хэсгүүд нь юм.
       Хамгийн чухал нь дээрх давхаргууд бие биенээсээ хамааралгүй ажиллаж чаддаг байх явдал.Давхарга бүр нүүрний аль нэг хэсэгт нарийн чимхлүүр зүйлийг хийж чадах удирдлага болон задрана.Гэхдээ энэ олон давхаргыг аниматорууд хялбархан ойлгож, ашиглах явдал нэн чухал. Аль болох хялбар байх тусам аниматоруудын давхарга бүр дээр зарцуулах цаг нь багасна.Зарим аниматорууд channelbox ашиглан анимаци хийх дургүй байдаг.Шууд харагдаж буй удирдлагыг сонгоод  хөдөлгөж үр дүнг тэр дор нь харж байвал  цагийг ихээхэн хэмнэнэ.       Удирдлагууд нь бие биенээсээ  өнгөөр ялгарч яг ямар хэсгийг удирдаж байгаагаа мэдэхэд  тун тохиромжтой. Жишээ нь баруун талын удирдлагууд улаан, зүүн талынх ногоон, голынх шар, бусад нь цэнхэр гэх мэт. Мөн удирдлагууд нь бүгд нэг төрлийн схемтэй байх хэрэгтэй.Жишээ нь NURBS цагирагийг холбоосын shape болгон хэрэглэх нь тохиромжтой. Тэдгээр нь хэлбэржүүлэх болон нууцлахад хялбар учир хамгийн шилдэг сонголт. Сonsolidation буюу бэхжүүлэлт нь интерактив ажиллагааны гол түлхүүр юм. Риг нь маш хурдан ажиллаж байх ёстой.Гэхдээ нүүр хэсгийн геометр нь хэт ерөнхий байж болохгүй эцсийн үр дүн харагдаж байхаар нягтрал сайтай байх ёстой.Удирдлагыг хөдөлгөхөд риг секундын төдий гацаж уншигдахад л анимаци хийх боломжгүй болно.Тиймээс хэт олон хэрэггүй удирдлагуудыг нэмж хийх огт шаардлагагүй. Хамгийн чухал нь маш хурдан ажиллах ёстой. Зарим хүмүүс аниматорыг мартаад маш нарийн бүтэцтэй, автоматчлагдсан риг хийчихдэг.Үүнд аниматорууд маш дургүй бөгөөд аль болох хялбар бүтэцтэй ригээр комплекс анимаци хийхийг илүүд үздэг. Тэгэхээр эхийг нь эцээхгүй тугалыг нь тураахгүй гэдэг шиг л ямар хөдөлгөөн зайлшгүй хийх шаардлагатай болон хэр хугацаанд хийх ёстойг тооцоолж байгаад тэрэндээ тохируулж тоноглох хэрэгтэй.  Өөрийн хийсэн нүүр хувиргалтын системээ маш сайн тестлэж бэлдэх хэрэгтэй.Ямар нэг алдаа гарвал бүү сандар бүхнийг ахин шинээр эхлэх хэрэгтэй. Нэг сурчихсан байхад үүнийг байнга сайжруулаад ашиглаад явах бололцоотой. Хүүхэлдэйн тоноглол хийх бол зарим нэг хуучин аргуудыг шууд орхих хэрэгтэй.
                                               Эхний давхарга
Хамгийн эхний суурь давхарга бол холбоос бүхий арьсан давхарга.(skin cluster).Энэ давхарга эрүү, хамар,чих зэргийг хөдөлгөх FK холбоосуудыг агуулна. Энд нэг чухал зүйлийг зайлшгүй анхаарах хэрэгтэй.Бүх холбоосууд эргэх хөдөлгөөн хийхийн хажуугаар шилжих болон том жижиг болох бололцоотой байх ёстой.Тиймээс холбооснуудын вертекст үзүүлэх жинг (weight) тохируулахад нэлээдгүй хугацаа зарцуулах шаардлагатай болдог. Будах горимд жинг тохируулж байхдаа хулганы дунд товчыг даран тухайн холбоосыг камерын харагдах өнцөгтэй перпендикуляр чиглэлд эргүүлж шалгах боломжтой.Жинг тохируулахдаа mirror, prune багажуудыг ашиглах нь тохиромжтой. Жинг тохируулж дууссан бол гадны ямар нэг файлд байнга хадгалж заншсан байх хэрэгтэй. .
   Идэвхжсэн холбоос бүрд FK удирдлага оноохдоо доорхи скриптийг ашиглана. Холбоосуудын нэрийг анхааралтай хараарай!!!!!!!!
   fk удирдлагыг идэвхжсэн холбоосд нэмэх
Мэдээж характер болгоны хэлбэр  өөр учраас цагирагийн хэлбэрийг CV-г нь хөдөлгөж өөрчлөн тохируулах хэрэгтэй.Эхний давхарга бүрэн болсон учир тестлээд үзэх хэрэгтэй.
                                                 2-дахь давхарга
Blend shape буюу морф давхаргыг хийхэд хамгийн их ажиллагаа шаардана.Морф давхарга нь нүүрний тодорхой нэг хэсэгт өргөн хүрээтэй хувиргалт хийх бололцоог олгодог.  Эхний давхарга ихэвчлэн ерөнхий хөдөлгөөн хийхэд ашиглагддаг бол 2 дахь давхаргыг нэмснээр өөрийн хүссэн позыг гаргаж авах бололцоотой. Морфыг хийх олон аргууд байдаг.Гэхдээ хүүхэлдэйн анимацын хувьд дахин дахин ашиглагдаж  болохоор үр дүнтэй аргыг хэрэглэвэл зохистой.Эхний давхарга руу буцаж нүд, уруул гээд хаана л хэрэгцээтэй байгаа газар нь  шинэ холбоосуудыг нэмж өгнө.Эдгээр холбоосуудыг ашиглан нүүрийг янз бүрийн төрхтэй болгож хувиргаж болно.Ихэвчлэн модел бүтээгчид нүүрний морф хэлбэрүүдийг бүтээдэг бол хүүхэлдэйн анимацын хувьд энэ нь аниматоруудын үүрэг.
Дараахь дарааллын дагуу хийх хэрэгтэй
  1. Шинэ холбоосуудыг агуулж, жинг нь тохируулсан нүүрний шинэ хувилбарыг үүсгэнэ.
  2. Үүсгэсэн хувилбарыг аниматор руу дамжуулна
  3. Аниматор нэг нэг фреймд  инээмсэглэх нүдээ аних зэрэг нүүрний хувирал бүрд анимаци хийнэ. 
  4. Хөдөлгөөнд оруулсан нүүрийг буцаад риг хийгч рүү буцаана
  5. Нүүрний хувирал бүрийг тус тусад нь файлд хадгална.
Аниматорууд нүүрний үндсэн гол хувирлуудыг хийж таваас арван кадр анимаци хийх хэрэгтэй. Ингэснээр дундын морфыг хадгалах бололцоо бүрдэнэ. Нүүрний хэсэг тус бүр тусдаа хөдөлдөг байх ёстой.Жишээ нь уурласан болон инээж байгаа нүүрний хувирлуудад харгалзах нэг нэг удирдлага байснаас хөмсөг, уруулыг хөдөлгөх удирдлагууд нь хоорондоо хамааралгүй тус тусдаа бол  хамаагүй илүү үр дүнтэй. Анимаци хийхийн бас нэг давуу тал бол target-уудыг янзлахад тун хялбар.         
Blend shape    
 Blend shape хэлбэржүүлэгч нь энгийн ажиллагаатай боловч хүчирхэг хэрэгсэл юм. Blend shape хэлбэржүүлэгчийн ажиллах үндсэн зарчим нь хувиргаж өөрчилсөн геометр биетийн цэгүүдээс үндсэн эх биетийн цэгүүдийг хасаад ялгаврыг нь хадгалдаг.
                       Vj =SUM(WkBkj)
Энэхүү тэнцэтгэлд Vj  нь биетийн j дүгээр вертекс,Wk нь хувиргалтын жин (вектор), к-дугаартай blend shape-д харгалзах  j дугаартай вертекс
           Blend shape деформ нь  хувиргахдаа  цэгүүдийн хооронд зөвхөн шугаман шилжилт хийдэг сул талтай. Ийм учир анимаци хийхдээ 4-өөс 5 кадрын урттай хийвэл завсрын морф ( in-between) биетүүдийг гаргаж авах бололцоотой болно. Аниматор анимацын дунд хэсэгт  шугаман шилжилтийг хялбархан засаж нуман хэлбэртэй хөдөлгөөнийг нэмж оруулна.
  Дундын биетүүдийг blend shape-д нэмснээр удаан болно гэж айх хэрэггүй.(blend shape үүсгээд target моделуудыг устгасан тохиолдолд). Биетийн хэлбэр өөрчлөгдөж байгаа анимацийг  тухайн фрэйм бүрд хувилж, шинэ нэр оноохдоо доорхи скриптийг ашиглана.
      Анимацыг хувилах

Thursday, November 12, 2009

Хэлний хамгийн чухал хэрэглэгдхүүний нэг бол хувьсагчид, түүний бүтэц юм. Python-ий хувьсагчдыг зарлан дурын утга оноож болно.Хувьсагчдын нэрийг зарлахдаа тусгай тэмдэгт, түлхүүр үг ашиглаж болохгүй, үсгээр эхэлсэн байх ёстой гээд бусад хэлтэй адил.
  Name="Emitter"
  Value=56
Скаляр хувьсагчдаас гадна жагсаалт, dictionary гэсэн хувьсагчийг тодорхойлж болдог. Эхнийх нь буюу жагсаалт нь RealFlow-д их хэрэглэгдэх боломжтой. Жагсаалтын харгалзах утгыг олохдоо  тодорхой дарааллын дагуу байршсан  индексээр нь хандаж болно. 0=хурдан 1=удаан  2=зогсож байгаа гэх мэтээр.С хэлний массивтай адил. Dictionary-г бусад хэлэнд hash гэж дууддаг. Пифон зарим тохиолдолд жагсаалт хэлбэрээр утгыг буцаадаг. Тайлбар бичих бол # тэмдэгтийг  тавьж өгнө.Дараахь хэлбэрээр хоосон жагсаалтыг зарлана.
   my_list=[]
Хэрэв зарлахдаа эхний утга оноох бол
   my_list=[value1,value2, .....,value n]
Жагсаалтыг хэрхэн ашиглахыг доорхи жишээн дээрээс харцгаая.
a="сайн"
condition=["сайн","муу","муугүй"]
if(a in condition):
  print "Шалгасан утга жагсаалтад байна "
else
 print "Шалгасан утга жагсаалтад алга "
Жагсаалтын индекс тэгээс эхэлдэг гэдгийг анхаарах хэрэгтэй.Жагсаалтын индексийг дараахь маягаар хэрэглэнэ.
  selection=condition[1]
Мөн жагсаалтад хэдэн элемент байгааг мэдэхдээ len гэсэн функцыг ашиглана.
 num_elem=len(condition)
 print num_elem
 үр дүн: 3
Realflow  хэдэн мянган тоосонцоруудтай (particle) ажилладаг.Тийм учраас  бүгдийнх нь утгыг жагсаалтад хадгалахад хүндрэлтэй.Үүнийг append функцын туслалцаатайгаар  хийж болно.
 condition.append("тааруухан")
Операторууд бол Python хэлний чухал хэсэг. Үүнгүйгээр тоосонцоруудын байрлал, хурд гэх мэт характеристикийг ямар нэг утгатай харьцуулж зүйрлэхэд хүндрэл тулгарна.

Realflow скрипт хэлний тухай

      3d уран бүтээлчид код бичнэ гэхээр л математикийн мэдлэг ихээхэн хэрэгтэй гэж бодоод жийрхэх үзэгдэл ажиглагддаг.Python скрипт хэлийг ашигласнаар хэцүү ярвигтай зүйлүүдийг хялбархан шийдэж болно.Сүүлийн үеийн хэрэгслүүд ихэвчлэн python-ийг өөртөө агуулах болжээ.Учир нь дүрэм нь энгийн бичиглэлтэй ойролцоо.Скриптийг гүнзгий судалж ойлгон туршлагатай болох тусам энэхүү программын ажиллах зарчим танд тодорхой харагдана.Өөрийн бичсэн скриптийн параметрийг хувиргах нь ямар нэг зангилааны утгыг өөрчлөхөөс тэс өөр ялгаатай. Мэдээж хамгийн сайн ном, хичээл байлаа ч танд нэмэр болохгүй нэг зүйл бий.
         Та тухайн скрипт ямар үйлдэл гүйцэтгэж байгааг тун сайн ойлгож мэдэх ёстой. Үүний тулд пифоны үндсэн дүрмүүдийг мэддэг байх хэрэгтэй. Жишээ нь өгөгдлийн төрлүүд, энгийн шугаман алгебр,вектор гэх мэт. Олон студи, компаны хүсэлтийг харгалзан бүтэн хоёр жилийн турш ажиллаж байж Realflow 4 хувилбараас эхлэн  програмчлах боломжийг нэмж өгчээ. Гэхдээ олон хэрэглэгч хаанаас эхлэхээ мэдэхгүй энэхүү хүчирхэг багажыг төдийлөн ойшоохгүй байсаар.   
            Скрипт хэлний програмчлалын хэлнээс ялгагдах гол онцлог нь програмын бичиглэл ил харагдаж байдаг бөгөөд хэрэглэгч хүсэлт гаргах үед боловсруулагддаг. Харин C, Java гэх мэт програмчлалын хэлнүүд нь өөр формат руу урьдчилж хөрвүүлсэн (compile) байх шаардлагыг тавьдаг бөгөөд код нь хэрэглэгчид харагдахгүй .Мэдээж програмчлалын хэл нь скриптийг бодвол хамаагүй хурдан ажилладаг.Учир нь хөрвүүлэхдээ техник хангамжид тохируулж оновчтой шийддэг. Сүүлийн үед урьдчилж хөрвүүлэх чадвартай скрипт хэлнүүд нэлээд хэд гарчихаад байна. Тэгвэл realflow яагаад програмчлалын хэлийг ашиглаагүй юм бол? Хөрвүүлэгч нь одоогоор янз бүрийн үйлдлийн систем болон техник хангамжаас шалтгаалан зарим нэг төвөгтэй асуудалтай тулгардаг. Харин скрипт хэлний хувьд ийм зовлон байхгүй. Та зөвхөн кодоо л зөв бичвэл үлдсэнийг нь интерпретор хариуцна. Тэгэхээр энэ хоёр аль аль нь сул болон давуу талуудтай.Орчин үеийн скрипт хэлүүд хэдэн зуун өргөтгөл сангуудыг агуулсан, асар олон тусгай зориулалтын функцуудтай,объект хандалттай хүчирхэг багаж болон хөгжиж байна. Хамгийн өргөн хэрэглэгддэг нь Perl, Python, Javascript, PHP зэрэг хэлүүд.
                 Next Limit-ийн хөгжүүлэгчид Пифон хэлийг Realflow-д хавсаргаад зогсохгүй хэдэн зуун функц, хувьсагчийг нэмж оруулсан.Одоо програмын ямар ч объект болон атрибут руу пифон скриптийг ашиглан чөлөөтэй хандаж болно.Пифон скрипт програмд бүрэн хавсарсан бөгөөд та ямар нэг нэмэлт зүйл суулгаж тохируулах шаардлагагүй.Пифоны давуу талууд
  - Үнэгүй
  - Өргөн дэлгэрсэн
  - Үйлдлийн системээс хамааралгүй
  - Сурах материал элбэг
  - Олон програмууд энэ скриптийг ашигладаг болж байгаа гэх зэрэг
                                                  Хаанаас эхлэх вэ?
Эхлэн суралцагчид хаанаас нь яаж эхлэх вэ гэдэг тун ойлгомжгүй асуудал байдаг. Скрипт хэлийг маш төвөгтэй бүтэцтэй байх ёстой гэж бодож байвал тийм биш. Энгийн тодорхой зүйлүүдийг нийлүүлснээр бүхнийг шийддэг.Мөн математикийн суутан ч байх шаардлагагүй. Гэхдээ ерөнхий мэдлэг хэрэг болох нь гарцаагүй. Ихэнхи хэлний синтаксийг танилцуулахдаа "hello world"  гэсэн жишээнээс эхэлдэг. 3D програмын хувьд бол энэ нь тийм ч чухал зүйл биш юм. Скрипт хэлний ажиллах үндсэн зарчмуудыг дараагийн сэдвээр товчхон харъя.

Tuesday, November 10, 2009

Хүний хөл хийхэд доорхи зүйлсийг зайлшгүй анхаарах хэрэгтэй
1.inverse kinematic-Хүүхэлдэйг амилуулах процессийн бараг  90%-д нь хүүхэлдэйн хөл газар дээр байрлаж байдаг.Иймээс инверс кинематик бол хөлөнд  хамгийн чухал үүрэгтэй.  
2.Өвдгийг ямар нэг байрлалд цоожлох бололцоотой байх ёстой.
3.Хэрэв хүүхэлдэйн хөл агаарт чөлөөтэй хөдлөх хэрэгцээ  шаардлага тулгарвал  хэрхэн шийдэх вэ? Уян хатан болгохын тулд Forward kinematic удирдлагууд давхар агуулагдаж байх хэрэгцээтэй  .4.???????????  ?????? ??? ????? ???????? ????????? ??? ????????? ???????? ??????. ?????? ???? ???????????? ????? ??? ????? ??????????? ???? ?????? ?? ??????
??????????? ??????? ???????????.
????????? ?????? ?????? ?????? ????? ???? ??? ?????? ???????????? ??????? ?????? ?????? ????????? ????.??????? ??? ??????? ??????? ???????????? ??????????
??????? ??? ???? ???????.????? ?? ?? ?????? ???? ??????? ?????????? ???? ??????? ???????? ?????????? ???? ?????? ?????? ???? ????? ???? ????? ????? ?? ?????,
?????, ?????? ???? ??????? ??? ??????? ????????? ??????????.?????? ??? ???????? ???? ???? ???? ? ????? ?????? ????????? ?????????? ????? ??????? ????. ????? ????
??? ????? ?????? ???????? ?????????????? ??????? ?????? ?????? ????????? ??????. ?????? ?????????? ????????? ??????? ???? ?????? ?????? ?????? ??? ??????
 ????? ????? ??? ???, ????????????.????? ???? ??? ?????? ????????? ??? ?????????? ??????? ???? ????????? ?????? ?????? ?????????? ???????? ??????????? ????? ??????
???? ??.  
1. Зурагт харуулсантай адил холбоосуудыг үүсгэж байрлуулна.
2. ??????? ????? ??????, ????????? ????? ??????, ????????? ??????? ????? ?????? IK ??????????? ??????????.
3.????? ??????? ?????? ????? ??????? ????? ?? ??????????. ?????? ????? ? ??????? ???????? ?????? ?????? ?????? ??????? ????
  ????????.(leg_ikHandle, foot_ikHandle, toe_ikHandle)
4. ?????? ?????? ?? ????? ??????? ?????? ?????? IK ???????? ?????? ?????? ???????.?????? ????????? ??????  foot_loc ??? ??????.
5. ?????? ??????? ??????? ?????.?????? ????????? (ball_loc) ?????? ????? ??????? ?????? ????? ???? ???????. foot_loc-?? ?????? ???????.
6. ????? ??????? ?? ?????? ???? ??????? IK ???????? (leg_ikHandle) ???? ?????. ????????? ?????????? ?????? ??????? ????? ???? ?????? ?????? ??? ?????????.
7. ???? ??? ??????? ?????? toeLift_loc ??? ???????. ??????? ???????? ??????? ??? ?????. ?????? ???? ??????? ??????? ?????   ????????? ????? ??????, ????????? ???????
 ????? ???????? IK ??????????? ??? ????????? ?????? ???????.????? 2. ??? ????????? ?????????? ??????? ????? ???? ?????? ?????? ??? ?????????. ????? ??????? ??? ??????
????? ??????? ???????????? ????????? ????????????.????? ???? ?????? ???? ?????? ???????? ???????????? ???? ??????? ?????? ?????.
8. heel_loc ????? ??????? ?????? ???????? ?????????? ??????????.??? ????????? foot_loc-?? ?????? ???????.
9. toeLift_loc- ?? heel_loc-?? ?????? ???????. ??? ????  ?????? ????????? ????????? ??????? ?????, ?????, ??????? ????? ?????? ???? ?????? ????????? ?????? ????????.
?????? ??????? ??????? ??? ???? ??????? ??????? ???????? ????????? ??? ???????????? ????????? ????? ????? ??? ???????? ???? ??????. ?????? ?????? ?????????
???? ?????? ?????????? ???? ??????? ?????????  ????? ??????? ??????? ?? ????? ??? ???????????. ?????? ?????? ????????? ????????? ????? ????? ????? ??????
????? ????? ?????? ???????????.???????? ?????? ???????? ??????? ??????????? ???? ?????.
foot_loc ???? roll ????? ??????? ?????? ????? ??????? ??????  heel_loc-???  ,????? ?????? ball_loc-??? ????? ??????????? ????????? ????? ????????? set driven key-?
?????? ?????????? ?????? ?????????. ????? ?????? ???????????? ????????? ???????? ?? ???????? ????? ?????? ?????? ???? ??????? ???????????
 ????? ??? ?????? ??????? ?????? ???????. set driven key-? ????????? ???  ???????? ??????? ????? ????? ????????? ??????? ??????????? ???? ?????? ???????.??????
????? ?3-? ?????? ???????????? ?????? ????? ?????? ?????? ????????? ?????.??????? ??????? 1,2,3 ?????? ??????? ???????????? ??? ???????? ??????? ????? ??
??????????? ?????.?????, ??????,????? ?????? ?????? ????? ?????? ?? ??????????. ????? 4,5 ?????? ??????? ??????? ????? ???????? ????? ? ????????? ?????.
???????? ?? ????? ???????? ?????? ??????? ????? ??? ??????? ????? ??? ?????? ??? 45 ?? 60 ??? ??????? ??? ??????????????? ????????? ?????? ??????????
???????? ????????? ???????? ????? ?????????? ??????? ?????? ??? ?? ?? ??????.  ??? ?????? ?????? ?????????? toe_lift ????? toe_straight ????? ???? ??????? ???? ????.
toe_lift ??????? ?? ????? ????? ???????? ????? ?????? ???????? ?????????? ????? ?? ??????? ???????????. toe_straight ??????? ?? ??????? ????? ????? ?????? ????? ????
?? ???????  ?????? ?????.??? ????????? ??????? ???? ???????? ?????????? ????????.
$roll=foot_loc.roll  // roll ???????? ????????? ????? ????
heel_loc.rotateY=min(0,$roll); // ????? $roll ??????? ????? ??????? ??? ?????? ????????.
ball_loc.rotateY=max(0,$roll); // ????? $roll ??????? ????? ??????? ??? ?????? ????????.
???? toe_lift ????? toe_straight-???  ??? ????????????? ????? ??????? ????????.ball_loc ????? toeLift_loc ???????????? ????????? $roll ??????????? ???? ????????? ??? ???? ??
?? ??? ?????? ?????? ??????.$roll ??????????? ???? ?????? toe_lift ????????? ??????? ?????? ???? ???? ?????? toeLift_loc ??????? ? ?????????? ????? ????? ?????.
????? .$roll ??????????? ????  toe_straight ??????? ????????  toeLift_loc ??????? ?? ? ?????????? ????? .$roll ?????????? ??????? ?????? ??????? ????? ?????? ?????????
(ball_loc.rotateX=0) ???? ?????. ?????? ?????????????? ???? Linstep ??????? ????????.?????? ????? ?? ???????? ?????????? ????????? ????? 0 ??? 1 -??? ???????
?????????? ????????.????? ??
linstep(0,10,-1); //  ???? 0
linstep(0,10, 0); // ???? 0
linstep(0,10, 1); // ???? 0.1
linstep(0,10, 5); // ???? 0.5
linstep(0,10, 9); // ???? 0.9
linstep(0,10, 10); // ???? 1
linstep(0,10, 15); // ???? 1
??? ???. linstep($toe_lift, $toe_straight, $roll) * $roll; ??? ????? ?? $roll ??????????? ???? $toe_lift-??? ???? ??? 0-??? ???????. ????? ???? ?? $toe_straight-??? ?? ??? 1-???
???????.????? ??????????? ???? ??? ?????? ???? ?????? ??????? ??????????? ???? ??? ????? ???????.?? ??? ?? ???? ? ?????? ???????? $roll ???????????
?????? ????????.????? ??????????? $roll ?? $toe_straigh-??? ?? ?????? ? ???  toeLift_loc.rx ??  $roll-??? ????? ?????? ?????.
$toe_lift = foot_loc.toe_lift;
$toe_straight = foot_loc.toe_straight;
toeLift_loc.rotateX = linstep($toe_lift,$toe_straight, $roll) * $roll;
?????? ?????? ?????? ????????????? ???? ????.??? ??????? ?????????? ??????? ????? ???? ???? ????? ??? ?????? ??? ?????? ?????? ??????? ?????.????? $roll
???????? toe_straight-??? ??????  ????? ??? ?????? ??????? ???? ???????? ???? ?????? ?????? ???????? 0-??? ?????? ?????? ????????????.????? ?? toe_lift ?? 45,
toe_straight 90 ??? ?????? ball_loc-?? ??????  ?? 0-45 ?????? $roll-?? ???????  ???? ?????. 45-90 ??????? ???????? 0 ?????? ?????? ?????.
(linstep(0,$toe_lift,$roll))*(1-(linstep($toe_lift, $toe_straight,$roll))) * $roll;
??????? ????? ?????????? ????? ?????? ??????? ?????????? ?????? ???? ?? 0-??? 1 ?????? ????. ????????? ?????? ?????? ??????? ?????????? ?????? $roll-?? ????
????? ????? ???????? 1-??? 0 ?????? ???????.????????? ????????? ?????? ?? ??????? ??????????? ??? ? ??? ????????? ???????????? ????. ?????? ??? ??????? ????
????? ????????? ?????? ??? ???????.??????? ???????? ??? ????????? ???????? ?????????? ????????.
?????? ??? ???????? ???????? ???? ???????? ??? ??????  ?????????????? ????????? ??????? ??? ?????? ????? ??????????? ????? ??????? ?? ?????? ????????.?????
??????????? ???????? ??????????????? ????? ?????? ??? ????? ?? ??????? ????????? ??????? ???????? ???? ??????????? ??????.????? ??????? ????? ????? ????? ???
?????? ??????? ????? ???? ????????? ????? ?????? ???????? ?????? ????????.
??????? ??????? ???????? ????? ?????????.

$roll=foot.roll;
$toe_lift=foot.toe_lift;
$toe_straight=foot.toe_straight;
ball.rotateZ=max(0,(linstep(0,$toe_lift,$roll))*(1-(linstep($toe_lift, $toe_straight,$roll))) * $roll);
heel.rotateZ=min(0,$roll);
toe.rotateZ=linstep($toe_lift,$toe_straight,$roll)*$roll;



???????? ?????????.

????  ??????? ?????????? ??????? ???????? ???????? ?????? ??????????? ???? ?????.?????? ?????? ????? ?????? ???? ?? no-flip ???? ??.?????? ?????? ???????????
???  IK ??????? ?????? ???????????? ??????????? ???????????  ????? ?????, ????? ???? ??????. ???? ?? IK ?????????? ????? ?????,?????????? ??????? ?????? pole
???????? ???????? ???????????? ??? ?????? ?????? ???????? ???????? ????? ????????? ??????? ????????? ?????????.?????,?????????? ???????????? ????????
????? pole ?????? ??????????? ????????? ??????????  ????? ???? ???? ?? ?????????. No-flip ???? ?? ?????? ??????????.?????? IK solver ?? ??????? ??????? ????????
 ???? ?????. ????? ????????? ???????????? ???? pole ?????? ????????? IK ???????? ??????????????? ??? ????? ????????? ????? ??. ????? ?????? ?????? ?????????
 ???????? ?????, ???? ???????? ?????????? ??????. ?????? ???? ?????? ????????? ??? ???? ??? ?????? ?? ????????? ???????? ?????.
knee_loc ??????? ???????  ???????? ???? ???? ?????? leg_Ik-? ???? ?????? ?????? ??????.???? ???????? ?????? ?????? ???? ???? ???? ???? ??????? twist ?????????
????? ??? ?????? ???????? ?????????? 90 ???? -90 ?????? ????????. ?????? ?????????? ????? ????? ???????? ???? ?????.
   ?????? ?????? ?????????  foot-??  ?????????? ????? ????? ???????? ?????????  ?????.????? ???? ???? ?????????? ????? ?????? ????? ????? ?????.?????? ???????
???? ?????? ????????? foot_loc-?? ????????? ????????? XZY ?????? ?????? ????????.????? kn??_loc-?? ?????? ?????????? ?????? ???????? ???????? ????????? ?????
????? ?? ????????. ????? ??? ?????????  ?????? ?????? ??? heel_loc ????? ball_loc ?? ? ?????? ??????? ????? ???????????? ????????? ??????  ball_loc-?? ?????? ????????
??????? ?? ??????.
   ?????? ????? ?????????? ????????? ??????? ???? ????? ?????????? ??????????? ?????? ?????? ???? ????????.knee_loc  ?????? ????????? ???????? ????? ? ??? ??
 ?????????? ????? ????????? ???????. ??????? ?????? ???????????? ??????? twist ?????????  foot_loc-? ???? ????.
1. heel_loc ????????? ?????????? ??????? ????????? ???????? ?????? knee_grp ??? ???????.
2. knee_grp-??? ball_loc ????????? ?????? ???????.
3. knee_loc pole ???????? knee_grp-?? ?????? ???????.
4. ??????? ??????? ?????? ??????? foot_loc-??  twist ?????????  knee_grp-???  rotateY ?????????? ?????? ????.

?????? ??????  ????????????

??????  ????????? ??????????? ???????? ???? ??????? ?????????  ???????????.
1. ?????? inside_loc ?????? ??????? (null) ???????. ?????? ??????? ????? ????? ????? ???  ?????.
2. ?????? outside_loc ?????? ??????? (null) ???????. ?????? ??????? ????? ????? ????? ???  ?????.
3 inside_loc-?? outside_loc-?? ?????? ???????.
4. outside_loc-?? heel_loc-?? ???? ????? ?????? ???????.
5. inside_loc-?? ?????? ?????? toe_loc-?? ???? ?????. ????? ?4. ?????? ????? ????? ??????? ???????? ???? ??????? ???????????? ???? ????.
6. foot_loc-?? ????? ????? ???? ????? lean, side ????? ???????????? ???? ????.
7  $lean =l_foot_anim.lean;
   $side = l_foot_anim.side; ????? ???? ??????????? ????????????? ???? ???????????.lean ??????? ?? ????? ???????? ???????? ???? ???? ?????????? ?????????.
side ????????? ?????????? ??????? ?????? ????? ?????? ????????? ????????? ?????. ??????????? ?????? ??? ?????????.
 ball.rotateZ=$lean;
outside_loc.rotateZ = min($side,0);
inside_loc.rotateZ = max(0,$side);

Friday, November 6, 2009

Аниматорын мэдэхэд илүүдэхгүй зүйлс

Хамгийн эхэнд маш сайн төлөвлөгөө гаргах нь нэн чухал гэдгийг туршлагатай аниматорууд байнга захидаг.Үзэг цаас аваад урьдчилж тоймлон дүрслэх нь цаг завыг ихээхэн хэмнэдэг.Ингэж урьдчилан төлөвлөхөд юу шаардлагатай вэ? Ажиглалт. Хялбархан сонсогдож магадгүй.Гэхдээ аниматорын өнцгөөс ажиглаж сурахад нэлээн дадлага хэрэгтэй.Болж  үйл явдалд тухайн  субъект хэрхэн хандаж, хариу үзүүлж байгаа,сэтгэлийн хөдөлгөөн нь нүүрэн дээр нь хэрхэн илэрч байгаа гэх мэт жирийн хүмүүсийн анзаарахгүй зүйлийг сайн тогтоох хэрэгтэй. Хамгийн чухал зүйлсийн нэг бол урьдчилж бэлдсэн загвар материал юм.Үүнд фото зураг, комикс, кино, анимаци, найз нөхөд болон өөрийн бэлдсэн бичлэг гээд төрөл бүрийн зүйл байж болно. Секундыг хэдэн зуу  хуваасан агшинд авсан зурагнууд нь хөдөлгөөний мөн чанарыг ойлгоход ихээхэн тустай зүйл юм. Доктор Гаролд Эдгертоны "Stopping Time" бол үүний бодит жишээ. Анимаци хийх гэж байгаа үйлдлээ камерийн өмнө өөрөө юмуу найз нөхдийн туслалцаатай давтан хийж судлах нь маш үр дүнтэй.Энэ загвар материалуудыг зүгээр л нэг бүү үз.Сайн судлах хэрэгтэй.Бүр кадр кадраар нь зогсоож байгаад ажиглах хэрэгтэй.Тухайн үйлдэл болон сэтгэл хөдөлгөөнийг тодоор илэрхийлж байгааг

Wednesday, November 4, 2009

global proc dynJointChain ()
{
    //сонголтыг дараах массивт хадгална.
    string $sel[] = `ls -sl`;
    //Үндсэн ба үзүүрийн холбоосын нэрсийг доорхи хувьсагчид хадгална
    string $baseJoint = $sel[0];
    string $endJoint = $sel[1];
    //Дараахь вектор массивт холбоосуудын үндсэн координатуудыг хадгална.
    vector $jointPos[];
    //доорхи хувьсагч while цикл дотор ашиглагдаж байгаа тухайн холбоосын түр нэрийг хадгална.
    string $currentJoint = $baseJoint;
    //Вектор массивын индексийг тодорхойлоход ашиглах тоолуур
    int $counter = 0;
 
 
    //хэрэглэгчийн сонголт зөв эсэхийг хянах
    if (!((`objectType -isType "joint" $baseJoint`) && (`objectType -isType "joint" $endJoint`)))
    {
        warning "Ta ehnii esvel syyliin holboosiig buruu songoson baina.";
    }else
    {
 
        //үзүүрийн холбоосийг хамгийн эхлэж сонгосон гэж үзнэ /
        select $baseJoint;
        // үзүүрийн холбоосноос эхлэн төгсгөлийн холбоос хүртэл бүх холбооснуудын хооронд алхамт шилжилт хийнэ.
                // Энэхүү цикл бүх холбоосны байрлалыг $jointPos массивт хадгална.
               while ($currentJoint != $endJoint)
        {
            $jointPos[$counter] = `joint -q -p -a $currentJoint`;
            pickWalk -d down;
            $sel = `ls -sl`;
            $currentJoint = $sel[0];
            $counter++;
        }
     
        //Доорхи гурван мөр нь циклийн орхигдуулсан үзүүрийн холбоосын байрлалыг массивт нэмж өгнө.
        $sel = `ls -sl`;
        $currentJoint = $sel[0];
        $jointPos[$counter] = `joint -q -p -a $currentJoint`;
         
        // $jointPos[] массив бүх холбоосуудын ертөнцийн координатуудыг агуулж байгаа тул эдгээр цэгийг дайруулан муруйг татах хэрэгтэй.     
      
                //Доорхи хувьсагч муруйг үүсгэх командын эхний хэсгийг агуулна.
        string $buildCurve = "curve -d 1 ";
        //Муруйг үүсгэхэд ашиглах циклийн тоолуур
        int $cvCounter = 0;
     
        //Энэ цикл нь холбоосуудын координатыг  муруй үүсгэх командын араас залгана.
        while ($cvCounter <= $counter)
        {
            $buildCurve = ($buildCurve + " -p " + $jointPos[$cvCounter]);
            $cvCounter++;
        }
     
        //Муруйг үүсгэх командын төгсгөлийн залгаас
        $buildCurve = $buildCurve + ";";
        //$buildCurve хувьсагчын утгыг Маяагийн команд болгож дуудна. (Үүссэн муруй холбоос бүрийг дайрсан байх ёстой.)
        string $nameOfCurve = `eval ($buildCurve)`;
     
        //Make curve dynamic.
        select $nameOfCurve;
        makeCurvesDynamicHairs 0 0 0;
     
        //Determine what the name of the dynamic curve is
        string $nameOfDynCurve;
        int $sizeOfString = `size($nameOfCurve)`;
        $sizeOfString++;
        $nameOfDynCurve = `substring $nameOfCurve 6 $sizeOfString` ;
        $sizeOfString = $nameOfDynCurve;
        $sizeOfString++;
        $nameOfDynCurve = ("curve" + $sizeOfString);
     
        //Create Tip Constraint
        string $nameOfHairConstraint[];
     
        if (`checkBoxGrp -q -value1 tipConstraintCheckbox`)
        {
            select -r ($nameOfDynCurve + ".cv[" + $cvCounter + "]");
            createHairConstraint 0;
            string $selection[] = `pickWalk -d up`;
            $nameOfHairConstraint[0] = $selection[0];
            $nameOfHairConstraint[0] = `rename $nameOfHairConstraint[0] ($baseJoint + "TipConstraint")`;
        }
     
        //Make Joint Chain Stretchy
        string $curveInfoNode;
        string $nameOfUtilityNode;
     
        if (`checkBoxGrp -q -value1 stretchCheckbox`)
        {
            //Create curve info node
            $curveInfoNode = `arclen -ch 1 $nameOfDynCurve`;
            $curveInfoNode = `rename $curveInfoNode ($baseJoint + "CurveInfoNode")`;
            //Create mult/div node
            $nameOfUtilityNode = `shadingNode -asUtility multiplyDivide`;
            $nameOfUtilityNode = `rename $nameOfUtilityNode ($baseJoint + "MultiDivNode")`;
            //Create condition node
            $nameOfConditionNode = `shadingNode -asUtility condition`;
            $nameOfConditionNode = `rename $nameOfConditionNode ($baseJoint + "ConditionNode")`;
         
            //Setup multi/div node
            setAttr ($nameOfUtilityNode + ".operation") 2;
            connectAttr -force ($curveInfoNode + ".arcLength") ($nameOfUtilityNode + ".input1X");
            setAttr ($nameOfUtilityNode + ".input2X") (`getAttr ($curveInfoNode + ".arcLength")`);
            //Setup condition node
            connectAttr -force ($nameOfUtilityNode + ".outputX") ($nameOfConditionNode + ".firstTerm");
            connectAttr -force ($nameOfUtilityNode + ".outputX") ($nameOfConditionNode + ".colorIfFalseR");
            setAttr ($nameOfConditionNode + ".operation") 4;
            setAttr ($nameOfConditionNode + ".secondTerm") 1.0;
            setAttr ($nameOfConditionNode + ".colorIfTrueR") 1.0;
         
            //Initial selection going into the while loop
            select $baseJoint;
            $currentJoint = $baseJoint;
            //Will loop through all the joints between the base and end by pickwalking through them.
            //The loop connects the scaleX of each joint to the output of the multi/div node.
            while ($currentJoint != $endJoint)
            {
                connectAttr -f ($nameOfConditionNode + ".outColorR") ($currentJoint + ".scaleX");
                pickWalk -d down;
                $sel = `ls -sl`;
                $currentJoint = $sel[0];
            }
        }
 
        //Display Current Position of Hair
        select $nameOfDynCurve;
        displayHairCurves "current" 1;
     
        //Determine name of follicle node
        select $nameOfCurve;
        string $nameOfFollicle[] = `pickWalk -d up`;
 
        //Create Joint Chain Controller Object
        string $jointCtrlObjArray[];
        $jointCtrlObjArray[0] = `createNode implicitSphere`;
        $jointCtrlObjArray = `pickWalk -d up`;
     
        string $jointCtrlObj = $jointCtrlObjArray[0];
     
        //Point Constrain Control Object to the end joint
        pointConstraint $endJoint $jointCtrlObj;
     
        //Add attributes to controller for the dynamics
        addAttr -ln stiffness -at double -min 0 -max 1 -dv 0.001 -keyable true  $jointCtrlObj;
        addAttr -ln lengthFlex -at double  -min 0 -max 1 -dv 0 -keyable true $jointCtrlObj;
        addAttr -ln damping -at double -min 0 -max 100 -dv 0 -keyable true  $jointCtrlObj;
        addAttr -ln "drag" -at double -min 0 -max 1 -dv .05 -keyable true  $jointCtrlObj;
        addAttr -ln friction -at double -min 0 -max 1 -dv 0.5 -keyable true  $jointCtrlObj;
        addAttr -ln "gravity" -at double -min 0 -max 10 -dv 1 -keyable true  $jointCtrlObj;
        addAttr -ln "controllerSize" -at double -min 0 -max 100 -dv 0.5 -keyable true  $jointCtrlObj;
        addAttr -ln "turbulenceCtrl" -at bool -keyable true  $jointCtrlObj;
        setAttr -lock on ($jointCtrlObj + ".turbulenceCtrl");
        addAttr -ln "strength" -at double -min 0 -max 1 -dv 0 -keyable true  $jointCtrlObj;
        addAttr -ln "frequency" -at double -min 0 -max 2 -dv 0.2 -keyable true  $jointCtrlObj;
        addAttr -ln "speed" -at double -min 0 -max 2 -dv 0.2 -keyable true  $jointCtrlObj;
     
        //Determine what the name of the hair system is
        string $nameOfHairSystem;
        int $sizeOfString = `size($nameOfFollicle[0])`;
        $sizeOfString++;
        $nameOfHairSystem = `substring $nameOfFollicle[0] 9 $sizeOfString` ;
        $sizeOfString = $nameOfHairSystem;
        $nameOfHairSystem = ("hairSystemShape" + $sizeOfString);
     
        //Add special attribute to house name of hairSystem
        addAttr -ln nameOfHairShapeNode -dt "string" -keyable false $jointCtrlObj;
        setAttr -type "string" -lock true ($jointCtrlObj + ".nameOfHairShapeNode") ($nameOfHairSystem);
     
        //Add special attribute to house name of follicle
        addAttr -ln nameOfFollicleNode -dt "string" -keyable false $jointCtrlObj;
        setAttr -type "string" -lock true ($jointCtrlObj + ".nameOfFollicleNode") ($nameOfFollicle[0]);
     
        //Add special attribute to house name of dynamic curve
        addAttr -ln nameOfDynCurve -dt "string" -keyable false $jointCtrlObj;
        setAttr -type "string" -lock true ($jointCtrlObj + ".nameOfDynCurve") ($nameOfDynCurve);
     
        //Add special attribute to house name of tip constraint
        addAttr -ln nameOfTipConstraint -dt "string" -keyable false $jointCtrlObj;
        setAttr -type "string" -lock true ($jointCtrlObj + ".nameOfTipConstraint") ($nameOfHairConstraint[0]);
     
        //Add special attribute to house name of multi/div node
        addAttr -ln nameOfMultiDivNode -dt "string" -keyable false $jointCtrlObj;
        setAttr -type "string" -lock true ($jointCtrlObj + ".nameOfMultiDivNode") ($nameOfUtilityNode);
     
        //Add special attribute to base and end joint names
        addAttr -ln baseJoint -dt "string" -keyable false $jointCtrlObj;
        addAttr -ln endJoint -dt "string" -keyable false $jointCtrlObj;
        setAttr -type "string" -lock true ($jointCtrlObj + ".baseJoint") ($baseJoint);
        setAttr -type "string" -lock true ($jointCtrlObj + ".endJoint") ($endJoint);
     
        //Add special attribute to house baking state
        addAttr -ln bakingState -at bool $jointCtrlObj;
     
        //Add special attribute to house stretchy state
        addAttr -ln isStretchy -at bool $jointCtrlObj;
        if (`checkBoxGrp -q -value1 stretchCheckbox`)
        setAttr ($jointCtrlObj + ".isStretchy") 1;
     
        //Overide the Hair dynamics so that the follicle controls the curve dynamics
        select $nameOfFollicle;
        $nameOfFollicle = `pickWalk -d down`;
        setAttr ($nameOfFollicle[0] + ".overrideDynamics") 1;
     
        //Set the dynamic chain to hang from the base joint (not both ends)
        setAttr ($nameOfFollicle[0] + ".pointLock") 1;
     
        //Connect attributes on the controller sphere to the follicle node
        connectAttr -f ($jointCtrlObj +".stiffness") ($nameOfFollicle[0] + ".stiffness");
        connectAttr -f ($jointCtrlObj +".lengthFlex") ($nameOfFollicle[0] + ".lengthFlex");
        connectAttr -f ($jointCtrlObj +".damping") ($nameOfFollicle[0] + ".damp");
        //Connect attribute on the controller sphere to the hair system node
        connectAttr -f ($jointCtrlObj +".drag") ($nameOfHairSystem + ".drag");
        connectAttr -f ($jointCtrlObj +".friction") ($nameOfHairSystem + ".friction");
        connectAttr -f ($jointCtrlObj +".gravity") ($nameOfHairSystem + ".gravity");
        connectAttr -f ($jointCtrlObj +".strength") ($nameOfHairSystem + ".turbulenceStrength");
        connectAttr -f ($jointCtrlObj +".frequency") ($nameOfHairSystem + ".turbulenceFrequency");
        connectAttr -f ($jointCtrlObj +".speed") ($nameOfHairSystem + ".turbulenceSpeed");
     
        //Connect scale of controller to the size attr
        connectAttr -f ($jointCtrlObj +".controllerSize") ($jointCtrlObj +".scaleX");
        connectAttr -f ($jointCtrlObj +".controllerSize") ($jointCtrlObj +".scaleY");
        connectAttr -f ($jointCtrlObj +".controllerSize") ($jointCtrlObj +".scaleZ");
     
     
        //Lock And Hide Attributes on Control Object.
        setAttr -lock true -keyable false ($jointCtrlObj + ".tx");
        setAttr -lock true -keyable false ($jointCtrlObj + ".ty");
        setAttr -lock true -keyable false ($jointCtrlObj + ".tz");
        setAttr -lock true -keyable false ($jointCtrlObj + ".rx");
        setAttr -lock true -keyable false ($jointCtrlObj + ".ry");
        setAttr -lock true -keyable false ($jointCtrlObj + ".rz");
        setAttr -lock false -keyable false ($jointCtrlObj + ".sx");
        setAttr -lock false -keyable false ($jointCtrlObj + ".sy");
        setAttr -lock false -keyable false ($jointCtrlObj + ".sz");
     
        //Build the splineIK handle using the dynamic curve.
        select $baseJoint $endJoint $nameOfDynCurve;
        string $nameOfIKHandle[] = `ikHandle -sol ikSplineSolver -ccv false` ;
        $nameOfIKHandle[0] = `rename $nameOfIKHandle[0] ($baseJoint + "ikHandle")`;
     
        //Rename Ctrl Obj
        $jointCtrlObj = `rename $jointCtrlObj ($baseJoint + "DynChainControl")`;
     
        //Parent follicle node to the parent of the base joint
        //This will attach the joint chain to the rest of the heirarchy if there is one.
        select $nameOfFollicle[0];
        pickWalk -d up;
        string $follicleGrpNode[] = `pickWalk -d up`;
        //Determine parent of base joint
        select $baseJoint;
        string $parentOfBaseJoint[] = `pickWalk -d up`;
     
        if ($parentOfBaseJoint[0] == $baseJoint)
        {
            warning "No parent hierarchy was found for the dynamic chain.\n";
        }else
        {
            //Parent the follicle into heirarchy
            parent $follicleGrpNode $parentOfBaseJoint;
            parent -w $nameOfDynCurve;
        }
     
        //Set dynamic chain attributes according to creation options
        float $sliderStiffness = `floatSliderGrp -query -value sliderStiffness`;
        float $sliderDamping = `floatSliderGrp -query -value sliderDamping`;
        float $sliderDrag = `floatSliderGrp -query -value sliderDrag`;
        setAttr ($baseJoint + "DynChainControl.stiffness") $sliderStiffness;
        setAttr ($baseJoint + "DynChainControl.damping") $sliderDamping;
        setAttr ($baseJoint + "DynChainControl.drag") $sliderDrag;
     
        //Group the dynamic chain nodes
        string $nameOfGroup = `group -name ($baseJoint + "DynChainGroup") $jointCtrlObj $nameOfDynCurve $nameOfIKHandle[0] $nameOfHairSystem`;
     
        //If the chain has a tip constraint, then parent this under the main group to keep things tidy.
        if (`checkBoxGrp -q -value1 tipConstraintCheckbox`)
        {
            parent $nameOfHairConstraint[0] $nameOfGroup;
        }
     
        //Turn the visibility of everything off to reduce viewport clutter.
        setAttr ($nameOfDynCurve + ".visibility") 0;
        setAttr ($nameOfIKHandle[0] + ".visibility") 0;
        setAttr ($nameOfDynCurve + ".visibility") 0;
        setAttr ($follicleGrpNode[0] + ".visibility") 0;
        setAttr ($nameOfHairSystem + ".visibility") 0;
     
        //Delete useless 'hairsystemoutputcurves' group node
        select $nameOfHairSystem;
        string $nameOfGarbageGrp[] = `pickWalk -d up`;
        delete ($nameOfGarbageGrp[0] + "OutputCurves");
     
        //Select dynamic chain controller for user
        select ($baseJoint + "DynChainControl");
     
        //Print feedback for user
        print "Dynamic joint chain successfully setup!\n";
    }
 
}


/////////////////////////////////////////////////////////////////////////////////////////
//                                Collisions Procedure
/////////////////////////////////////////////////////////////////////////////////////////

global proc collideWithChain ()
{
    string $sel[] = `ls -sl`;
    string $controllers[];
    string $colliders[];
 
    //Progress Window Amount
    int $amount;
    int $numberOfObjects = size($sel);
    int $i = 0;
 
    progressWindow
        -title "CGToolkit's Dyn Chain Collisions:"
        -progress $amount
        -status "Preparing: 0%"
        -minValue 0
        -maxValue 100
        -isInterruptable true;
 
    //Loop through the whole selection and split up
    //into $controllers or $colliders
    for ($obj in $sel)
    {
        $i++;
         // Check if the dialog has been cancelled
        if ( `progressWindow -query -isCancelled` ) break;
        // Check if end condition has been reached
        if ( `progressWindow -query -progress` >= 100 ) break;
     
        $amount = ((100/$numberOfObjects) * $i);
        progressWindow -edit -progress $amount;
     
        //Find the current index in controllers array
        int $pos = size($controllers);
        //If obj is a controller
        if (`attributeExists "nameOfHairShapeNode" $obj`)
        {
            $controllers[$pos] = $obj; //Add to controller list
        }else
        {
            //Get the shape node of obj
            string $shapeNode[] = `listRelatives -s -path $obj`;
         
            //Find current index in collider array
            $pos = size($colliders);
            //Check if shape node is a mesh, or a nurbs surface
            if ((`objectType -isType "mesh" $shapeNode[0]`) || (`objectType -isType "nurbsSurface" $shapeNode[0]`))
            {
                $colliders[$pos] = $obj;
            }
        }
     
    }
 
    progressWindow -edit
        -status "Connecting Colliders: 0%";
 
    $numberOfObjects = size($controllers);
    $i = 0;
 
    //For every controller that was selected...
    for ($chainCtrl in $controllers)
    {
        $i++;
         // Check if the dialog has been cancelled
        if ( `progressWindow -query -isCancelled` ) break;
        // Check if end condition has been reached
        if ( `progressWindow -query -progress` >= 100 ) break;
     
        $amount = ((100/$numberOfObjects) * $i);
        progressWindow -edit -progress $amount;
     
     
        //Get the name of the hair shape node
        string $hairShape = `getAttr ($chainCtrl + ".nameOfHairShapeNode")`;
     
        //For every NURBS or polygon surface that was selected...
        for ($collider in $colliders)
        {
            //Create geoConnector node and store it's name into a variable
            string $nameofGeoConnector = `createNode geoConnector`;
         
            //Get the shape node of collider
            string $objShape[] = `listRelatives -s -path $collider`;
         
            //Connect all the necessary attributes to make the surface collide
            connectAttr ($objShape[0] +".message") ($nameofGeoConnector + ".owner");
            connectAttr ($objShape[0] +".worldMatrix[0]") ($nameofGeoConnector + ".worldMatrix");
            connectAttr ($objShape[0] +".outMesh") ($nameofGeoConnector + ".localGeometry");
            connectAttr -na ($nameofGeoConnector + ".resilience") ($hairShape + ".collisionResilience");
            connectAttr -na ($nameofGeoConnector + ".friction") ($hairShape + ".collisionFriction");
            connectAttr -na ($nameofGeoConnector + ".sweptGeometry") ($hairShape + ".collisionGeometry");
            connectAttr time1.outTime ($nameofGeoConnector + ".currentTime");
 
            //Print output to the user for each connected collider.
            print ($obj + " has been set to collide with " + $chainCtrl + "\n");
        }
    }
    progressWindow -endProgress;
}


/////////////////////////////////////////////////////////////////////////////////////////
//                                BAKING PROCEDURE
/////////////////////////////////////////////////////////////////////////////////////////

global proc bakeDynChain ()
{
    //Declare necessary variables
    string $initialSel[] = `ls -sl`;
    string $allCtrls[];
    int $i;
    int $amount;
 
    //Filter selection to contain only dynamic chain controllers.
    for ($obj in $initialSel)
    {
        if (`attributeExists "nameOfHairShapeNode" $obj`)
        {
            $allCtrls[$i] = $obj;
            $i++;
        }
    }
 
    //Create a progress window
    progressWindow
        -title "CGToolkit's Dynamic Joint Chain:"
        -progress $amount
        -status "Baking Joint Chains:"
        -minValue 0
        -maxValue 100
        -isInterruptable true;
         
    //Construct frame range variable
    string $frameRangeToBake;
    float $startFrame = `intField -query -value startFrame`;
    float $endFrame = `intField -query -value endFrame`;
    $frameRangeToBake = ("\"" + $startFrame + ":" + $endFrame + "\"");
 
    int $j = 1;
    //For all of the selected chain controllers.
    for ($obj in $allCtrls)
    {
        // Check if the dialog has been cancelled
        if ( `progressWindow -query -isCancelled` ) break;
        // Check if end condition has been reached
        if ( `progressWindow -query -progress` >= 100 ) break;
     
        $amount = ((100/$i) * $j);
        progressWindow -edit -progress $amount;
        progressWindow -edit -status ("Baking chain " + $j + " of " + $i + " :");
     
        $j++;
     
        string $chainCtrl = $obj;
        string $baseJoint = `getAttr ($chainCtrl + ".baseJoint")`;
        string $endJoint = `getAttr ($chainCtrl + ".endJoint")`;
        string $bakingJoints = "{\"" ;
        string $currentJoint[];
        $currentJoint[0] = $endJoint;
     
        //Determine joints to be baked
        while ($currentJoint[0] != $baseJoint)
        {
            $bakingJoints = ($bakingJoints +$currentJoint[0] + "\", \"");
            select $currentJoint[0];
            $currentJoint = `pickWalk -d up`;
        }
     
        //Add the base joint that the while loop will miss
        $bakingJoints = ($bakingJoints + $baseJoint + "\"}");
     
        //Concatenate the bake simulation command with the necessary joint names.
        $bakingJoints = ("bakeResults -simulation true -t " + $frameRangeToBake + " -sampleBy 1 -disableImplicitControl true -preserveOutsideKeys true -sparseAnimCurveBake false -controlPoints false -shape true" + $bakingJoints);
     
        //Evaluate the $bakingJoints string to bake the simulation.
        eval $bakingJoints;
     
        //Tell control object that joints are baked.
        setAttr ($chainCtrl + ".bakingState") 1;
     
        //Print feedback to user
        print ("All joints controlled by " + $chainCtrl + " have now been baked!\n");
    }
    progressWindow -endProgress;
}

/////////////////////////////////////////////////////////////////////////////////////////
//                                DELETE DYNAMICS PROCEDURE
/////////////////////////////////////////////////////////////////////////////////////////

global proc deleteDynChain ()
{
    //Declare necessary variables
    string $initialSel[] = `ls -sl`;
    string $chainCtrl = $initialSel[0];
 
    int $error = 0;
 
    //Check that controller is selected.
    if (!`attributeExists "bakingState" $chainCtrl`)
    {
        $error = 1;
        warning "Please select a chain controller. No dynamics were deleted.";
    }else
    {
        //Check if joints have been baked.
        if(((`getAttr ($chainCtrl + ".bakingState")`) == 0) && ((`getAttr ($chainCtrl + ".isStretchy")`) == 1))
        {
            string $result = `confirmDialog
                                -title "Delete Dynamics Warning"
                                -message "Deleting the dynamics on a stretchy chain may cause it to collapse. Please bake the joint chain before deleting."
                                 -button "Continue Anyway" -button "Cancel"
                                -defaultButton "Cancel"
                                 -cancelButton "Cancel" -dismissString "Cancel"`;
            if ($result == "Cancel")
            {
                $error = 1;
                warning ("Dynamics were not deleted for " + $chainCtrl);
            }
        }
    }
 
    if ($error == 0)
    {
     
        //Delete Hair System Node
        string $hairSystemName[];
        $hairSystemName[0] = `getAttr ($chainCtrl + ".nameOfHairShapeNode")`;
        select $hairSystemName[0];
        $hairSystemName = `pickWalk -d up`;
        delete $hairSystemName;
     
        //Delete Follicle Node
        string $follicleNode[];
        $follicleNode[0] = `getAttr ($chainCtrl + ".nameOfFollicleNode")`;
        select $follicleNode[0];
        $follicleNode = `pickWalk -d up`;
        delete $follicleNode;
     
        //Delete Dynamic Hair Curve
        delete `getAttr ($chainCtrl + ".nameOfDynCurve")`;
     
        //Delete Tip Constraint
        if ((getAttr ($chainCtrl + ".nameOfTipConstraint")) != "")
        delete `getAttr ($chainCtrl + ".nameOfTipConstraint")`;
     
        //Delete Multi/Div Node
        if ((getAttr ($chainCtrl + ".nameOfMultiDivNode")) != "")
        delete `getAttr ($chainCtrl + ".nameOfMultiDivNode")`;
   
        //Delete IK Handle
        string $baseJoint = `getAttr ($chainCtrl + ".baseJoint")`;
        delete ($baseJoint + "ikHandle");
     
        //Delete control object
        delete $chainCtrl;
     
        //Print feedback to the user.
        print "Dynamics have been deleted from the chain.\n";
    }
}


/////////////////////////////////////////////////////////////////////////////////////////
//                                MAIN WINDOW
/////////////////////////////////////////////////////////////////////////////////////////

global proc cgTkDynChain ()
{
 
    if (`window -q -ex dynChainWindow`) deleteUI dynChainWindow;
 
    //Main Window
    window -title "Dynamic hodolgoont ginjin yas" -w 360 -h 200 dynChainWindow;
    scrollLayout -hst 0;
    columnLayout dynChainColumn;
 
    //Dynamic Chain Creation Options Layout
    frameLayout -w 320 -h 130
                -borderStyle etchedOut
                -collapsable true
                -label "Dynamic Chain Creation Options:"
                creationOptions;
    frameLayout -e -cl true creationOptions;
    columnLayout -cw 300;
        //Stiffness
        floatSliderGrp -label "Stiffness:"
            -cw3 60 60 60 -cal 1 left
            -cal 2 left -cal 3 left
            -field true
            -precision 3
            -min 0 -max 1 -value 0.001
            sliderStiffness;
        //Damping
        floatSliderGrp -label "Damping:"
            -cw3 60 60 60 -cal 1 left
            -cal 2 left -cal 3 left
            -field true
            -precision 3
            -min 0 -max 100 -value 0.05
            sliderDamping;
        //Drag
            floatSliderGrp -label "Drag:"
            -cw3 60 60 60 -cal 1 left
            -cal 2 left -cal 3 left
            -field true
            -precision 3
            -min 0 -max 1 -value 0.0
            sliderDrag;
     
        //Tip Constraint Checkbox
        separator -h 20  -w 330;
        checkBoxGrp -label "Create Tip Constraint : " -cw 1 150 tipConstraintCheckbox;
        checkBoxGrp -label "Allow Joint Chain to Stretch: " -cw 1 150 stretchCheckbox;
     
        //separator -h 20  -w 330;
     
    setParent..;
    setParent..;
 
    //Button Layouts
    rowColumnLayout -nc 2 -cw 1 175 -cw 2 150;
    text "Select base joint, shift select tip: ";
    button -label "Make Dynamic" -c "dynJointChain";
    text "Select control, shift select collider(s): ";
    button -label "Make Collide" -c "collideWithChain";
    text "Select control: ";
    button -label "Delete Dynamics" -c "deleteDynChain";
    setParent..;
 
    //Bake Animation Layouts
    separator -w 330 -h 20;
    text "                               -Bake Joint Animation-";
    rowColumnLayout -nc 3 -cw 1 100 -cw 2 100 bakeRowColumn;
    text "Start Frame: ";
    text "End Frame:";
    text "Select Control:";
    intField startFrame;
    intField -value 400 endFrame;
    button -label "Bake Dynamics" -c "bakeDynChain";
 
    //Show Main Window Command
    showWindow dynChainWindow;
}

Thursday, October 22, 2009

http://www.ptcbay.com/?ref=dtsoomoo
http://www.linkgrand.com/advertise.php?r=175310
http://www.matrixmails.com/?rid=231118
http://www.clixsense.com/?2957360
http://www.hybux.com/?r=tsoomoo

http://www.theclickers.net/ptc/index.php?ref=zorig
http://www.foreverptc.com/?ref=zorig
http://earn.bz/index.php/zorig.html
http://www.halfpennyclicks.info/index.php?ref=zorig