我正在嘗試以遞回方式克隆所有節點(包括它們的材料)。我想在不影響原始節點(材料)的情況下更改克隆節點中的某些材料屬性。
這是我到目前為止所擁有的,但它似乎不起作用。對新節點所做的任何更改仍會反映在原始節點上。
SCNNode *newRoot = [self.root clone];
[newRoot enumerateHierarchyUsingBlock:^(SCNNode * _Nonnull node, BOOL * _Nonnull stop) {
SCNNode *oldNode = [self.root childNodeWithName:node.name recursively:YES];
node.geometry = [oldNode.geometry copy];
node.geometry.materials = [oldNode.geometry.materials copy];
}];
uj5u.com熱心網友回復:
試試這個代碼:
#import "GameViewController.h"
@implementation GameViewController
- (void)viewDidLoad
{
[super viewDidLoad];
SCNView *sceneView = (SCNView *)self.view;
SCNScene *scene = [SCNScene sceneNamed:@"art.scnassets/ship.scn"];
sceneView.scene = scene;
sceneView.allowsCameraControl = YES;
sceneView.autoenablesDefaultLighting = YES;
SCNMaterial *material = [SCNMaterial material];
material.lightingModelName = SCNLightingModelPhysicallyBased;
material.diffuse.contents = [NSColor redColor];
SCNNode *ship = [scene.rootNode childNodeWithName:@"ship"
recursively:YES].childNodes[0];
SCNNode *shipCopy = [ship clone];
shipCopy.position = SCNVector3Make(10, 0, 0);
SCNGeometry *geometryCopy = (SCNGeometry *)[ship.geometry copy];
shipCopy.geometry = geometryCopy;
[shipCopy.geometry replaceMaterialAtIndex:0 withMaterial:material];
[scene.rootNode addChildNode:shipCopy];
}
@end
uj5u.com熱心網友回復:
從在線檔案:
克隆或復制節點會創建節點物件的副本,但不會創建附加到它的幾何圖形、燈光、相機和其他 SceneKit 物件 - 相反,每個復制的節點共享對這些物件的參考。
這種行為意味著您可以使用克隆,例如,將相同的幾何體放置在場景中的多個位置,而無需維護幾何體及其材質的多個副本。但是,這也意味著對附加到一個節點的物件的更改將影響共享相同附件的其他節點。例如,要使用不同材質渲染節點的兩個副本,您必須在指定新材質之前復制節點及其幾何體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/462960.html