2016-07-15 4 views
1

SCNNode(Colladaファイルのインポートから取得)のピボットをセントロイド(またはバウンディングボックスの中心)に設定する方法をお探しです。 しかしながらノードの位置を変えずに、SCNNodeのピボットをバウンディングボリュームセンターに設定しました

SCNVector3 center; 
CGFloat radius; 
[node getBoundingSphereCenter:&center radius:&radius]; 

と中心、私が中心に(中心の3次元ベクトルとは対照的に、4Dベクトルである)ノードのピボットを設定しようとすると、ノードの位置も変化する。

node.pivot = SCNMatrix4MakeTranslation(center.x,center.y,center.z); 

どうすればこの動きを相殺できますか?私は空間内の位置に影響を与えずにノードのピボットを変更するだけですか? Interface Builderでこれを行うための方法(空のノードを追加しない)がありますか?

+0

以下の回答はあなたのために機能しましたか、別の解決策を見つけましたか? – bpedit

+0

こんにちは私は以下の答えを試しました - しかし、私はまだ間違った場所にいくつかのノードを持っていた。私がしなければならなかった解決策は、外部3Dエディタ(Blender)で各モデル部品のピボットを変更し、DAEファイルを再度エクスポートすることでした。 – user1612877

答えて

2

ピボットは回転中心であるだけでなく、ノードの基準点です。ピボットをリセットすると、親オブジェクトに対するピボットの位置は固定されたままになります。実際には、ジオメトリをオブジェクトの現在の位置に相対的に移動しています。

ピボットをリセットするために使用された負の値を使用してノードの位置を変更するのが簡単です。なんらかの理由でこれを許可しない特定の値が必要な場合は、ノードをコンテナノードに配置し、コンテナノードをpositionに、再ピボットノードをローテーションに使用します。

+0

このソリューションは私のために働く(波面objモデルを使用して) –

0

同じ質問もここで聞いたIs it normal for an SCNNode pivot to change the nodes position? ...しかし、数時間オンラインで検索した後、私はこの問題のコード化された解決策を見つけることができませんでした。 ノードを動かすことなく、ノードのピボットをどのようにセンタリングするのですか?

最後に、私は今日このコード化された答えに取り組んでいます。 私が見つけたのは、ローカル軸の方向が、補正係数を減算するか加算するかを決定することでした。

下記の自転車をご利用ください。右側のペダルクランクピボットz軸(青色)は上向き、他方の写真では左手ペダルクランクピボットz軸(青色)は下向きです。その理由は、SketchUpで自転車モデルを描いたときに、最初のペダルクランクをコピーして反対側に反転させたときです。残念なことに、アドホックピボットの向きと位置でインポートされたDAEモデルを取得するのは非常に一般的です!

func centerPivotWithOutMoving(for node: SCNNode) -> SCNNode { 

    let initialPos = activeNode.presentation.position 

    var min = SCNVector3Zero 
    var max = SCNVector3Zero 
    node.__getBoundingBoxMin(&min, max: &max) 

    node.pivot = SCNMatrix4MakeTranslation(
     min.x + (max.x - min.x)/2, 
     min.y + (max.y - min.y)/2, 
     min.z + (max.z - min.z)/2 
    ) 
    let correctX = Float(min.x + (max.x - min.x)/2) 
    let correctY = Float(min.y + (max.y - min.y)/2) 
    let correctZ = Float(min.z + (max.z - min.z)/2) 

    if node.convertVector(SCNVector3(0,0,1), from: parentNode).z < 0 { 
     // if blue local z-axis is pointing downwards 
     node.position = SCNVector3(initialPos.x - correctX, initialPos.y - correctY, initialPos.z - correctZ) 
    } else { 
     // if blue local z-axis is pointing upwards 
     node.position = SCNVector3(initialPos.x + correctX, initialPos.y + correctY, initialPos.z + correctZ) 
    } 

    return node 
} 

enter image description here

enter image description hereは私は上に示した二つの異なるz軸方向に上記のコードをテストした、完全なコードも使用X、Y軸に対処しなければなりませんこれらの2つの条件。

node.convertVector(SCNVector3(0,1,0), from: parentNode).z < 0 

    node.convertVector(SCNVector3(1,0,0), from: parentNode).z < 0 

これを行うより良い方法がある場合は...共有してください。

関連する問題