2017-05-25 21 views
0

私はSceneKitプロジェクトに取り組んでいます。オブジェクトを3軸(世界軸)で回転させたいのですが、オブジェクトを回転すると次の回転は新しい回転軸を基準として行われます。世界軸に沿った回転

ワールドに対して3つのボタンを使用して絶対x、y、z軸で回転できるキューブを想像してください。

  • SCNAction.rotateTo(X:1.0、Y:0.0、Z:0.0、持続時間:0.5、 usesShortestUnitArc:TRUE)
  • 私の知る限りSCNActionための以下のオプションがある知っているよう

  • SCNAction.rotateTo(X:1.0、Y:0.0、Z:0.0、持続時間:0.5)
  • SCNAction.rotateBy(X:1.0、Y:0.0、Z:0.0、持続時間:0.5)
  • SCNAction。回転(0.0:周り:SCNVector3、継続時間:0.5)
  • SCNAction.rotate(toAxisAngle:SCNVector4、持続時間:0.5)

残念ながら、これらのいずれも、それらのすべてが以前回転に依存して、絶対的ではありません。

ワールド軸回転を実際に絶対に実装する方法はありますか?

事前にお世話になりました!

答えて

3

ワールド軸を中心にノードを回転するには、ノードworldTransformに回転行列を掛けます。

SCNActionさんの解決策が見つかりませんでしたが、SCNTransactionは非常に簡単です。

func rotate(_ node: SCNNode, around axis: SCNVector3, by angle: CGFloat, duration: TimeInterval, completionBlock: (()->())?) { 
    let rotation = SCNMatrix4MakeRotation(angle, axis.x, axis.y, axis.z) 
    let newTransform = node.worldTransform * rotation 

    // Animate the transaction 
    SCNTransaction.begin() 
    // Set the duration and the completion block 
    SCNTransaction.animationDuration = duration 
    SCNTransaction.completionBlock = completionBlock 

    // Set the new transform 
    node.transform = newTransform 

    SCNTransaction.commit() 
} 

ノードに異なる変換を持つ親がある場合、これは機能しませんが、結果の変換を親座標空間に変換することでこれを修正できます。

this Swift Playgroundでこれを試すことができます。

私はこれがあなたが探していることを望みます。

+0

ありがとうOrangenkopf、素晴らしいアイデア! – Velykovits

+0

私の一日を保存しました、ありがとうございます! –

+0

これは、親の位置が(0,0,0)でない場合にも適用されますか?私がこのアプローチを試してみると、ノードは自身の(変換された)軸に沿って回転するのではなく親軸の周りを周回しています。 –

関連する問題