07/09/2018, 17:12

Thực tải ảo với môi trường tự nhiên sử dụng ARToolkit

1. Thực tải ảo trong game Hiện tượng Pokémon GO từ một game di động với lối chơi độc đáo đã ngay lập tức trở thành một cơn sốt “bùng nổ”, khiến hàng triệu người dùng khắp thế giới điên đảo. Mở màn cho kỷ nguyên của dòng game tăng cường thực tế ảo (AR) trong thời gian tới? Một ...

banner.jpg

1. Thực tải ảo trong game

Hiện tượng Pokémon GO từ một game di động với lối chơi độc đáo đã ngay lập tức trở thành một cơn sốt “bùng nổ”, khiến hàng triệu người dùng khắp thế giới điên đảo. Mở màn cho kỷ nguyên của dòng game tăng cường thực tế ảo (AR) trong thời gian tới? Một khi các nhà phát triển đã nhận ra mỏ vàng khổng lồ như Pokémon GO vẫn còn vô vàn thứ để khai phá.

Trước hết, cần phải nhắc lại một chút kiến thức cơ bản để phân biệt giữa công nghệ thực tế ảo VR (Virtual Reality) và tương tác thực tế, hay còn gọi là “tăng cường thực tại ảo” AR (Augmented Reality).
AR được hiểu là công nghệ cho phép con người quan sát những vật trong thế giới thật thông qua một thiết bị điện tử. Ngoài những gì mắt thường ta nhìn thấy, thiết bị điện tử còn cho ta biết những thông tin khác liên quan đến vật đang được quan sát.

Dễ hiểu hơn, khi ứng dụng vào trò chơi trực tuyến trên thiết bị di động, đơn cử như Pokémon GO, công nghệ AR cho phép nhà phát triển game mô phỏng không gian địa lý có thật (là đường phố, cảnh quan, địa điểm). Sau đó đưa thêm các yếu tố nhân vật game, đồ vật, vị trí ảo vào đồng thời kết hợp với một cốt truyện và gameplay hợp lý để tạo ra một thế giới ảo mà thật cho người chơi tương tác hoàn toàn tự do.

AR thực hiện thực tại ảo thông nhiều dạng dữ liệu khác nhau, đối với Pokémon GO việc thực hiện dựa trên 2 yếu tố chính là GPS và hình ảnh môi trường xung quanh người dùng. Đối với GPS có thể dễ dàng lấy được thông qua các hàm API do từng nền tảng cung cấp, đối với môi trường thì dựa vào đặc trưng của hình ảnh môi trường để nhận diện thông qua các thư viện hỗ trợ thực tại ảo, sau đó là thêm các thành phần ảo(pokemon) cho người dùng nhìn thấy.

Trong bài viết này sẽ đi vào việc miêu tả nhận diện hình ảnh môi trường sử dụng ARToolkit và hiển thị đối tượng đồ họa khi phát hiện môi trường phù hợp trên Android.

2. Nhận diện hình ảnh môi trường với ARToolkit

ARToolkit là thư viện đa nền tảng cho phép người dùng thực hiện thực tại ảo trên các nền tảng khác nhau dựa trên môi trường xung quanh thông qua việc nhận diện đặc trưng cho hình ảnh.
Ví dụ cho thực hiện thực tại ảo với ARToolkit cho phép người dùng sử dụng camera điện thoại để phát hiện các đối tượng ảo môi trường xung quanh khi các dữ liệu về hình ảnh trùng khớp với tập dữ liệu định sẵn, được mô tả trong video sau

Để xây dựng ứng dụng chúng ta sẽ sử dụng ARToolkit cho việc sinh tập dữ liệu đặc trưng, nhận diện môi trường và render đối tượng đồ họa lên môi trường.

Github: https://github.com/artoolkit/artoolkit5

Tập dữ liệu đặc trưng của môi trường sẽ bao gồm tập dữ liệu về điểm và vùng đặc trưng được lưu trữ trong tập file: iset, fset, fset3. Để sinh tập dữ liệu đặc trưng ta sẽ sử dụng chuơng trình genTexData được code bằng C, hoặc sử dụng ứng dụng web RoR tích hợp genTexData để thực hiện
Github: https://github.com/hienbx94/AugmentedReality

Việc nhận diện sẽ được thực hiện trên thiết bị mobile Android.
Github: https://github.com/hienbx94/AugmentedReality_Android

