1. 程式人生 > >ARKit從入門到精通(10)-ARKit讓飛機繞著你飛起來

ARKit從入門到精通(10)-ARKit讓飛機繞著你飛起來

img self. lin code 視圖 it教程 href earth plan

  • 1.1-ARKit物體圍繞相機旋轉流程介紹

  • 1.2-完整代碼

  • 1.3-代碼下載地址

  • 廢話不多說,先看效果

    技術分享

    • 其實是會一直圍著你轉圈的,只不過筆者不好意思暴露家裏的場景,所以請讀者朋友們見諒~

    • 由於是晚上,筆者選擇的是一個臺燈

技術分享

1101.gif

1.1-ARKit物體圍繞相機旋轉流程介紹

  • 1.點擊屏幕添加物體,已經在第三小節ARKit從入門到精通(3)-ARKit自定義實現中介紹

  • 2.實現物體的圍繞相機旋轉(這裏主要會用到SceneKit框架中內容)

    • 1.為什麽要在相機的位置創建一個空節點呢?因為你不可能讓相機也旋轉

    • 2.為什麽不直接讓臺燈旋轉呢? 這樣的話只能實現臺燈的自轉,而不能實現公轉

    • 註意:繞相機旋轉的關鍵點在於:在相機的位置創建一個空節點,然後將臺燈添加到這個空節點,最後讓這個空節點自身旋轉,就可以實現臺燈圍繞相機旋轉

  • 核心代碼介紹

#pragma mark- 點擊屏幕添加飛機 
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
  [self.planeNode removeFromParentNode];
//1.使用場景加載scn文件(scn格式文件是一個基於3D建模的文件,使用3DMax軟件可以創建,這裏系統有一個默認的3D飛機)
--------在右側我添加了許多3D模型,只需要替換文件名即可
  SCNScene *scene = [SCNScene sceneNamed:@"Models.scnassets/lamp/lamp.scn"];
//2.獲取臺燈節點(一個場景會有多個節點,此處我們只寫,飛機節點則默認是場景子節點的第一個)
//所有的場景有且只有一個根節點,其他所有節點都是根節點的子節點
  SCNNode *shipNode = scene.rootNode.childNodes[0]; self.planeNode = shipNode;
//臺燈比較大,適當縮放一下並且調整位置讓其在屏幕中間
  shipNode.scale = SCNVector3Make(0.5, 0.5, 0.5); shipNode.position = SCNVector3Make(0, -15,-15); ;
//一個臺燈的3D建模不是一氣呵成的,可能會有很多個子節點拼接,所以裏面的子節點也要一起改,否則上面的修改會無效
  for (SCNNode *node in shipNode.childNodes) {
     node.scale = SCNVector3Make(0.5, 0.5, 0.5);
     node.position = SCNVector3Make(0, -15,-15);
  }
  self.planeNode.position = SCNVector3Make(0, 0, -20);
//3.繞相機旋轉 //繞相機旋轉的關鍵點在於:在相機的位置創建一個空節點,然後將臺燈添加到這個空節點,最後讓這個空節點自身旋轉,就可以實現臺燈圍繞相機旋轉
//1.為什麽要在相機的位置創建一個空節點呢?因為你不可能讓相機也旋轉
//2.為什麽不直接讓臺燈旋轉呢? 這樣的話只能實現臺燈的自轉,而不能實現公轉
   SCNNode *node1 = [[SCNNode alloc] init];
//空節點位置與相機節點位置一致
  node1.position = self.arSCNView.scene.rootNode.position;
//將空節點添加到相機的根節點 [self.arSCNView.scene.rootNode addChildNode:node1];
// !!!將臺燈節點作為空節點的子節點,如果不這樣,那麽你將看到的是臺燈自己在轉,而不是圍著你轉
  [node1 addChildNode:self.planeNode];
//旋轉核心動畫
CABasicAnimation *moonRotationAnimation = [CABasicAnimation animationWithKeyPath:@"rotation"];
//旋轉周期 moonRotationAnimation.duration = 30;
//圍繞Y軸旋轉360度 (不明白ARKit坐標系的可以看筆者之前的文章)
moonRotationAnimation.toValue = [NSValue valueWithSCNVector4:SCNVector4Make(0, 1, 0, M_PI * 2)];
//無限旋轉 重復次數為無窮大 moonRotationAnimation.repeatCount = FLT_MAX;
//開始旋轉 !!!:切記這裏是讓空節點旋轉,而不是臺燈節點。 理由同上
[node1 addAnimation:moonRotationAnimation forKey:@"moon rotation around earth"];
//3D遊戲框架
#import <SceneKit/SceneKit.h>
//ARKit框架 #import <ARKit/ARKit.h>
@interface ARSCNViewViewController ()<ARSCNViewDelegate,ARSessionDelegate>
//AR視圖:展示3D界面 @property(nonatomic,strong)ARSCNView *arSCNView;
//AR會話,負責管理相機追蹤配置及3D相機坐標 @property(nonatomic,strong)ARSession *arSession;
//會話追蹤配置:負責追蹤相機的運動 @property(nonatomic,strong)ARSessionConfiguration *arSessionConfiguration;
//飛機3D模型(本小節加載多個模型) @property(nonatomic,strong)SCNNode *planeNode;
@end
@implementation ARSCNViewViewController
- (void)viewDidLoad {
  [super viewDidLoad]; // Do any additional setup after loading the view.
}
- (void)back:(UIButton *)btn{
  [self dismissViewControllerAnimated:YES completion:nil];
}
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
//1.將AR視圖添加到當前視圖 [self.view addSubview:self.arSCNView];
//2.開啟AR會話(此時相機開始工作) [self.arSession runWithConfiguration:self.a

文章來源:中國AR網

ARKit從入門到精通(10)-ARKit讓飛機繞著你飛起來