2017-04-09 119 views
0

我有一個操縱角色。我可以檢索骨骼節點,如果我手動將旋轉應用到這些骨骼,我會看到角色切換到新的姿勢。SceneKit約束如何與骨骼一起使用?

現在,如果我嘗試爲同一個骨骼設置一個約束,它根本就不會移動。我嘗試了逆運動學約束和簡單的廣告牌約束,但沒辦法。

下面是代碼,以獲得骨:

SCNNode *man = [scene.rootNode childNodeWithName:@"Man" recursively:YES] ; 
SCNNode *bodyOfMan = [man childNodeWithName:@"Body" recursively:YES] ; 
SCNNode *bodyRealSkeleton = bodyOfMan.skinner.skeleton ; 
SCNNode *headBone = [bodyRealSkeleton childNodeWithName:@"mixamorig_Head" recursively:YES] ; 

如果我這樣做:

headBone.rotation = SCNVector4Make(0,1,0,45) ; 

我得到這樣的結果,顯示出頭部旋轉正確

enter image description here

如果我這樣做:

SCNBillboardConstraint *constraint3 = [SCNBillboardConstraint billboardConstraint] ; 
headBone.constraints = @[constraint3] ; 

當它應該跟在相機上時,頭部會保持直線前進。

如果我只是將它添加到「盒子」節點,但是我找不到任何方式使它對我的裝配好的網格骨骼起作用,廣告牌約束就能很好地工作...... 而且我找不到任何完全可以使SCNIKConstraint工作。

回答

1

我發現問題的根本原因是什麼。

我已經添加了網格到XCode中的場景,它創建了一個SCNReferenceNode。出於某種原因,您不能像其他節點一樣移動/旋轉/動畫「參考節點」。

我甚至無法將其「加載」布爾值設爲true,儘管網格顯然出現在我的視圖中。

所以我做的是從.scn文件中刪除引用,並在我的場景中以編程方式加載網格,如下所示(「ManPivot」只是我在.scn文件中引入的中心節點,我的網格):

SCNScene *manScene = [SCNScene sceneNamed:@"art.scnassets/Man.dae"] ; 
manScene.rootNode.name = @"Man" ; 
SCNNode  *manPivot = [scene.rootNode childNodeWithName:@"ManPivot" recursively:YES] ; 
[manPivot addChildNode:[manScene.rootNode clone]] ; 

而且我現在可以以任何我想要的方式移動/旋轉/動畫我的網格。我甚至有反向運動學的工作。

結論:參考節點和節點是不一樣的...