2016-04-08 14 views
2

私は、希望の回転と角度に変換したSCNノードを持っています。シーンキットの変換と回転

新しいx軸で無限に回転させたいのですが、360度回転させることができないようですが、わずかにずれるだけです。

let spin = CABasicAnimation(keyPath: "rotation") 
spin.fromValue = NSValue(SCNVector4: SCNVector4(x: item.rotation.x, y: item.rotation.y, z: item.rotation.z, w: item.rotation.w)) 
spin.toValue = NSValue(SCNVector4: SCNVector4(x: Float(2*M_PI), y: item.rotation.y, z: item.rotation.z, w: item.rotation.w)) 
spin.duration = 3 
spin.repeatCount = .infinity 
item.addAnimation(spin, forKey: "spin around") 

注:以前の質問のローテーションコードが見つかりました。期待どおりに動作しますが、変換されたノードでローテーションしたい場合は動作しません。

EDIT:トランスコード:あなたのコメントと、おそらくあなたの問題への答えで

self.item.transform = SCNMatrix4Mult(SCNMatrix4Mult(SCNMatrix4MakeScale(1.1, 1.1, 1.1), SCNMatrix4MakeRotation(2.2, 228.0, 120.0, 55.2)), SCNMatrix4MakeTranslation(-2.5, 12, 6)) 
self.item.pivot = SCNMatrix4MakeTranslation(0, 0, 4) 
self.item.transform = SCNMatrix4Mult(SCNMatrix4MakeTranslation(0, 0, 4), item.transform) 
+1

たぶんコンテナノード(ジオメトリもransformationなし)の内側にあなたの変換ノードを入れて、containterノードを回転させます。 – bpedit

+0

それはある意味があります。アイテムはDAEファイルからロードされているので、rootNodeをどのように取るかわかりません。子ノードはコンテナノードにあり、シーンの代わりに使用します – Codermonk

答えて

2

。あなたは.DAEファイルがインストールされていたら、次の例のようにノードにアクセスすることができます

// "rhodopsin" is the namne of a .dae file 
    guard let rho = SCNScene(named: "rhodopsin") else { 
     print("Couldn't find molecule in dictionary (rhodopsin)") 
     return } 

    let chain = rho.rootNode.childNodeWithName("chain", recursively: true)! 
    let hetero = rho.rootNode.childNodeWithName("hetero", recursively: true)! 

あなたは、これらのノードの名前を見つけるエディタウィンドウに.DAEファイルを開いて、上をクリックする必要がある場合小さいサイドバーのアイコンが左下に表示されます。サイドバーには、シーングラフ(下の図)があります。階層を目の当たりにするだけでなく、名前を変更したり、必要に応じてノードを移動したり、変更したりすることができます。 ファイルが見つからない場合は、他の保護手段を追加する必要があります。私はクライアント側ではなく、アーカイブを構築するためにこれを使用しています。これらは今ちょうどあなたがSceneKit内に作成したノードのように振る舞う

baseNode.addChildNode(chain) 
    baseNode.addChildNode(hetero) 
    // (baseNode is a child of the current scene's root node) 

:例を続行するに

。私の例では、chainに簡単なアニメーションを防ぐための調整された向きがあると、たとえば世界のy軸についてbaseNodeを回転させることができます。または、それがheteroとは別の回転を必要とする場合、私は代わりにそれを新しい、そうでなければ空のノードに置き、それを回転させます。

let panNode = SCNNode() 
    panNode.addChildNode(chain) 
    baseNode.addChildNode(panNode) 
    // perform rotations on panNode or baseNode 

Where to get node info from a dae file.

関連する問題