AR là gì? Cách phát triển ứng dụng AR trên Android

Bạn có chơi Pokemon Go không ? Trò chơi đang làm điên đảo quốc tế gần đây. Game này chính là một ứng dụng của công nghệ AR ( thực tiễn tăng cường ). Vậy AR là gì ? Cách tạo ứng dụng AR trên điện thoại thông minh như thế nào ?
Trước khi vấn đáp thắc mắc trên, để mình khởi đầu câu truyện khám phá về AR của mình nhé
Mình là một coder nhưng lại có sở trường thích nghi điều tra và nghiên cứu lịch sử vẻ vang. Tình cờ mình biết đến người Vikings, những chiến binh hiếu chiến thời cổ đại. Liệu người Vikings có thực sự sử dụng pháo trong những đại chiến không ?

Mình không chắc chắn về điều đó, tuy nhiên không có lí do gì mà người Vikings lại không thể có pháo trong thế giới AR (công nghệ thực tế tăng cường)… hehe.

Câu chuyện mà mình đưa ra ở đây là : với sự trợ giúp của công nghệ tiên tiến thực tiễn tăng cường, bạn trọn vẹn hoàn toàn có thể kiến thiết xây dựng những ứng dụng làm những điều ngoạn mục. Giống như game Pokemon Go vậy .
Hôm nay mình sẽ san sẻ với những bạn cách thiết kế xây dựng ứng dụng AR trên Android nhé ! .

AR là gì? Tìm hiểu công nghệ thực tế tăng cường AR

# AR là gì ? Đôi chút về công nghệ tiên tiến thực tiễn tăng cường AR

Tại WWDC 2017, Apple đã công bố ARKit – một bước đột phá vào thế giới phát triển AR. Không chịu thua kém đối thủ, ngay sau đó Google đã công bố ARCore, được trích xuất từ ​​dự án bản đồ Tango.

Vậy AR là gì ?

Bạn hoàn toàn có thể hiểu đơn thuần là : AR là công nghệ tiên tiến được cho phép bạn lồng ghép những thông tin ảo vào quốc tế thực. Nó giúp bạn tương tác với quốc tế số nhưng với quốc tế thực .
Nếu bạn đã từng chơi Pokemon Go thì chắc rằng bạn cũng tưởng tượng ra AR là gì rồi. Có bao giời bạn phải thuê xe ôm chỉ để đi bắt một con Pokemon ảo không ?
Nếu vẫn còn mơ hồ thì mời bạn xem video ra mắt về AR tại đây .

Bạn đã hiểu AR là gì chưa ? Mình tin là đã hiểu rồi đấy 🙂

So sánh AR và VR

Về cơ bản thì cả hai công nghệ tiên tiến này được cho phép bạn tương tác với quốc tế số một cách sinh động hơn .
Nếu VR ( Thực tế ảo ) là công nghệ tiên tiến mang quốc tế ảo vào đời sống của bạn. VR sẽ luôn đem lại cảm xúc rất thật và hoàn toàn có thể đánh lừa não bộ của bạn .
Ví dụ : Bạn không biết bơi, nhưng bạn trọn vẹn hoàn toàn có thể tò mò quốc tế đại dương với công nghệ tiên tiến VR, mặc dầu bạn vẫn nằm trong chăn .
Khi nói đến sự khác nhau giữa hai công nghệ AR và VR thì có rất nhiều góc nhìn để bàn như : định nghĩa, kỹ thuật … Nhưng có lẽ rằng với dân beginner như tất cả chúng ta, thì nhìn vào ứng dụng thực tiễn của chúng để phân biệt là dễ nhất .
VR sẽ là một công nghệ tiên tiến vàng dùng để tăng trưởng game, phim ( theo lối thưởng thức – đặc biệt quan trọng là tò mò, kinh dị ) – gọi chung là những loại sản phẩm vui chơi .
Còn với AR, cách tiếp cận lại đi theo một hướng khác ! Nhờ sự xen kẽ giữa thực / ảo làm một, công nghệ tiên tiến này hoàn toàn có thể giúp tất cả chúng ta tạo nên những thiên nhiên và môi trường 2 trong 1 mà không tốn thời hạn, tài lộc !

# Bước đầu tìm hiểu và khám phá cách kiến thiết xây dựng ứng dụng AR

