16 Nisan 2012 Pazartesi

Softimage ICE Ders Notları - 03 - Karda Ayak İzi


Merhaba,
Bu derste karda ayak izi simulasyonu yapacağız.

Şöyle bir sahne ile başlıyoruz.


Videoda da görüldüğü, gridimizin yoğunluğu biraz fazla. 100 x 100 subdivision değerine sahip bir gridimiz var ki mümkün olduğu kadar ayak izi belli olsun.

Grid'i seçip ICE Tree/Create/Simulated ICE tree diyoruz. Normal ICE Tree kullanmamamızın sebebi sahnenin animasyon içermesi. Grid'in her karede nasıl bir deformasyona uğrayacağını ancak Simulated ICE Tree kullanarak elde edebiliyoruz.

Şimdi bize bu animsyonu yapmak için neler lazım ona bakalım.


  1. Ayağın gridin neresinde olduğunu kontrol etmemiz gerekiyor.
  2. Eğer ayak gridin içinde ise grid'in vertexlerinin ayağın vertexlerine göre kendilerini ayarlamaları gerekiyor.
  3. Ayağa uzak olan vertexlerin kendi pozisyonlarını korumaları gerekiyor.
Ice Tree'nin arama kısmına "test inside geometry" yazıyoruz ve çıkan nodu ICE Tree'ye alıyoruz. Bu node'un geometry kısmına hangi objenin onun içinde olduğunu belirmemiz gerekiyor. Bu yüzden Explorer'dan "Character" objesini alıp. Value outputunu şekildeki gibi bağlıyoruz. 

Şimdi elimizde bir mantıksal çıktı var. "Evet ayak gridin içinde" ve " hayır ayak gridin içinde değil". Bu veri herbir vertex'e ait veri aslında.
Şimdi şöyle bir mantık kurmamız gerekiyor; 
  • Eğer ayak objesindeki vertex ile grid objesindeki vertex bir noktada kesişiyorsa, ayak objesindeki vertexi takip et. 
  • Eğer ayak objesindeki vertex ile grid objesindeki vertex bir noktada kesişmiyorsa, orjinal pozisyonunu koru.
Bu mantığı da "if" nodu ile yapıyoruz.

"Test Inside Geometry" nodu burada koşulu oluşturuyor. Evet ya da Hayır. Buna göre; eğer bu durum doğru ise, "Get Closeset Location on Geometry" nodunun "position" outputundan "ayak" objesinden gelen yeni vertex pozisyonu set ediliyor. 
Eğer bu durum yanlış ise, "Get Point Position" nodu ile vertexin orjinal posizyonu okunuyor. Aslında "If False" input portu boş kalabilirdi. Ama görsel olarak koşul daha rahat okunabildiği için boş bırakmadım.

" Set Point Position " nodu ile de, bu iki değer gride yazdırılıyor.


Son olarak, grid objesindeki deformasyon biraz kırıklar içeriyor. Bu yüzden smooth deformerı kullanarak bu kırıkları biraz düzeltiyoruz. Smooth deformerını seçtiğimizde kendini modelling stack'inin altına atıyor. Halbuki simulasyonu etkilemsi için "Post-Simulation" stack'inin altında olması gerekli. Bu yüzden kendisini sürükleyip resimdeki gibi "Post-Simulation"ın altına atıyoruz.

Tekrar görüşmek üzere.
Emin.

11 Nisan 2012 Çarşamba

Softimage ICE - Ders Notları - 2 - Basic Deformer


Tekrar Merhaba.

Geçen derste temel olarak bir ICE Tree'nin nasıl oluşturulduğunu görmüştük. Bu derste ise bu oluşturduğumuz ICE Tree'yi biraz daha geliştirerek bir deformer yapmayı deneyeceğiz. Yapacağımız deformer bir null objesi ile yüzey üzerinde "Bulge" efekti uygulayacak.


