Ở phần tiếp theo này chúng ta sẽ cùng tìm hiểu:

  • Cách dùng tool để tạo ra đối tượng 3D

  • Sử dụng node với 3D object

  • Cách thêm ánh sáng

  • Cách thêm nhiều node 3D object

 

Cách tạo các đối tượng 3D?

  • Blender

  • Sketchup

  • Autodesk 3dsMax

  • Online: SketchFab, TurboSpuid, Blocks

 

Tạo project và setup camera như bài trước

Tạo một đổi tượng node 3d

Các bạn thêm đoạn mã sau:

func addPaperPlane(x: Float = 0, y: Float = 0, z: Float = -0.5) {
    guard let paperPlaneScene = SCNScene(named: "paperPlane.scn"), let paperPlaneNode = paperPlaneScene.rootNode.childNode(withName: "paperPlane", recursively: true) else { return }
    paperPlaneNode.position = SCNVector3(x, y, z)
    sceneView.scene.rootNode.addChildNode(paperPlaneNode)
}

 

Với đoạn mã trên đầu tiên tôi khởi tạo mộ đối tượng SCNScene với tên là paperPlan.scn.

Với các tham số thì như mình đã giải thích ở phần trươc nếu các bạn chưa đọc thì có thể quay lại tham khảo.

Các bạn build thì sẽ thấy có 1 cái hình màu tráng như sau:

Như các bạn thấy thì cái hình máy bay này khá là khó nhìn, vì nó đang thiếu phần đổ bóng và ánh sáng, bạn có thể mở đối tượng 3D này ra thì sẽ thấy nó chỉ là màu trắng.

Thêm ánh sáng cho đối tượng

Có nhiều cách để thêm ánh sáng vào một đối tượng 3D nhưng trong  bài này chúng ta sẽ sử dụng cách sau:

func configureLighting() {
    sceneView.autoenablesDefaultLighting = true
    sceneView.automaticallyUpdatesLighting = true
}

Ở hàm configureLighting():

  • Tôi đã set thuộc tính autoenablesDefaultLighting là true, nó có nghĩa là SceneKit sẽ tự động thêm ánh sáng vào scene, ARKit đã sử dụng các kỹ thuật ngầm để phân tích môi trường cho phép thêm ánh sáng sao cho phù hợp với các vật thể xung quanh.

  • Tiếp theo ở thuộc tính automaticallyUpdatesLighting tôi cũng set là true, thuộc tính này cho phép tự động cập nhật độ tương phải tính toán theo camera, bạn có thể set là false để thấy toàn bộ các lights.

 

Tiếp theo chúng ta cần gọi hàm configureLighting() ở viewDidLoad()

override func viewDidLoad() {
    super.viewDidLoad()
    configureLighting()
    addPaperPlane()
}

 

Bây giờ các bạn có thể build để thấy kết qủa.

 

Làm việc với các đối tượng 3D Node

Ở dưới đây tôi sẽ sử dụng đối tượng Car nó chưa nhiều 3D notes.

Cũng giống như hàm addPaper thì tôi sẽ tạo hàm addCar như sau:

func addCar(x: Float = 0, y: Float = 0, z: Float = -0.5) {
    guard let carScene = SCNScene(named: "car.dae") else { return }
    let carNode = SCNNode()
    let carSceneChildNodes = carScene.rootNode.childNodes
        
    for childNode in carSceneChildNodes {
        carNode.addChildNode(childNode)
    }
        
    carNode.position = SCNVector3(x, y, z)
    carNode.scale = SCNVector3(0.5, 0.5, 0.5)
    sceneView.scene.rootNode.addChildNode(carNode)
}

Cũng giống như phần addPlane ở đây chỉ thêm mỗi phần chúng ta lấy toàn bộ nodes ra rồi dùng method addChildNode. Bây giờ chúng ta sẽ gọi hàm addCar() xem điều gì xảy ra.

Vậy là bài này đã kết thúc, chúng ta sẽ tìm hiểu thêm về ARKit trong các phần sau.