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.

IK armatürünü iki farklı konumda taşıma
Ç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); 
}