wc という名前の子ノードを持つシーンがあります。そのノードにdae/modelファイルを追加したい。
次の方法でモデル/デイを追加できました。
- バンドルからの dae アセットを使用して親シーンを作成する
- 親シーンを scnView に追加し、それを self.view に型キャストします。
- dae を追加する必要なノードを取得します。
- 必要なノード dae でサブシーンを作成します。
- 親シーンの必須ノードの子としてサブシーン ルート ノードを追加します。
- 子ノードの位置を、親シーンの必要なノードの位置に設定します。
以下はスニペットです:
コード スニペット (viewDidLoad 内)
//Create Scene
SCNScene *scene = [SCNScene sceneNamed:@"bathScene.scnassets/peace01.dae"];
SCNView *scnView = (SCNView *)self.view;
scnView.scene = scene;
scnView.allowsCameraControl = YES;
scnView.delegate = self;
scnView.autoenablesDefaultLighting = YES;
//Get the required node where dae is to be added
SCNNode * wcNode = [scnView.scene.rootNode childNodeWithName:@"wc" recursively:YES];
SCNVector3 wcNodeScreenPosition = [scnView projectPoint:wcNode.position];
NSLog(@"wcNode position %f, %f, %f",wcNodeScreenPosition.x, wcNodeScreenPosition.y, wcNodeScreenPosition.z);
//Create sub-Scene
SCNScene* wcScene = [SCNScene sceneNamed:@"bathScene.scnassets/closet.dae"];
//Add the sub-scene root node to the required node of parent scene
[scnView.scene.rootNode addChildNode:[wcScene.rootNode childNodeWithName:@"ceramic" recursively: false]];
SCNNode * wcDAENode = [wcScene.rootNode childNodeWithName:@"ceramic" recursively: false];
wcDAENode.position = [wcNode position];
SCNVector3 wcDAENodeScreenPosition = [scnView projectPoint:wcDAENode.position];
NSLog(@"DAE position %f, %f, %f",wcDAENodeScreenPosition.x, wcDAENodeScreenPosition.y, wcDAENodeScreenPosition.z);
ログ出力
wcNode 位置 275.306549、157.163620、0.956176
DAE 位置 284.000000、160.000000、0.959596
前述のログ出力でわかるように、必要なノードとその子 Dae ノードの位置は同じではなく、シーン内でシフトされたモデルをレンダリングします。
なぜ位置が違うのですか?
シフトを補正するにはどうすればよいですか?