Öncelikle yapmak istediğimiz deformerı çözümleyelim.


  1. ICE'ın grid objesinin bütün point( vertex )'lerinin nerede olduğunu bilmesi gerekli.
  2. Obje deformasyona uğradığında pointlerin nerede olduğunu tanımlamamız gerekli.
  3. Bulge deformerının grid objesine nekadar yakın olduğunu ölçmemiz gerekli ki, bu yakınlığa göre grid objesi deforme olabilsin.
Şimdi ICE'a geçelim.

Sol menüden Get/Primitive/Null ve Get/Primitive/Polygon Mesh/Grid adımlarını takip edip, 1 grid bir de null objesi oluşturdur.Gdip objesini oluştururken çıkan menüden Subdivisions U ve V 'yi 50 olarak ayarlıyoruz. Ardından Grid objesi seçiliyken ICE Tree/Create/Ice Tree' seçip Grid objesine ICE Tree özelliği vermiş oluyoruz.

Şimdi bize grid in üzerindeki pointlerin konumu lazım. Bir önceki derstende hatırlanacağı gibi bu işi yapmak için önce "Get Data" nodunu ICE Tree'ye çağırı daha sonra "Explorer"dan grid objesini sürükleyip ICE Tree'ye bırakmamız ve Grid nodunun out name'ini Get Data nın In Name'ine bağlamamız. Daha sonra Get Data noduna çift tıklayıp ilgili alana "pointPosition" yazmamız gerekiyordu. İşte bu uzun yol. Bunun yerine "Get Point Position"  nodunu kullanabiliyoruz.


Bu resimde aynı veriye iki farklı şekilde nasıl ulaşılabileceğimizi gösterdim. Biz alttakini kullanacağız. Ayrıca
"Get Point Position" ve "Set Point Position" nodu arasına "Add" nodu ekliyorum. Böylece yaptığımız deformasyonu araya sıkıştırabileyim.
Şimdi ikinci aşamaya geçiyoruz. Burada ise her bir point'in deforme olduktan sonraki yerlerini tanımlamamız gerekiyor.
3. Aşamada ise Null objesinin herbir point'e olan uzaklığını bulmamız gerekiyor. Aşağıdaki ekran görüntüsüne bakalım.


2. Aşamayı inceleyelim. Get Point Position ile herbir pointin yerini 3D Vector (XYZ) olarak alıyoruz. ve Add noduna bağlıyoruz. Add noduna bağlı olan diğer node ise bir 3D Vector. Yalnız Y değeri 1 olarak görünüyor. Bu demek oluyorki, herbir point Y aksisinde 1 birim yukarı doğru kalkmış.

3. Aşamayı inceleyelim. "Get Data" nodunu ICE Tree'ye alıyoruz. Üzerine çift tıklayıp Explore/Null/Kinematic/Global/Pos u seçiyoruz. Böylece Null objesinin XYZ koordinat sistemindeki yerini ICE Tree'ye aldık. "Get Distance Between" nodu iki nesnenin arasındaki uzaklığı ölçen bir nod. Yalnız dikkat edilmesi gereken şey, çıktı olarak Scalar(1,316 gibi) bir veri vermesi. Bir "Get Point Position" nodu alıp şekildeki gibi ilgili yerlere bağlıyoruz. Artık Null objesinin gride olan uzaklığı "Get Distance Between" nodunun Result Output portunda hazır.

Şimdi bu verileri birşekilde birbirine bağlamam gerekiyor ki ICE Tree çalışsın. Ama nasıl. Bakalım.


Multiply by Scalar Nodu : Bu nod Gelen veriyi "factor" portu ile çarpıyor. Yani, grid objesindeki her bir point'in XYZ bilgisi * "Grid"deki herbir point ile Null objesinin arasındaki uzaklık. Tam olarak istediğimiz sonuç bu değil. Bu veriyi filtrelemiz gerekiyor. Yani en uçtaki pointi bir şekilde bu işlemden uzak tutmamız lazım.