Gồm các bước sau:

  • Sinh tập dữ liệu cho hình ảnh môi trường: Việc sinh tập dữ liệu chúng ta sẽ sử dụng genTexData do ARToolkit để thực hiện với đầu vào là hình ảnh của môi trường và các thông số về độ phân giải của hình ảnh, kết thúc ta sẽ thu được tập dữ liệu đặc trưng

![](https://artoolkit.org/documentation/lib/exe/fetch.php?cache=&media=nft_example_gentexdata_060.png =600x300)

  • Tạo project Android và import tập dữ liệu đặc trưng vừa sinh ra: Tạo project với min SDK 17, sử dụng java 1.7, NDK 11c, cấu trúc projec miêu tả trong hình sau:

Screenshot at 2016-07-31 23-27-35.png

  • Lấy dữ liệu hình ảnh qua camera và thực hiện nhận biết hình ảnh môi trường: Sử dụng API do Android cung cấp để thực hiện lấy hình ảnh qua camera và sử dụng JNI khởi tạo các lớp nhận biết hình ảnh

    CameraSurface.java: thực hiện truy cập camera để lấy hình ảnh vào chuyển đến JNI để nhận biết.

    nftBook.cpp: gồm các hàm thực hiện việc đọc tập dữ liệu đặc trưng và nhận biết hình ảnh đưa ra thông tin về vị trí góc độ hướng đề render đối tượng đồ họa

public class CameraSurface extends SurfaceView implements SurfaceHolder.Callback, Camera.PreviewCallback {

    public CameraSurface(Context context) {
        super(context);

    }

    public void surfaceCreated(SurfaceHolder holder) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {

    }

    @Override
    public void onPreviewFrame(byte[] data, Camera cam) {

    }
}

extern "C" {
    JNIEXPORT jboolean JNICALL JNIFUNCTION_NATIVE(nativeCreate(JNIEnv* env, jobject object, jobject instanceOfAndroidContext));
    JNIEXPORT jboolean JNICALL JNIFUNCTION_NATIVE(nativeStart(JNIEnv* env, jobject object));
    JNIEXPORT jboolean JNICALL JNIFUNCTION_NATIVE(nativeStop(JNIEnv* env, jobject object));
    JNIEXPORT jboolean JNICALL JNIFUNCTION_NATIVE(nativeDestroy(JNIEnv* env, jobject object));
    JNIEXPORT jboolean JNICALL JNIFUNCTION_NATIVE(nativeVideoInit(JNIEnv* env, jobject object, jint w, jint h, jint cameraIndex, jboolean cameraIsFrontFacing));
    JNIEXPORT void JNICALL JNIFUNCTION_NATIVE(nativeVideoFrame(JNIEnv* env, jobject obj, jbyteArray pinArray)) ;
    JNIEXPORT void JNICALL JNIFUNCTION_NATIVE(nativeSurfaceCreated(JNIEnv* env, jobject object));
    JNIEXPORT void JNICALL JNIFUNCTION_NATIVE(nativeSurfaceChanged(JNIEnv* env, jobject object, jint w, jint h));
    JNIEXPORT void JNICALL JNIFUNCTION_NATIVE(nativeDisplayParametersChanged(JNIEnv* env, jobject object, jint orientation, jint awidth, jint height, jint dpi));
    JNIEXPORT void JNICALL JNIFUNCTION_NATIVE(nativeDrawFrame(JNIEnv* env, jobject obj));
    JNIEXPORT void JNICALL JNIFUNCTION_NATIVE(nativeSetInternetState(JNIEnv* env, jobject obj, jint state));
};
...
  • Thực hiện render đối tượng đồ họa lên môi trường: Đối tượng đồ hoạ được render được lưu trong tập file và sử dụng OpenSceneGraph để vẽ các đối tượng đồ họa
    Đối tượng đồ họa đựoc lưu dưới file osg bao gồm thông tin vị trí và góc hướng của từng mảnh cấu hình nên đối tượng.
    Sự dụng OpenScenGraph đọc đối tượng đồ họa trên file osg và vẽ lên vị trí góc độ hướng của hình ảnh.

Screenshot at 2016-07-31 23-38-35.png

  • Vẽ lại hình ảnh môi trường và đối tượng đồ họa trên cùng một màn hình và hiển thị cho người dùng: Sử dụng OpenGL vẽ lại hình ảnh môi trường được lấy từ camera và đối tuơng đồ họa thông qua OpenSceneGraph trên cùng một màn hình và hiển thị cho người dùng.

Screenshot at 2016-07-31 23-55-26.png

0