同じ質問もここで聞いた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
}
は私は上に示した二つの異なるz軸方向に上記のコードをテストした、完全なコードも使用X、Y軸に対処しなければなりませんこれらの2つの条件。
node.convertVector(SCNVector3(0,1,0), from: parentNode).z < 0
node.convertVector(SCNVector3(1,0,0), from: parentNode).z < 0
これを行うより良い方法がある場合は...共有してください。
出典
2018-03-07 12:03:00
Ash
以下の回答はあなたのために機能しましたか、別の解決策を見つけましたか? – bpedit
こんにちは私は以下の答えを試しました - しかし、私はまだ間違った場所にいくつかのノードを持っていた。私がしなければならなかった解決策は、外部3Dエディタ(Blender)で各モデル部品のピボットを変更し、DAEファイルを再度エクスポートすることでした。 – user1612877