Công nghệ AR đang trở thành một xu thế công nghệ tiên tiến tương lai mà những ông lớn đều đã vào cuộc .
Bạn là lập trình viên dày dặn kinh nghiệm tay nghề hay chỉ là beginner thì chắc như đinh đều muốn chớp lấy xu thế này. Đúng không ? Bạn rất tò mò và muốn tạo một ứng dụng AR cho riêng mình chứ ?
Chờ chút! Bạn có thể xem một số bản demo ARCore tại trang web Bạn hoàn toàn có thể xem một số ít bản demo ARCore tại trang web AR Experiments .OpenGL, Unity hoặc Unreal. Trong bài hướng dẫn này, mình sẽ xây dựng AR App bằng cách modify lại project mẫu do Google cung cấp (dùng OpenGL), hoàn toàn viết bằng Kotlin.
Ứng dụng ARCore hoàn toàn có thể được tăng trưởng bằng cách dùnghoặc. Trong bài hướng dẫn này, mình sẽ thiết kế xây dựng AR App bằng cách modify lại project mẫu do Google cung ứng ( dùng OpenGL ), trọn vẹn viết bằng Kotlin .Lưu ý :

  • Do ARCore không thể hoạt động trên các Android Emulator. Do đó, bạn sẽ cần có device thật hỗ trợ ARCore như Samsung Galaxy S8 hoặc Google Pixel / Pixel XL với Android Nougat (7.0) trở lên
  • Nếu bạn không có một trong các thiết bị đó, bạn vẫn được trải nghiệm AR với SDK ARCore.

Bạn đã chuẩn bị sẵn sàng để thiết kế xây dựng AR App – tò mò quốc tế mới đầy táo bạo này chưa ?
Góc quảng cáo: Bạn chưa biết hoặc có ít kinh nghiệm lập trình với ngôn ngữ Kotlin. Mình khuyên bạn nên đọc trước series lập trình Kotlin cơ bản tại đây: Bạn chưa biết hoặc có ít kinh nghiệm tay nghề lập trình với ngôn từ Kotlin. Mình khuyên bạn nên đọc trước series lập trình Kotlin cơ bản tại đây : Học lập trình Kotlin cơ bản

Cài đặt môi trường tự nhiên dự án Bất Động Sản AR

Như những bài viết trước, những bạn tải dự án Bất Động Sản mình tạo sẵn bộ khung tại đây nhé
Mở project trong Android Studio 3.0 Beta 5 trở lên. ( Nó cũng hoàn toàn có thể chạy nếu bạn đang dùng Android Studio 2.3.3 với plugin Kotlin )
Trước khi chạy project, bạn cũng cần tải xuống và setup ARCore Service do Google cung ứng .

Dịch vụ ARCore được cài đặt bằng lệnh adb sau:

$ adb install -r -d arcore-preview.apk

Đọc thêm! Các bạn có thể tham khảo toàn bộ các lệnh của adb Các bạn hoàn toàn có thể tìm hiểu thêm hàng loạt những lệnh của adb tại đây

Giờ đây, bạn nhấn Run/Run ‘app’ hoặc nhấn Ctrl-R để khởi động và chạy.

Trước tiên, bạn sẽ được nhắc phân phối quyền so với máy ảnh và sau khi phê duyệt, bạn sẽ thấy một nhóm radio buttons ở trên cùng, nhằm mục đích để chọn loại đối tượng người tiêu dùng cần chèn vào cảnh .
Bạn sẽ thấy một snackbar ở dưới cùng với dòng chữ “ Searching for surfaces … ”. Bạn cũng thấy được một vài điểm được ghi lại, đó là những điểm sẽ được theo dõi. Nhắm vào bề mặt phẳng, plane sẽ được phát hiện :

Hướng dẫn xây dựng AR App thực tế tăng cường trên Android

Khi plane tiên phong được phát hiện, thanh snackbar sẽ biến mất và mặt phẳng được tô sáng trên màn hình hiển thị. Lưu ý rằng plane có màu sáng hoàn toàn có thể gặp sự cố khi detect .

Hướng dẫn xây dựng AR App thực tế tăng cường trên Android

# Cách thiết kế xây dựng AR App trong thực tiễn tăng cường

1. Tìm hiểu sơ lược ARCode SDK dùng trong project mẫu

Project có những model 3D mà mình dùng trong thư mục main / assets của Android Studio. Trong đó có chứa những Model cho viking, cannon, và target .
Các tập tin Mã Sản Phẩm 3D đã được tạo bằng Blender ( Các bạn tìm hiểu thêm hướng dẫn làm thế nào hoàn toàn có thể tạo Mã Sản Phẩm 3D bằng Blender ) .

Bên trong thư mục res/raw, có OpenGL shaders, tất cả mình lấy từ Google ARCore sample app. Ngoài ra, bạn còn thấy một package có tên là rendering, có chứa một số OpenGL renderersutilities từ Google ARCore sample app.

