Хэлний хамгийн чухал хэрэглэгдхүүний нэг бол хувьсагчид, түүний бүтэц юм. 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 хэлний чухал хэсэг. Үүнгүйгээр тоосонцоруудын байрлал, хурд гэх мэт характеристикийг ямар нэг утгатай харьцуулж зүйрлэхэд хүндрэл тулгарна.
Thursday, November 12, 2009
Realflow скрипт хэлний тухай
3d уран бүтээлчид код бичнэ гэхээр л математикийн мэдлэг ихээхэн хэрэгтэй гэж бодоод жийрхэх үзэгдэл ажиглагддаг.Python скрипт хэлийг ашигласнаар хэцүү ярвигтай зүйлүүдийг хялбархан шийдэж болно.Сүүлийн үеийн хэрэгслүүд ихэвчлэн python-ийг өөртөө агуулах болжээ.Учир нь дүрэм нь энгийн бичиглэлтэй ойролцоо.Скриптийг гүнзгий судалж ойлгон туршлагатай болох тусам энэхүү программын ажиллах зарчим танд тодорхой харагдана.Өөрийн бичсэн скриптийн параметрийг хувиргах нь ямар нэг зангилааны утгыг өөрчлөхөөс тэс өөр ялгаатай. Мэдээж хамгийн сайн ном, хичээл байлаа ч танд нэмэр болохгүй нэг зүйл бий.
Та тухайн скрипт ямар үйлдэл гүйцэтгэж байгааг тун сайн ойлгож мэдэх ёстой. Үүний тулд пифоны үндсэн дүрмүүдийг мэддэг байх хэрэгтэй. Жишээ нь өгөгдлийн төрлүүд, энгийн шугаман алгебр,вектор гэх мэт. Олон студи, компаны хүсэлтийг харгалзан бүтэн хоёр жилийн турш ажиллаж байж Realflow 4 хувилбараас эхлэн програмчлах боломжийг нэмж өгчээ. Гэхдээ олон хэрэглэгч хаанаас эхлэхээ мэдэхгүй энэхүү хүчирхэг багажыг төдийлөн ойшоохгүй байсаар.
Скрипт хэлний програмчлалын хэлнээс ялгагдах гол онцлог нь програмын бичиглэл ил харагдаж байдаг бөгөөд хэрэглэгч хүсэлт гаргах үед боловсруулагддаг. Харин C, Java гэх мэт програмчлалын хэлнүүд нь өөр формат руу урьдчилж хөрвүүлсэн (compile) байх шаардлагыг тавьдаг бөгөөд код нь хэрэглэгчид харагдахгүй .Мэдээж програмчлалын хэл нь скриптийг бодвол хамаагүй хурдан ажилладаг.Учир нь хөрвүүлэхдээ техник хангамжид тохируулж оновчтой шийддэг. Сүүлийн үед урьдчилж хөрвүүлэх чадвартай скрипт хэлнүүд нэлээд хэд гарчихаад байна. Тэгвэл realflow яагаад програмчлалын хэлийг ашиглаагүй юм бол? Хөрвүүлэгч нь одоогоор янз бүрийн үйлдлийн систем болон техник хангамжаас шалтгаалан зарим нэг төвөгтэй асуудалтай тулгардаг. Харин скрипт хэлний хувьд ийм зовлон байхгүй. Та зөвхөн кодоо л зөв бичвэл үлдсэнийг нь интерпретор хариуцна. Тэгэхээр энэ хоёр аль аль нь сул болон давуу талуудтай.Орчин үеийн скрипт хэлүүд хэдэн зуун өргөтгөл сангуудыг агуулсан, асар олон тусгай зориулалтын функцуудтай,объект хандалттай хүчирхэг багаж болон хөгжиж байна. Хамгийн өргөн хэрэглэгддэг нь Perl, Python, Javascript, PHP зэрэг хэлүүд.
Next Limit-ийн хөгжүүлэгчид Пифон хэлийг Realflow-д хавсаргаад зогсохгүй хэдэн зуун функц, хувьсагчийг нэмж оруулсан.Одоо програмын ямар ч объект болон атрибут руу пифон скриптийг ашиглан чөлөөтэй хандаж болно.Пифон скрипт програмд бүрэн хавсарсан бөгөөд та ямар нэг нэмэлт зүйл суулгаж тохируулах шаардлагагүй.Пифоны давуу талууд
- Үнэгүй
- Өргөн дэлгэрсэн
- Үйлдлийн системээс хамааралгүй
- Сурах материал элбэг
- Олон програмууд энэ скриптийг ашигладаг болж байгаа гэх зэрэг
Хаанаас эхлэх вэ?
Эхлэн суралцагчид хаанаас нь яаж эхлэх вэ гэдэг тун ойлгомжгүй асуудал байдаг. Скрипт хэлийг маш төвөгтэй бүтэцтэй байх ёстой гэж бодож байвал тийм биш. Энгийн тодорхой зүйлүүдийг нийлүүлснээр бүхнийг шийддэг.Мөн математикийн суутан ч байх шаардлагагүй. Гэхдээ ерөнхий мэдлэг хэрэг болох нь гарцаагүй. Ихэнхи хэлний синтаксийг танилцуулахдаа "hello world" гэсэн жишээнээс эхэлдэг. 3D програмын хувьд бол энэ нь тийм ч чухал зүйл биш юм. Скрипт хэлний ажиллах үндсэн зарчмуудыг дараагийн сэдвээр товчхон харъя.
Та тухайн скрипт ямар үйлдэл гүйцэтгэж байгааг тун сайн ойлгож мэдэх ёстой. Үүний тулд пифоны үндсэн дүрмүүдийг мэддэг байх хэрэгтэй. Жишээ нь өгөгдлийн төрлүүд, энгийн шугаман алгебр,вектор гэх мэт. Олон студи, компаны хүсэлтийг харгалзан бүтэн хоёр жилийн турш ажиллаж байж 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);
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;
}
{
//сонголтыг дараах массивт хадгална.
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;
}
Subscribe to:
Posts (Atom)