旋轉(zhuǎn)模型是經(jīng)常遇到了,我們之前用CABasicAnimation 可以旋轉(zhuǎn)一個view幕庐,其實它也可以旋轉(zhuǎn)一個SCNNode熔吗。
首先我們要明白一個概念姆钉,每個SCNNode 都有自身的三維坐標系吆倦,用CABasicAnimation就是讓SCNNode繞自身的三維坐標軸旋轉(zhuǎn)听诸,所以要特別注意是坐標軸,不是這個SCNNode的幾何中心蚕泽。一般SceneKit 的自帶的幾個幾何體的坐標系原點(0,0,0)就是這個它的幾何中心晌梨,比如說SCNBox;SCNSphere等等须妻,所以看上去跟繞幾何中心旋轉(zhuǎn)一模一樣仔蝌。
我們先從Demo 入手,這里是模擬 太陽-地球-月球 天體運動的demo璧南,分以下幾點:
1掌逛, 地球,月球自轉(zhuǎn)
2司倚, 月球繞著地球轉(zhuǎn)
3, 地月系統(tǒng)繞著太陽轉(zhuǎn)
如下圖:
第一點 先實現(xiàn)地球篓像,月球自轉(zhuǎn)
// Rotate the moon? ??
animation = [CABasicAnimation animationWithKeyPath:@"rotation"];
animation.duration=1.5;
animation.toValue= [NSValue valueWithSCNVector4:SCNVector4Make(0,1,0, M_PI *2)];
animation.repeatCount= FLT_MAX;
[_moonNode addAnimation:animation forKey:@"moon rotation"];
其實SceneKit 框架有自己的動畫API 动知,我們這里地球的旋轉(zhuǎn)用它,讓大家了解一下
[_earthNode runAction:[SCNAction repeatActionForever:[SCNAction rotateByX:0 y:2 z:0 duration:1]]];//地球自轉(zhuǎn)
從上面的代碼可以看出來都是繞Y軸旋轉(zhuǎn)员辩。
第二點 月球繞著地球轉(zhuǎn)(父子SCNNode技巧)
月球需要繞著地球的Y軸旋轉(zhuǎn)盒粮,我們知道,只有地球才繞自己的Y軸旋轉(zhuǎn)奠滑。所以我們可以讓地球帶著月球繞自己的Y軸旋轉(zhuǎn)丹皱。很簡單,將月球add 到地球上:
[_earthNode addChildNode:_moonNode];
這是就會實現(xiàn)月球繞著地球轉(zhuǎn)的效果宋税。
但現(xiàn)實中摊崭,地球的自轉(zhuǎn)周期跟月球的公轉(zhuǎn)周期是不一樣的。所以月球不能添加到地球這個SCNNode 上杰赛,我們要重新新建一個SCNNode呢簸,位置跟地球一樣,把_moonNode添加到這個新建的SCNNode上,然后旋轉(zhuǎn)它根时。
_moonNode.position= SCNVector3Make(3,0,0);
// Moon-rotation (center of rotation of the Moon around the Earth)? ?
?SCNNode *moonRotationNode = [SCNNode node];[moonRotationNode addChildNode:_moonNode];
// Rotate the moon around the Earth? ??
CABasicAnimation *moonRotationAnimation = [CABasicAnimation animationWithKeyPath:@"rotation"];
moonRotationAnimation.duration=1.5;
moonRotationAnimation.toValue= [NSValue valueWithSCNVector4:SCNVector4Make(0,1,0, M_PI *2)];
moonRotationAnimation.repeatCount= FLT_MAX;[moonRotationNode addAnimation:animation forKey:@"moon rotation around earth"];
第三點 地月系統(tǒng)繞著太陽轉(zhuǎn)
這個時候地球和月球要繞著太陽轉(zhuǎn)瘦赫,可以把地月系統(tǒng)看成一個整體。我們創(chuàng)建一個地月系統(tǒng)earthGroupNode蛤迎,然后將moonRotationNode 和 earthNode 添加進去:
[_earthGroupNode addChildNode:_earthNode];
[_earthGroupNode addChildNode:moonRotationNode];
太陽不自轉(zhuǎn)确虱,同理,在太陽同樣的位置創(chuàng)建一個SCNNode替裆,讓地月系統(tǒng)earthGroupNode隨著這個節(jié)點旋轉(zhuǎn)
//離太陽的距離
_earthGroupNode.position=SCNVector3Make(10, 0, 0);
// Earth-rotation (center of rotation of the Earth around the Sun)? ??
SCNNode *earthRotationNode = [SCNNode node];
[_sunNode addChildNode:earthRotationNode];
// Earth-group (will contain the Earth,andthe Moon)? ?
?[earthRotationNode addChildNode:_earthGroupNode];
// Rotate the Earth around the Sun? ??
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"rotation"];
animation.duration=10.0;
animation.toValue= [NSValue valueWithSCNVector4:SCNVector4Make(0,1,0, M_PI *2)];
animation.repeatCount= FLT_MAX;
[earthRotationNode addAnimation:animation forKey:@"earth rotation around sun"];
然后大體流程就結(jié)束了蝉娜。然后我們可以給太陽貼圖添加一些動畫,讓他有巖漿的效果扎唾,在加一些光效召川,整體就更真實了。
整體效果如下:
demo 代碼已上傳到github
https://github.com/pzhtpf/SceneKitRoationDemo
拋磚引玉胸遇,關(guān)于旋轉(zhuǎn)持續(xù)完善中……