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