Ters kinematikle çalışma
Flash Player 10 ve üstü, Adobe AIR 1.5 ve üstü, Flash CS4 veya üstünü gerektirir
Ters kinematik (IK), gerçekçi hareket oluşturulmasına yönelik önemli bir tekniktir.
IK, IK armatürü adı verilen bağlanmış bölümlerin bir zinciri içinde koordinasyonlu hareketler oluşturmanıza olanak sağlar, böylece parçalar gerçekçi şekilde birlikte hareket eder. Armatürün parçalarını kemikler ve eklemler oluşturur. Armatürün bitiş noktası verildiğinde, IK her eklemin bu bitiş noktasına ulaşması için gerekli açıyı hesaplar.
Bu açıların manuel olarak hesaplanması sizin için zor olabilir. Bu özelliğin güzelliği, Adobe® Flash® Professional'ı kullanarak etkileşimli şekilde armatürler oluşturabilmenizdir. Daha sonra ActionScript kullanarak bunlara animasyon uygularsınız. Flash Professional'a dahil edilen TK motoru, armatürün hareketlerini açıklamak için hesaplamalar gerçekleştirir. ActionScript kodunuzda hareketi belirli parametrelerle sınırlayabilirsiniz.
TK'nin Flash Professional CS5 sürümüne yeni olan konsept, genellikle en son teknolojiye sahip animasyon uygulamalarıyla ilişkili olan eklem yayıdır. Yeni dinamik Fizik Motoru ile kullanılan bu özellik canlı hareketleri yapılandırmanıza izin verir. Ayrıca, bu efekt hem çalışma zamanında hem de geliştirme sırasında görünür durumdadır.
Ters kinematik armatürleri oluşturmak için, Flash Professional lisansına sahip olmanız gerekir.
Ters Kinematik Temelleri
Ters kinematik (IK), gerçeğe uygun olarak birbirine göre hareket edecek şekilde parçaları bağlayarak gerçekçi animasyonlar oluşturmanıza olanak sağlar.
Örneğin, IK'yi kullanarak, istediğiniz pozu elde etmek için bacaktaki gerekli eklem hareketlerini gerçekleştirip bir bacağı belirli bir konuma taşıyabilirsiniz. IK, IK armatürü adı verilen bir yapıda zincirlenmiş kemikler çerçevesini kullanır.
fl.ik
paketi, doğal harekete benzer animasyonlar oluşturmanıza yardımcı olur. IK algoritmasının ardındaki fizik kuralları hakkında çok bilgi sahibi olmanız gerekmeden kusursuz şekilde birden çok IK armatürüne animasyon uygulamanızı sağlar.
Flash Professional ile yardımcı eklem ve bağlantılar içeren TK armatürü oluşturun. Böylece çalışma zamanında bunlara animasyon uygulamak için IK sınıflarına erişebilirsiniz.
TK armatürünün nasıl oluşturulduğuyla ilgili ayrıntılı talimatlar için
Flash Professional'ı Kullanma
kısmında Ters kinematikleri kullanma bölümüne bakın.
Önemli kavramlar ve terimler
Aşağıdaki başvuru listesi bu özellikle ilgili önemli terimler içerir:
-
Armatür
-
Gerçekçi hareketi simüle etmek için bilgisayar animasyonunda kullanılan ve eklem ve bağlantılardan oluşan bir kinematik zinciri.
-
Eklem
-
Hayvan iskeletindeki kemiğe benzer şekilde armatürdeki sert bir parça.
-
Ters Kinematik (TK)
-
Kinematik zinciri veya armatür adı verilen eklemli esnek nesne parametrelerini belirleme işlemi.
-
Eklem
-
Eklemlerin hareket etmesini sağlamak için oluşturulmuş, iki kemiğin birbirine temas ettiği konum; bu, bir hayvandaki bağlantıya benzer.
-
Fizik Motoru
-
Animasyona gerçekçi eylemler sağlamak için fizikle ilgili algoritmalardan oluşan bir paket kullanılmıştır.
-
Yay
-
Üst iskelet taşındığında ve sonra zaman içinde artımlı olarak kaybolduğunda bir iskeletin taşıma ve tepki verme kalitesidir.
TK Armatürlerine Animasyon Uygulamaya Genel Bakış
Flash Professional'da bir TK armatürü oluşturduktan sonra, çalışma zamanında bu armatürün hareketini sınırlamak, olaylarını izlemek ve armatüre animasyon uygulamak için
fl.ik
sınıflarını kullanın.
Aşağıdaki şekilde, Wheel adında bir film klibi gösterilmektedir. Aks,
Axle
adında bir IKArmature örneğidir. IKMover sınıfı, tekerlek dönüşüyle eşzamanlı olarak armatürü hareket ettirir. Armatürdeki IKBone,
ikBone2
öğesi, kuyruk ekleminde tekerleğe bağlıdır.
-
A.
-
Wheel
-
B.
-
Axle
-
C.
-
ikBone2
Çalışma zamanında, tekerlek
Animasyonu açıklama
bölümünde anlatılan
__motion_Wheel
hareket arasıyla bağlantılı olarak döner. IKMover nesnesi, aksın hareketini başlatır ve kontrol eder. Aşağıdaki resimde, dönüşteki farklı karelerde dönen tekerleğe eklenen aks armatürünün iki anlık görüntüsü gösterilmektedir.
Çalışma zamanında, şu ActionScript:
-
Armatür ve bileşenleri hakkında bilgi edinir
-
Bir IKMover nesnesini başlatır
-
Aksı, tekerleğin dönüşüyle birlikte hareket ettiriri
import fl.ik.*
var tree:IKArmature = IKManager.getArmatureByName("Axle");
var bone:IKBone = tree.getBoneByName("ikBone2");
var endEffector:IKJoint = bone.tailJoint;
var pos:Point = endEffector.position;
var ik:IKMover = new IKMover(endEffector, pos);
ik.limitByDistance = true;
ik.distanceLimit = 0.1;
ik.limitByIteration = true;
ik.iterationLimit = 10;
Wheel.addEventListener(Event.ENTER_FRAME, frameFunc);
function frameFunc(event:Event)
{
if (Wheel != null)
{
var mat:Matrix = Wheel.transform.matrix;
var pt = new Point(90, 0);
pt = mat.transformPoint(pt);
ik.moveTo(pt);
}
}
Aksı taşımak için kullanılan IK sınıfları şunlardır:
-
IKArmature: eklem ve bağlantı noktalarından oluşan bir ağaç yapısı niteliğindeki armatürü açıklar; Flash Professional ile oluşturulması gerekir
-
IKManager: belgedeki tüm TK armatürlerinin kap sınıfı; Flash Professional ile oluşturulması gerekir
-
IKBone: IK armatürünün bir parçası
-
IKJoint: iki IK kemiği arasındaki bağlantı
-
IKMover: armatürlerin IK hareketini başlatır ve kontrol eder
Bu sınıflarla ilgili eksiksiz ve detaylı açıklamalar için bkz.
ik package
.
TK armatürü hakkında bilgi alma
Öncelikle, taşımak istediğiniz parçaları oluşturan armatür, kemik ve eklem değişkenlerini bildirin.
Aşağıdaki kod, Axle armatürünün değerini
tree
IKArmature değişkenine atamak için IKManager sınıfının
getArmatureByName()
yöntemini kullanır. Axle armatürü önceden Flash Professional ile oluşturulurdu.
var tree:IKArmature = IKManager.getArmatureByName("Axle");
Aynı şekilde, aşağıdaki kod
ikBone2
kemiğinin IKBone değişkenine atamak için IKArmature sınıfının
getBoneByName()
yöntemini kullanır.
var bone:IKBone = tree.getBoneByName("ikBone2");
ikBone2
kemiğinin kuyruk eklemi, armatürün dönen tekerleğe eklenen bölümüdür.
Aşağıdaki satır,
endEffector
değişkenini bildirir ve bu değişkeni
ikBone2
kemiğinin
tailjoint
özelliğine atar:
var endEffector:IKJoint = home.tailjoint;
pos
değişkeni,
endEffector
ekleminin geçerli konumunu saklayan noktadır.
var pos:Point = endEffector.position;
Bu örnekte,
pos
öğesi, aksın sonundaki eklemin tekerleğe bağlandığı konumudur. Bu değişkenin orijinal değeri, IKJoint öğesinin
position
özelliğinden elde edilir.
IK Taşıyıcısını Başlatma ve IK Taşıyıcısının Hareketini Sınırlama
IKMover sınıfının bir örneği aksı hareket ettirir.
Aşağıdaki satır,
ik
IKMover nesnesini başlatarak taşınacak öğeyi ve hareketin başlangıç noktasını yapıcısına iletir:
var ik:IKMover = new IKMover(endEffector, pos);
IKMover sınıfının özellikleri, bir armatürün hareketini sınırlamanıza olanak sağlar. Mesafe, yineleme ve hareket süresini esas alarak hareketi sınırlayabilirsiniz.
Aşağıdaki özellik çiftleri bu sınırlamaları zorlar. Çiftler, hareketin sınırlanmış olup olmadığını ve sınırlamayı belirten bir tam sayıyı gösteren Boolean değerini içerir:
Boolean özelliği
|
Tamsayı özelliği
|
Sınırı ayarla
|
limitByDistance:Boolean
|
distanceLimit:int
|
Her yineleme için IK motorunun hareket edeceği maksimum mesafeyi piksel cinsinden belirtir.
|
limitByIteration:Boolean
|
iterationLimit:int
|
Her hareket için IK motorunun gerçekleştireceği maksimum yineleme sayısını belirtir.
|
limitByTime:Boolean
|
timeLimit:int
|
Hareketi gerçekleştirmesi için IK motoruna ayrılan maksimum süreyi milisaniye cinsinden belirtir.
|
Varsayılan olarak, tüm Boolean değerleri
false
değerine ayarlıdır, bundan dolayı hareket siz bir Boolean değerini
true
olacak şekilde açıkça ayarlamadıkça sınırlanmaz. Bir sınırı zorlamak için, uygun özelliği
true
değerine ayarlayın ve ardından karşılık gelen tam sayı özelliği için bir değer belirleyin. Karşılık gelen Boolean özelliğini ayarlamadan sınırlamayı bir değere ayarlarsanız, sınırlama yok sayılır. Bu durumda, IK motoru IKMover öğesinin başka bir sınırına veya hedef konumuna ulaşılıncaya kadar hareket etmeye devam eder.
Aşağıdaki örnekte, armatür hareketinin maksimum mesafesi her yineleme için 0,1 piksel olarak ayarlanmıştır. Her hareket için maksimum yineleme sayısı on olarak ayarlanmıştır.
ik.limitByDistance = true;
ik.distanceLimit = 0.1;
ik.limitByIteration = true;
ik.iterationLimit = 10;
Bir IK Armatürünü hareket ettirme
IKMover, tekerleğin olay dinleyicisinin içinde aksı hareket ettirir. Tekerleğin her enterFrame olayında, armatür için yeni bir hedef konum hesaplanır. IKMover,
moveTo()
yöntemini kullanarak kuyruk eklemini hedef konumuna veya
limitByDistance
,
limitByIteration
ve
limitByTime
özellikleri tarafından ayarlanan sınırlamalar içinde gidebildiği son noktaya taşır.
Wheel.addEventListener(Event.ENTER_FRAME, frameFunc);
function frameFunc(event:Event)
{
if (Wheel != null)
{
var mat:Matrix = Wheel.transform.matrix;
var pt = new Point(90,0);
pt = mat.transformPoint(pt);
ik.moveTo(pt);
}
}
Yayları Kullanma
Flash Professional CS5’teki ters kinematik, eklem yayını destekler. Eklem yayı, geliştirme sırasında ayarlanabilir ve eklem yayı nitelikleri çalışma zamanında eklenebilir veya değiştirilebilir. Yay, eklemin ve bağlantı yerlerinin bir özelliğidir. İki niteliği vardır: yayın miktarını ayarlayan
IKJoint.springStrength
ve kuvvet değerine direnç ekleyen ve yayın aşınma oranını değiştiren
IKJoint.springDamping
.
Yay kuvveti, varsayılan 0 (çok sıkı) ile 100 (çok gevşek ve fizik tarafından kontrol edilir) arasında yüzde cinsinden bir değerdir. Eklemler, bağlantı yerlerinin hareketine yay tepkimesi gösterir. Etkinleştirilmiş başka bir çeviri (dönüş, x veya y) yoktur; yay ayarlarının hiçbir etkisi olmaz.
Yay sönümlemesi varsayılan 0 (dirençsiz) ile 100 (aşırı derecede sönümlü) arasında yüzde cinsinden bir değerdir. Sönüm, bir eklemin ilk hareketi ve dinlenme konumuna dönüşü arasında geçen zaman miktarını değiştirir.
IKArmature.springsEnabled
özelliğini kontrol ederek bir IKArmature nesnesi için yayların etkin olup olmadığını kontrol edebilirsiniz. Diğer yay özellikleri ve yöntemleri ayrı IKJoint nesnelerine aittir. Bir bağlantı noktası x ve y eksenleri boyunca açısal dönüş ve çeviri açısından etkinleştirilebilir. Bir döndürme bağlantı noktasının yay açısını
IKJoint.setSpringAngle
ve çevirme bağlantı noktasının yay konumunu
IKJoint.setSpringPt
ile konumlandırabilirsiniz.
Bu örnek ada göre bir eklem seçer ve tailJoint öğesini tanımlar. Kod, yayların etkinleştirilip etkinleştirilmediğini anlamak için üst armatürü test eder ve ardından bağlantı yeri için yay özelliklerini belirler.
var arm:IKArmature = IKManager.getArmatureAt(0);
var bone:IKBone = arm.getBoneByName("c");
var joint:IKJoint = bone.tailJoint;
if (arm.springsEnabled) {
joint.springStrength = 50; //medium spring strength
joint.springDamping = 10; //light damping resistance
if (joint.hasSpringAngle) {
joint.setSpringAngle(30); //set angle for rotational spring
}
}
TK Olaylarını Kullanma
IKEvent sınıfı, IK Olayları hakkında bilgi içeren bir olay nesnesi oluşturmanıza olanak sağlar. IKEvent bilgileri, belirtilen süre, mesafe veya yineleme sınırı aşıldığından sonlandırılmış olan hareketi açıklar.
Aşağıdaki kod, zaman sınırı olaylarının izlenmesine yönelik bir olay dinleyicisini ve işleyicisini gösterir. Bu olay işleyicisi, IKMover öğesinin zaman sınırı aşıldığında ortaya çıkan bir olayın süre, mesafe, yineleme sayısı ve eklem özelliklerini bildirir.
var ikmover:IKMover = new IKMover(endjoint, pos);
ikMover.limitByTime = true;
ikMover.timeLimit = 1000;
ikmover.addEventListener(IKEvent.TIME_LIMIT, timeLimitFunction);
function timeLimitFunction(evt:IKEvent):void
{
trace("timeLimit hit");
trace("time is " + evt.time);
trace("distance is " + evt.distance);
trace("iterationCount is " + evt.iterationCount);
trace("IKJoint is " + evt.joint.name);
}
|
|
|
|
|