2016-08-24 12 views
0

目的は、SCNNodeをスケールし、その親の中に垂直に中心を置くことです。SceneKit:親の内部でスケールされたSCNNodeを垂直方向に中心にしますか?

ただし、SCNNodeのスケーリングはその境界ボックスには影響しません。スケールされた高さの計算は機能しません。正確な高さがなければ、どのようにノードをその親の中に垂直に配置することができますか?

縮尺の高さの使用に関する問題を説明するには、添付ファイルTiki.daeを参照してください。アセットの元の高さ(バウンディングボックスで示されている)は324.36です。ただし、Yスケールを0.01に設定すると、高さは〜3.24になりません。 3より小さくなります。これは、高さ3(半径1.5)の球の中に快適にフィットすることで証明できます。

以下のコードでは、スケーリングされたノードを親の内側に配置しようとしていますが、動作しません。

注:参照ノードは、WWDC 2015 foxのデモのfox/panda参照ノードです。

  // Create reference node 
      let referenceNode = SCNReferenceNode(URL: referenceURL) 
      referenceNode?.load() 

      // Scale reference node 
      let scale = Float(3) 
      referenceNode?.scale = SCNVector3(x: scale, y: scale, z: scale) 

      // Create geometry for sphere 
      let sphereGeometry = SCNSphere(radius: (gridSphere.geometry as! SCNSphere).radius) 
      //sphereGeometry.materials = gridSphere.geometry!.materials 
      sphereGeometry.firstMaterial!.diffuse.contents = gPurpleColor 

      // Create sphere to hold reference node, position at same place as <gridSphere> 
      let liveSphere = SCNNode(geometry: sphereGeometry) 
      liveSphere.position = gridSphere.position 

      // Center reference node inside <liveSphere> 
      var min = SCNVector3Zero 
      var max = SCNVector3Zero 
      referenceNode?.getBoundingBoxMin(&min, max: &max) 
      let referenceNodeHeight = max.y - min.y 
      referenceNode?.position = SCNVector3(x: 0, y: 0 - referenceNodeHeight, z: 0) 

      // Add reference node to <liveSphere> 
      liveSphere.addChildNode(referenceNode!) 

      // This value never changes no matter the scale value??? 
      print(referenceNodeHeight) 
+0

この例は動作していません。 'referenceNode'は子を持たず、シーンに追加されません。それは子供もジオメトリもないので、高さ0は妥当と思われます。 'liveSphere'は決してシーンに追加されません。 'gridSphere'は明らかに他の場所で定義されていますか? https://developer.apple.com/library/ios/documentation/SceneKit/Reference/SCNReferenceNode_Class/にある「SCNReferenceNode」は、シーンファイルから読み込まれた他のコンテンツのプレースホルダとして使用されることに注意してください。 –

+0

@HalMuellerは、コードを単純化するためにあまりにも多くのコードを削除しました。正しいコードを再追加する。 – Crashalot

+0

@HalMueller参照ノードはWWDC 2015 foxデモからのキツネ/パンダです(ここでは簡単のため省略しています)。それらのファイルもアップロードする必要がありますか? – Crashalot

答えて

0

ここでは、球の子としてキューブ(参照ノードの代わりに)を追加するプレイグラウンドがあります。キューブはスケーリングに応答します(「//スケール参照ノード」の後の行を参照)。

//: Playground - noun: a place where people can play 

import Cocoa 
import SceneKit 
import XCPlayground 

public class GizmoNode: SCNNode { 

    required public override init() { 
     super.init() 
     let axisLength = CGFloat(3.0) 
     let offset = CGFloat(axisLength/2.0) 
     let axisSide = CGFloat(0.2) 
     let chamferRadius = CGFloat(axisSide) 

     let xBox = SCNBox(width: axisLength, height: axisSide, length: axisSide, chamferRadius: chamferRadius) 
     xBox.firstMaterial?.diffuse.contents = NSColor.redColor() 
     let yBox = SCNBox(width: axisSide, height: axisLength, length: axisSide, chamferRadius: chamferRadius) 
     yBox.firstMaterial?.diffuse.contents = NSColor.greenColor() 
     let zBox = SCNBox(width: axisSide, height: axisSide, length: axisLength, chamferRadius: chamferRadius) 
     zBox.firstMaterial?.diffuse.contents = NSColor.blueColor() 
     let xNode = SCNNode(geometry: xBox) 
     let yNode = SCNNode(geometry: yBox) 
     let zNode = SCNNode(geometry: zBox) 
     self.addChildNode(xNode) 
     self.addChildNode(yNode) 
     self.addChildNode(zNode) 
     print (xNode.position) 
     print (yNode.position) 
     print (zNode.position) 
     xNode.position.x = offset 
     yNode.position.y = offset 
     zNode.position.z = offset 
     print (xNode.pivot) 
     print (yNode.pivot) 
     print (zNode.pivot) 
    } 

    required public init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

let sceneView = SCNView(frame: CGRect(x: 0, y: 0, width: 300, height: 300)) 
let scene = SCNScene() 

sceneView.scene = scene 
sceneView.backgroundColor = NSColor.blackColor() 
sceneView.allowsCameraControl = true 

let gizmo = GizmoNode() 
scene.rootNode.addChildNode(gizmo) 

XCPlaygroundPage.currentPage.liveView = sceneView 

// Create reference node 
let cubeSize = CGFloat(0.5) 
let cubeGeometry = SCNBox(width: cubeSize, height: cubeSize, length: cubeSize, chamferRadius: 0.0) 
let referenceNodeStandIn = SCNNode(geometry: cubeGeometry) 
//referenceNodeStandIn?.load() 
let cubeColor = NSColor.whiteColor().colorWithAlphaComponent(0.5) 
cubeGeometry.firstMaterial!.diffuse.contents = cubeColor 

// Scale reference node 
let scale = CGFloat(8) 
referenceNodeStandIn.scale = SCNVector3(x: scale, y: scale, z: scale) 

// Create geometry for sphere 
let sphereRadius = CGFloat(2.0) 
let sphereGeometry = SCNSphere(radius: sphereRadius) 
//sphereGeometry.materials = gridSphere.geometry!.materials 
let gPurpleColor = NSColor.purpleColor().colorWithAlphaComponent(1.0) 
sphereGeometry.firstMaterial!.diffuse.contents = gPurpleColor 

// Create sphere to hold reference node, position at same place as <gridSphere> 
let liveSphere = SCNNode(geometry: sphereGeometry) 
//liveSphere.position = gridSphere.position 
scene.rootNode.addChildNode(liveSphere) 

// Center reference node inside <liveSphere> 
var min = SCNVector3Zero 
var max = SCNVector3Zero 
referenceNodeStandIn.getBoundingBoxMin(&min, max: &max) 
print("min: \(min) max: \(max)") 
let referenceNodeHeight = max.y - min.y 
//referenceNodeStandIn.position = SCNVector3(x: 0, y: 0 - referenceNodeHeight, z: 0) 

// Add reference node to <liveSphere> 
liveSphere.addChildNode(referenceNodeStandIn) 

// This value never changes no matter the scale value because it's in local coordinate space 
print("reference node height", referenceNodeHeight) 
+0

ありがとうHal!あなたは優しすぎる。しかし、親の内部でスケールされたノードをセンタリングするための教訓の違いは何ですか?あなたはその位置をコメントするように思われるので、どのようにノードを中心にしますか? – Crashalot

関連する問題