2017-12-26 23 views
0

一般に、ゲームのキャラクターをカメラの顔にするときは、SCNLookAtConstraintを使うことができます。SceneKitゲームのSCNNodeにSCNConstraint(LookAt)をアニメーション化して、徐々に遷移させる

以下、my_objectは、私が制約ごとに方向づけようとしているノードです。 'Enemy'はシーン内のいくつかのノードを指し、pointOfViewはシーンの視点です。私がmy_objectをタップすると、瞬時に敵を見て、次に私のpointOfViewに戻ります。

LookAtConstraintを 'オブジェクト'が1秒間 '敵'に見えるように設定します。私の質問は「敵」ノード

@objc 
func resetObject() { 
    my_object.constraints?.removeAll() 
    let targetNode = sceneView.pointOfView 
    let lookAt = SCNLookAtConstraint(target: targetNode) 
    lookAt.isGimbalLockEnabled = true 
    my_object.constraints = [lookAt] 
    } 

を見た後、私の視点で見て、オブジェクトをリセットする

my_object.constraints?.removeAll() 
let targetNode = sceneView.scene.rootNode.childNode(withName: (chosenScenarioForChallenge?.shape)!, recursively: true) 
let lookAt = SCNLookAtConstraint(target: targetNode) 
lookAt.isGimbalLockEnabled = true 
my_object.constraints = [lookAt]      
Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(resetObject), userInfo: nil, repeats: false) 

、私は変更したくありません制約が突然になる。私はそれが滑らかになりたいので、私はこれにアニメーションを取り入れたいと思います。 SCNActionとSCNAnimationの両方を調べた後、私は制約に関連するものを見つけることができませんでした。制約が動的に位置を更新するので、私はSCNAction.move(to/by:)などが動作しないことを理解することができます。最終的に、私がタップすると、私のオブジェクトは徐々に敵のノードを見て開始する必要があります1-2秒後、それは私のpointOfViewを見るために戻ってくる必要があります、あまりにも徐々に。

私はキャラクターが技術的にカメラを見ることを望まないので、私はSCNBillboardConstraintではなくSCNLookAtConstraintを使用しています。

ポインタが役立つ、TIA。

答えて

1

targetプロパティは読み書き可能ですので、新しいインスタンスを作成する代わりにSCNLookAtConstraintインスタンスを再利用し、ターゲットをスワップするだけで済みます。

編集

制約のinfluenceFactorは、ノードの現在の変換および制約によって計算1との間のスムーズなアニメーションを可能にします。

+0

ええ、そうです。ヘッドアップをありがとう。しかし、私の疑問は私の移行を円滑にする方法です。私のノードが第2のノードを見ているときに第3のノードを見るように制約を変更すると、2つの変更の間にアニメーションが必要なので、ノードを3番目のノードを参照しているときにします。 – Manganese

+0

あなたが制約のターゲットSceneKitを変更すると、その変更が暗黙的にアニメートされるはずですが、アニメーションの長さを簡単に制御できないことがあります。 – mnuages

+0

あなたは正しいかもしれませんが、正直言ってもまだ早すぎるようです。私は数回試してみましょう。 – Manganese

関連する問題