Burada fCurve nodu gelen veriyi kontrol ediyor. Herbir point'in XYZ pozisyonunu Null objesine yakınlık derecesine göre 0 ila 1 arasında sayı ile çarpıyor. Dikkat ederseniz. Tam null objesinin üzerine gelen "point" null objesi ile kesişmiş( yani fcurve değeri 0) . Nullden uzaklaştıkça deformasyon azalıyor ( yani fcurve 1 oluyor.). Bu noktada tam olarak istediğimizi elde etmiş değiliz. Bu fcurve değerlerini ters çevirmemiz gerekli ki null objesi bulge işlemini doğru olarak yapabilsin.


Null objesini hareket ettirdiğimiz zaman. Garip bir problem ortaya çıkıyor. Bulge işlemi sanki Global Origin (X=0,Y=0,Z=0) a balı gibi.


Bunun nedeni ise, 2. Aşamada Kullandığımız "Get Point Position" nodu. Çünkü bu noddan Y ve Z bilgisi'de geliyor. Filtre kullanmak gerekiyor.


Get Point Position dan gelen XYZ koordinat bilgisi, "3D Vector to Scalar" nodu ile sadece "Y" aksisi vasıtası ile "Scalar to 3D vector" noduna bağlanıyor. Böylece sadece her bir "point"in Y pozisyonu işleme tabii tutuluyor.

Son olarak fCurve nodu ile oynanarak farklı deformasyon şekilleri oluşturulabilinir.


Emin.

9 Nisan 2012 Pazartesi

Softimage ICE - Ders Notları - 01



Merhaba,
Çok bilinen/kullanılan bir program olmamasına, autodesk'in de bu durumu değiştirmek için en ufak çabası olmamasına rağmen Softimage oldukça güçlü, modern araçlar içermektedir. Bunlardan en yenisi is 7 sürümüyle birlikte lansmanı yapılan ICE eklentisidir. Yine maalesef çok fazla kaynak yok bu konuda, digital tutors ve i3dTutorial gibi eğitim sitelerinin derleri de yetersiz kalıyor maalesef. Oturup deneye yanıla bir şeyler yapmaya bakıyor iş. Tekbaşına da zor oluyor haliyle. Bu yüzden bu başlık altında kendi çalışma notlarımı paylaşmaya karar verdim. Belki konu ile ilgili birileri de katılımcı olur ya da en azından ICE 'a ilgi duyan birilerine de yardımcı olurum/oluruz.

Başlayalım o halde.

Softimage ICE, node tabanlı bir vfx arayüzüdür. Birçok açıdan Houdini'ye benzediğini söylenebilir ( ..pek emin değilim ama !? ). ICE ile parçacık animasyonları ( su, ateş vb. ), rigged body, soft body, cloth ve son 3 versiyonu ile birlikte Topology ( procedural modelling ) ve bunlara bağlı animasyonlar da yapılabilmektedir. Hatta yine birkaç sürüm öncesinde eklenmiş olan rigging kısmı da, klasik bone sisteminin yerine geçebilecek araçlar sunmaktadır.
Peki bütün bunlar nasıl yapılır ?
ICE Tree ( node bağlantılarının tümü ) temelde 3 kısıma ayrılır.

1 - Getters : Veriyi ICE Tree'ye almak için kullandığımız node'lar
2 - Modifiers : Alınan veriyi değiştirmek için kullanılan nodelar.
3 - Setters : Değiştirilen veriyi objeye göndermek için kullanılan node'lar.

Yani yapılan iş, veriyi alıp, işleyip geri göndermekten başka bir şey değil. Böyle söyleyince kolay görünüyor ama asıl önemli olan şey bu verilerin cinsi ve veriyi bir cinsten başka bir cinse çevirmek. Burada işler biraz karışıyor. Şöyle bir arayüze bakalım.


Explorer'dan "sphere" objesini sürükleyip, ICE Tree'ye bırakınca sol üstteki "Get sphere" nodunu elde ediyoruz.  Şimdi, objeyi ICE Tree'ye aldık, ama hangi özelliğini kullanacağımızı daha belirtmedik. Bunun için soldan ikinci olan "Get Data" noduna bakalım. Her nodun sol tarafındaki slotlar veri girdisi ( Input ) için, sağ tarafındakiler ise veri çıktısı ( Output ) için kullanılır. "get Data" nodunun Input kısmında "Source" ve "In Name" slotu bulunmakta. Ayrıca get nodu kırmızı durumda. Yani bize eksik birşeyler olduğunu söylüyor.

