2016-11-21 61 views
1

我試圖用代碼更改當前的sceneNamed,但似乎我的方法存在一些問題。首先,新的場景會改變,但我必須觸摸或評價對象,以改變過程發生。第二,看起來childNodeWithName根本不會改變!這裏是我的代碼:以編程方式更改SCNScene的sceneNamed

- (void)load3DObjectName:(NSString*)name nodeName:(NSString*)nodeName zPhone:(CGFloat)positioniPhone zPad:(CGFloat)positioniPad{ 

     SCNScene * scene = [SCNScene sceneNamed:name]; 
     // retrieve the ship node 
     SCNNode *trex = [scene.rootNode childNodeWithName:nodeName recursively:YES]; 


     if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) { 

      trex.position = SCNVector3Make(0, 0, positioniPhone); 

     } else { 

      trex.position = SCNVector3Make(0, 0, positioniPad); 
     } 



     _the3DScence.scene = scene; 
     _the3DScence.autoenablesDefaultLighting = YES; 
     _the3DScence.allowsCameraControl = YES; 
     _the3DScence.backgroundColor = [UIColor colorWithRed:0.92 green:0.92 blue:0.92 alpha:1.00]; 
    } 



// Load default object : 

- (void)viewDidLoad { 

    [self load3DObjectName:@"cube.dae" nodeName:@"cube1" zPhone:-40 zPad:-30]; 

} 

//Trying to change the 3D object with button: 
- (IBAction)nextObject:(id)sender { 

    [self load3DObjectName:@"redCube.dae" nodeName:@"cube2" zPhone:-40 zPad:-30]; 

} 

- (IBAction)changeIt:(id)sender { 

    [self load3DObjectName:@"dayere.dae" nodeName:@"Sphere" zPhone:-40 zPad:-40]; 
} 

這裏是一個源代碼: https://www.dropbox.com/s/rrvbxmrb9wcrnoj/3D%20Objects%20Change.zip?dl=0

在Dropbox的版本的代碼是不是我張貼以上。這裏是Dropbox版本:

 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    [self load3DObjectName:@"cube.dae" nodeName:@"Cube" zPhone:-40 zPad:-40]; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (void)load3DObjectName:(NSString*)name nodeName:(NSString*)nodeName zPhone:(CGFloat)positioniPhone zPad:(CGFloat)positioniPad{ 
    SCNScene * scene = [SCNScene sceneNamed:name]; 
    // retrieve the ship node 
    SCNNode *node = [scene.rootNode childNodeWithName:nodeName recursively:YES]; 

    if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) { 
     node.position = SCNVector3Make(0, 0, positioniPhone); 
    } 
    else { 
     node.position = SCNVector3Make(0, 0, positioniPad); 
    } 
    _the3DView.scene = scene; 
    _the3DView.autoenablesDefaultLighting = YES; 
    _the3DView.allowsCameraControl = YES; 
    _the3DView.backgroundColor = [UIColor colorWithRed:0.92 green:0.92 blue:0.92 alpha:1.00]; 
} 

- (IBAction)changeIt:(id)sender { 
    [self load3DObjectName:@"dayere.dae" nodeName:@"Sphere" zPhone:-40 zPad:-40]; 
} 

+0

您已發佈3個方法定義,但沒有任何調用它們。你在打什麼?你看到了什麼? –

+0

@HalMueller我認爲這是完全清楚!第一種方法是嘗試使用其節點設置3D場景,在'viewDidLoad'中,我加載了默認對象,例如是一個立方體。在'nextObject'動作中,我試圖用代碼來改變3D對象。 –

+0

然後發佈該代碼。張貼足夠我可以自己嘗試。也許包含屏幕截圖。你看到了什麼?你期望看到什麼? –

回答

1

所以我拿看看你的項目。問題在於:你在場景中沒有攝像頭。所以我在相同的距離手動爲每個場景放置相機,並根據需要移動節點。這裏是什麼樣子現在:

- (void)load3DObjectName:(NSString*)name nodeName:(NSString*)nodeName zPhone:(CGFloat)positioniPhone zPad:(CGFloat)positioniPad 
{ 
SCNScene * scene = [SCNScene sceneNamed:name]; 
SCNNode *node = [scene.rootNode childNodeWithName:nodeName recursively:YES]; 

if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) 
{ 
    node.position = SCNVector3Make(0, 0, positioniPhone); 

} else { 

    node.position = SCNVector3Make(0, 0, positioniPad); 
} 

SCNCamera *cam = [[SCNCamera alloc] init]; 
cam.xFov = 35; 
cam.yFov = 35; 
cam.zFar = 5000; 
cam.zNear = 0; 
SCNNode *camNode = [[SCNNode alloc] init]; 
camNode.camera = cam; 

camNode.position = SCNVector3Make(0, 0, 400); 

[scene.rootNode addChildNode:camNode]; 

_the3DView.pointOfView = camNode; 

_the3DView.scene = scene; 
_the3DView.autoenablesDefaultLighting = YES; 
_the3DView.allowsCameraControl = YES; 
_the3DView.backgroundColor = [UIColor colorWithRed:0.92 green:0.92 blue:0.92 alpha:1.00]; 
} 

,我也改變爲測試目的而你的對象的位置:

- (IBAction)changeIt:(id)sender 
{ 
[self load3DObjectName:@"dayere.dae" nodeName:@"Sphere" zPhone:-340 zPad:-340]; 
} 

而這其中還有:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self load3DObjectName:@"cube.dae" nodeName:@"Cube" zPhone:-40 zPad:-40]; 
} 

最後,但並非最不重要,屏幕截圖: cubesphere

+0

謝謝!這很好用!但發生了另一個問題。我將代碼移到主項目中,當我運行應用程序時,我看到對象的紋理完全損壞! –

+0

請接受答案並將新問題作爲新問題發佈。 –

0

它在我看來像你的第二輪代碼工作正常。我注意到您在Dropbox示例中加載的不同場景/節點比您首先發布的代碼中的不同。所以這讓我覺得你的DAE文件中有一些不是你期望的東西。檢查缺少或拼寫錯誤的節點名稱。在調用childNodeWithName:sceneNamed:之後,請添加NSAssert調用,以確保您確實已成功加載場景並找到子節點。

SCNScene * scene = [SCNScene sceneNamed:name]; 
NSAssert(scene, @"failed to load scene named %@", name); 
// retrieve the ship node 
SCNNode *node = [scene.rootNode childNodeWithName:nodeName recursively:YES]; 
NSAssert(node, @"couldn't fine child node named %@", nodeName); 

如果NSAsserts失敗,請使用您的3D編輯工具來修復您的Collada文件。

還要注意,當你替換the3DView.scene(拋開:請不要直接調用實例變量,而是使用訪問器方法!),你也會替換相機和燈光。所以你應該期待相機定位的一個混蛋。也許你想要這個動畫?或者刪除/替換對象的節點,而不會搞亂相機和照明?

當我運行您發佈到Dropbox的代碼時,我看到一個充滿紅色的屏幕。當我放大了,而旋轉的攝像頭,它看起來像這樣:

enter image description here

我點擊的「按鈕」按鈕後,我看到:

enter image description here