JavaFX逆运动学库2.0
這是第一篇講解javafx-ik的基礎(chǔ)教程, javafx-ik是JavaFX的逆運動學(xué)庫。 該庫的源代碼可以從GitHub下載。
什么是
圖1:單骨
骨骼是使用javafx-ik庫進行逆運動學(xué)的基本基礎(chǔ)。 骨骼具有一定長度和關(guān)節(jié),骨骼可以圍繞該關(guān)節(jié)旋轉(zhuǎn)。 具有關(guān)節(jié)的一端稱為骨頭,另一端稱為尾端。 圖1顯示了一根骨頭,其頭,尾和長度。
在庫javafx-ik中 ,骨骼類似于類Bone 。 要對其進行初始化,必須至少傳遞長度,但通常在構(gòu)造過程中還要設(shè)置角度。 上面的代碼示例設(shè)置了一條長度為50且旋轉(zhuǎn)為0的骨骼,這意味著它將水平指向右側(cè)。
// Adding bone b2 to the children of bone b1 b1.getChildren().add(b2);查看Gist上的代碼。
組裝骨頭
圖2:組裝兩個骨骼
可以組裝骨骼來定義動畫對象的骨架。 通過將一根骨頭b1的尾巴連接到另一根骨頭b2的頭部來鏈接兩根骨頭。 骨骼b1稱為骨骼b2的父級,骨骼b2稱為骨骼b1的子級。 圖2顯示了兩個相連的骨骼b1和b2 。
Bone類為結(jié)構(gòu)提供兩個屬性。 只讀屬性parent店骨骼的父,物業(yè)孩子是所有兒童骨骼的ObservableList。 以下代碼片段顯示了如何連接兩個骨骼b1和b2 :
// Adding bone b2 to the children of bone b1 b1.getChildren().add(b2);查看Gist上的代碼。
圖3:假人的結(jié)構(gòu)
只讀屬性角度定義了骨骼及其父骨骼的延伸之間的旋轉(zhuǎn)。 值0表示一條直線,值180表示子骨骼與其父骨骼重疊,但指向相反的方向。 盡管讓父母和孩子在骨骼的骨骼上施加順序,但通常沒有區(qū)別,哪個骨骼是父母,哪個骨骼是孩子。 通過重復(fù)鏈接骨骼對象的頭和尾,可以創(chuàng)建鏈。 這種簡單的結(jié)構(gòu)用于毛毛蟲樣品中。 復(fù)雜對象是使用骨骼樹定義的。 骨骼的確切位置取決于父對象的位置和旋轉(zhuǎn)。 樹的頂部沒有父級的骨骼稱為根骨骼。 在初始化過程中,對根骨骼的處理略有不同。 根骨骼的屬性角度定義了其在整個場景中的旋轉(zhuǎn)。 您可以認為它的父骨骼水平指向右側(cè)。 現(xiàn)在,我們可以定義虛擬對象的結(jié)構(gòu),如圖3所示。可以在下面的代碼示例中看到生成虛擬對象骨架的代碼。
查看Gist上的代碼。
附加視覺組件
骨骼本身不可見。 它們只是定義結(jié)構(gòu)。 屬性內(nèi)容是Node對象的ObservableList ,可用于將可見元素附加到骨骼。
// Attaching visual elements to a bone final Bone bone = new Bone(50, 30); bone.getContent().addAll( new Circle(20), new Ellipse(45, 0, 25, 15), new Circle(80, 0, 10) );查看Gist上的代碼。
圖4:添加視覺元素
附著的Node對象的位置和旋轉(zhuǎn)由基礎(chǔ)骨骼確定。 所有附加節(jié)點的局部坐標系的原點是骨骼的頭部位置。 如果頭部位置已移動,則其所有節(jié)點也將移動。 骨骼的旋轉(zhuǎn)也傳遞到節(jié)點。 如果骨骼完全不旋轉(zhuǎn)并且角度值為0,則它??是水平指向右。 在上面的代碼示例中,骨骼定義了兩個圓和一個橢圓。 該骨骼如圖4所示。下面的代碼示例顯示了所需的更改,這些更改通過附加圓和橢圓來定義虛擬對象的外觀。 生成的虛擬對象可以在圖5中看到。在圖片中,我添加了骨骼的符號以使其可見。 請注意,視覺組件均不會旋轉(zhuǎn),并且所有位置都位于骨骼本地。 場景中的最終位置和旋轉(zhuǎn)僅根據(jù)骨骼的位置和旋轉(zhuǎn)來計算。
// Definition of head final Bone head = new Bone(30, 90); head.getContent().add(new Ellipse(20, 15));// Definition of torso final Bone torso = new Bone(80, 0); torso.getContent().add(new Ellipse(40, 0, 50, 20)); head.getChildren().add(torso);final Bone[] upperArm = new Bone[2]; final Bone[] upperLeg = new Bone[2];for (int i=0; i<2; i++) {// Definition upper armsupperArm[i] = new Bone(60, 60 - 90 * i);upperArm[i].getContent().add(new Ellipse(22.5, 0, 30, 12.5));// Definition of lower armsfinal Bone lowerArm = new Bone(60, -90);lowerArm.getContent().addAll(new Circle(12.5), new Ellipse(30, 0, 20, 12.5), new Circle(60, 0, 12.5));upperArm[i].getChildren().add(lowerArm);// Definition of upper legsupperLeg[i] = new Bone(60, 30 - 90*i);upperLeg[i].getContent().add(new Ellipse(20, 0, 30, 15));// Definition of lower legsfinal Bone lowerLeg = new Bone(75, 90);lowerLeg.getContent().addAll(new Circle(15), new Ellipse(40, 0, 30, 15), new Ellipse(75, -10, 10, 22.5));upperLeg[i].getChildren().add(lowerLeg); }// Connect arms and legs to head and torso head.getChildren().addAll(upperArm); torso.getChildren().addAll(upperLeg);查看Gist上的代碼。
圖5:所有視覺元素都附有的假人
將所有內(nèi)容添加到場景圖中
現(xiàn)在只剩下最后一個片段,無法在屏幕上渲染虛擬對象: Skeleton類。 Skeleton類是Scenegraph和帶有附加Node對象的骨骼之間的橋梁。 它擴展了Parent ,因此可以在Scenegraph中的任何位置添加。 可以像場景圖中的任何其他節(jié)點一樣對其進行平移,旋轉(zhuǎn),縮放和轉(zhuǎn)換。
通過設(shè)置任何骨骼的屬性骨架 ,可以鏈接骨架對象和動畫對象的骨骼。 您會注意到,相同結(jié)構(gòu)中所有骨骼的屬性骨架隨后將更新為指向相同的Skeleton對象。 同一結(jié)構(gòu)中的兩個骨骼不可能指向不同的骨骼對象。
要查看結(jié)果,請下載完整的Dummy.java文件。 要編譯腳本,需要將庫javafx-ik添加到類路徑中。 您可以從GitHub下載源代碼。
下一步是什么?
本教程的第一部分介紹了如何定義動畫對象的靜態(tài)結(jié)構(gòu)(或骨架)以及如何附加可見的組件。 第二部分將說明如何對該結(jié)構(gòu)進行動畫處理以創(chuàng)建自然外觀的動畫。
參考:來自Mike博客博客的JCG合作伙伴 Michael Heinrichs的JavaFX Inverse Kinematics 2.0庫 。
翻譯自: https://www.javacodegeeks.com/2013/04/javafx-library-for-inverse-kinematics-2-0.html
總結(jié)
以上是生活随笔為你收集整理的JavaFX逆运动学库2.0的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022年即将上市的手机(2022年最新
- 下一篇: 用来调色的电脑软件(电脑上的调色软件)