"Get Data" noduna çift tıkladığımızda özelliklerine giriyoruz ve buradan hangi "veriyi almak" istediğimizi seçiyoruz. 2 tane opsiyonumuz var, ya ilgili boşluğa o veriyi yazmak ya da "Explore" a tıklayıp çıkan menüden istediğimiz veriyi seçmek.


Şimdi Get Data nodu değişti ve Get .pointPosition halini aldı. Ayrıca daha önce siyah olan "Value" Portu sarı rengine dönüştü. Tam da bu noktada Bu renklerin ne anlama geldiği konusuna değinmek istiyorum. Tabiki hepsi değil, ama en azından data çeşitleri ve bunların renk kodlarına değinmek gerekiyor.

Scalar Data ( Açık yeşil ) : Tek veri taşıyan veri türü. Örneğin XYZ uzayında sadece X aksisi. Bu veri türü virgüllü sayıları da kapsar. ( 1,316 gibi )
3D Vector Data : Bu veri türünde ise 3 tane veri taşınmaktadır. Örneğin, XYZ uzayında bir objeniz var diyelim. Ve bu obje  X ekseninde : 2.5 , Y ekseninde : 3,6 Z ekseninde de : -4,5 noktalarında olsun. 3D Vector ile objenizin konumu şu şekilde görünecektir: 2.5,3.6,-4.5.
Boolen Data  ( Açık turuncu ) : 1 ya da 0 verisini taşır. Genel de mantıksal durumlarda kullanılır ( TRUE, FALSE ).
Siyah : Input'dan gelen data hangi tür ise outputtan da aynı tür olarak çıkar.

Şimdi örneğimize geri dönelim. Get .pointPosition nodunun Value çıktısı sarı renkte. Yani sphere objesinin herbir vertex(point)i XYZ aksisinde belirlenmiş olarak kullanılır durumda. "Value" değerini "Add" nodunun "Value1) Inputuna bağlıyoruz ve siyah olan portlar anında sarıya dönüyor. Artık Add nodundaki "Value2" değerine girdiğimiz her değer de "vector data" olmak zorunda.
Value 2 portuna birşey bağlı olmadığı için, Add noduna çift tıkladığımızda XYZ koordinatlarını ayarlamamız için sliderlar çıkıyor. Bunlarla oynayarak objemizi oluşturan bütün vertexlerin yerlerini aynı anda değiştirebiliriz. Yanlız burada dikkat edilmesi gereken şey, objeyi oje olarak değil bütün vertexleri aynı anda transfor ettiğimiz için yerninden oynatabiliyoruz. Tabii şu anda bu ICE Tree'miz çalışmıyor, çünkü daha birbirine bağlanacak nodelar var.

Üstteki node dizilişinde Add nodunu Set Data noduna bağlamış olmamıza rağmen, Set Data nodu hala kırmızı. Bunun nedeni hangi veriyi "Set" edeceğini bilememesi.
Bir alttaki node dizilişine baktığımız zaman burada ise "get pointPosition" nodunun out nameinin "Set Data" nodunun "in name" noduna bağlı olduğunu görüyoruz. Ve böylece Seta data nodumuz maviye dönüyor. Ve Set Data nodumuz vertex pozisyonlarını set edeceğini biliyor. Ardından "Set Data" nodunun "Execute" output'unu ICE Tree nodunun "Port1" ine bağlıyoruz.
Böylece ilk ICE Tree'mizi oluşturmuş olduk. Add noduna çift tıklayıp XYZ değerleri ile oynayarak objemizin yerini ICE ile değiştirebiliriz artık.
Biliyorum çok fazla iş yaparak minik bir sonuç elde ettik ancak, böyleceICE'ın çalışma mantığını kavrayabileceğimiz önemli bir adım atmış olduk.
İleride görüşmek dileğiyle.

Emin