Ngoài ra còn có một lớp với tên là PlaneAttachment viết bằng Kotlin và sử dụng SDK ARCore .

2. Xây dựng AR App không hề thiếu Planes, Anchors, và Poses

Lớp PlaneAttachment được làm bằng cách sử dụng một Plane và một Anchor. Và lớp PlaneAttachment hoàn toàn có thể được sử dụng để tạo một Pose – Cả ba đều từ SDK ARCore .

  • Một plane mô tả một bề mặt phẳng thực.
  • Một Anchor mô tả một vị trí cố định và định hướng trong không gian.
  • Một Pose mô tả sự chuyển đổi tọa độ từ một hệ thống này sang hệ thống khác, từ object’s local frame đến world coordinate frame. Bạn nên đọc thêm tài liệu chính thức ở đây documentation.

Vì vậy, bạn hoàn toàn có thể hiểu đại khái là : PlaneAttachment được cho phép bạn gắn một anchor vào một plane và lấy ra pose tương ứng .

  • Đừng bỏ lỡ: Cách tạo Chat Head như Facebook Messenger

3. ARCore Session là gì ?

Trong project có sử dụng đối tượng Session ARCore trong MainActivity. Session này mô tả toàn bộ trạng thái AR và bạn sẽ sử dụng nó để đính kèm các anchor vào plane khi người dùng chạm vào màn hình.

Trong setupSession (), được gọi từ onCreate (...), ứng dụng sẽ kiểm tra xem thiết bị có hỗ trợ ARCore không. Nếu không, một Toast sẽ hiển thị và thoát activity.

Giả sử bạn có thiết bị được tương hỗ, đã đến lúc thiết lập 1 số ít object để hiển thị trên màn hình hiển thị !

4. Thêm Objects

Mở MainActivity và thêm các thuộc tính sau:

private val vikingObject = ObjectRenderer()
private val cannonObject = ObjectRenderer()
private val targetObject = ObjectRenderer()

Mỗi thuộc tính được định nghĩa là một ObjectRenderer. Tiếp theo thêm ba thuộc tính PlaneAttachment như dưới đây

private var vikingAttachment: PlaneAttachment? = null
private var cannonAttachment: PlaneAttachment? = null
private var targetAttachment: PlaneAttachment? = null

Cách viết trên nghĩa là những thuộc tính sẽ có giá trị mặc định là null và sẽ được tạo sau khi user chạm vào màn hình hiển thị .

Bạn cần thiết lập một số đối tượng mà bạn sẽ làm trong onSurfaceCreated(...). Tìm khối try-catch có sẵn trong hàm và thêm phần xử lý  try-catch như sau:

// Prepare the other rendering objects.
try {
  vikingObject.createOnGlThread(this, "viking.obj", "viking.png")
  vikingObject.setMaterialProperties(0.0f, 3.5f, 1.0f, 6.0f)
  cannonObject.createOnGlThread(this, "cannon.obj", "cannon.png")
  cannonObject.setMaterialProperties(0.0f, 3.5f, 1.0f, 6.0f)
  targetObject.createOnGlThread(this, "target.obj", "target.png")
  targetObject.setMaterialProperties(0.0f, 3.5f, 1.0f, 6.0f)
} catch (e: IOException) {
  Log.e(TAG, "Failed to read obj file")
}

Bạn đang sử dụng những tệp Model 3D được cung ứng trong ứng dụng để thiết lập từng đối tượng người tiêu dùng trong số ba đối tượng người dùng, cũng như thiết lập một số ít thuộc tính material trên mỗi đối tượng người tiêu dùng .

5. Thêm những Anchors vào Session

Tìm hàm handleTaps(...) trong MainActivity. Thêm câu lệnh if ngay phía trên comment trước câu lệnh break như sau:

when (mode) {
  Mode.VIKING -> vikingAttachment = addSessionAnchorFromAttachment(vikingAttachment, hit)
  Mode.CANNON -> cannonAttachment = addSessionAnchorFromAttachment(cannonAttachment, hit)
  Mode.TARGET -> targetAttachment = addSessionAnchorFromAttachment(targetAttachment, hit)
}

Giá trị của biến mode được quản lý bởi radio buttons phía trên màn hình. Mode là một enum class. Tỉ lệ factor được dùng để điều chỉnh kích thước của model 3D tương ứng.

Trong câu lệnh when với từng chế độ, bạn sẽ thiết lập một giá trị mới cho PlaneAttachment tương ứng sử dụng tệp đính kèm cũ và giá trị nhận được khi tap vào màn hình. Giá trị này là một ARCore PlaneHitResult xác định giao điểm của 3D ray khi touch và một plane.

Bây giờ bạn cần thêm hàm addSessionAnchorFromAttachment(...) như sau:

private fun addSessionAnchorFromAttachment(
  previousAttachment: PlaneAttachment?, hit: PlaneHitResult): PlaneAttachment {
  previousAttachment?.let {
    session.removeAnchors(Arrays.asList(previousAttachment.anchor))
  }
  return PlaneAttachment(hit.plane, session.addAnchor(hit.hitPose))
}

Nếu previousAttachment là khác null, đầu tiên bạn cần loại bỏ anchor của nó khỏi session. Sau đó thêm vào một anchor mới cho session và tiếp tục nhận giá trị mới từ PlaneAttachment, base trên PlaneHitResult plane và một anchor từ PlaneHitResult pose.

Đền đây, bạn gần xong kiến thiết xây dựng AR App cũng như đã sẵn sàng chuẩn bị để xem ứng dụng của bạn hoạt động giải trí như thế nào rồi !

Tìm hiểu công nghệ AR (thực tế tăng cường)

  • Nhiều người quan tâm: Tích hợp google drive SDK series 

6. Drawing những Objects

Bước ở đầu cuối bạn cần làm là vẽ những objects lên màn hình hiển thị. Bạn đã tạo tệp đính kèm plane khi người dùng touch vào. Tiếp theo bạn cần phải vẽ những objects như thể một phần của màn hình hiển thị hiển thị .

Nhìn vào hàm onDrawFrame(...). Thêm vào khối try như sau:

drawObject(vikingObject, vikingAttachment, Mode.VIKING.scaleFactor,
  projectionMatrix, viewMatrix, lightIntensity)
drawObject(cannonObject, cannonAttachment, Mode.CANNON.scaleFactor,
  projectionMatrix, viewMatrix, lightIntensity)
drawObject(targetObject, targetAttachment, Mode.TARGET.scaleFactor,
  projectionMatrix, viewMatrix, lightIntensity)

Bạn đang gọi đến một hàm pre-existing drawObject(...) helper để lấy object, phần đính kèm tương ứng, hệ số tỷ lệ tương ứng cũng như các ma trận và các giá trị cần thiết cho OpenGL để vẽ object

private fun computeProjectionMatrix(): FloatArray {
  val projectionMatrix = FloatArray(16)
  session.getProjectionMatrix(projectionMatrix, 0, 0.1f, 100.0f)
  return projectionMatrix
}

private fun computeViewMatrix(frame: Frame): FloatArray {
  val viewMatrix = FloatArray(16)
  frame.getViewMatrix(viewMatrix, 0)
  return viewMatrix
}

private fun computeLightIntensity(frame: Frame) = frame.lightEstimate.pixelIntensity

Giá trị projectionMatrix được tính toán từ ARCore Session. Giá trị viewMatrix được tính toán từ ARCore Frame (để mô tả trạng thái AR tại một thời điểm cụ thể).

Hàm lightIntensity cũng hoàn toàn có thể được xác đinh từ frame .
Về cơ bản là xong rồi đấy. Bạn chạy lại ứng dụng xem nào .
Bạn thử chọn một một chính sách Viking, Cannon hay Target. Sau đó, tìm một plane trên máy ảnh của bạn và touch để đặt một object. Khi bạn đã đặt toàn bộ những objects, nếu xoay điện thoại thông minh, bạn sẽ thấy màn hình hiển thị như sau

AR là gì? Demo AR

# Tổng kết

Như vậy, mình triển khai xong hướng dẫn về cách thiết kế xây dựng AR App Core với OpenGL trong Android Studio. Để biết thêm thông tin, hãy xem ARCore API và ARCore Overview .

Bạn hãy download toàn bộ source code của projec trong hướng dẫn này tại đây:

Bạn cũng hoàn toàn có thể sử dụng ARCore with Unity và ARCore with Unreal. Ngoài Android, ARCore cũng hoàn toàn có thể tăng trưởng cho website và bạn hãy tìm thêm thông tin tại đây. Cuối cùng, nếu bạn tò mò muốn khám phá thêm và thưởng thức xem AR như thế nào thì những bạn vào Google experiments site để xem một số ít demo rất mê hoặc nhé
Mình kỳ vọng những bạn sẽ thích phần trình làng ngắn gọn về công nghệ AR này. Giờ bạn đã hiểu AR là gì rồi đúng không ? Hãy để lại comment để cùng nhau trao đổi thêm về xu thế công nghệ tiên tiến mới này nhé .

Source: https://virtual360.vn
Category: Blog

Viết một bình luận