眼鏡選款新方法,用AR+Scene技術實現3D虛擬試戴

HMSCore發表於2021-09-11

網際網路和智慧終端的普及促進了電商的產生和蓬勃發展,而新技術的產生,則推動著電商領域的不斷升級。疫情使得人們更加習慣於使用電商進行購物,但對傳統的線上購物模式已經產生了一些厭倦,電商市場急需模式上的變革,讓老使用者耳目一新,提供便捷的同時促進他們的購物慾望,同時也能憑藉爆點吸引到新使用者的加入。以此為背景,我們以HMS Core提供的智慧影像處理能力,識別使用者的面部和身體特徵,再結合顯示模式,讓使用者直接在手機上就能體驗產品的佩戴效果,提供更加便利的購物體驗。

場景

在淘寶、京東、天貓等購物app,以及小紅書、得物、什麼值得買等好物分享app,可以對產品進行AR體驗,便於消費者感受產品效果,也能減少後續的退換貨比例。

先看效果

開啟App

點選圖片可以檢視商品的3D模型,可以進行旋轉和縮放

開發準備

配置華為Maven倉地址

開啟AndroidStudio專案中的build.gradle檔案

在“buildscript > repositories”和“allprojects > repositories”中增加SDK的Maven倉地址:

buildscript {
    repositories{
      ...   
        maven {url 'http://developer.huawei.com/repo/'}
    }    
}
allprojects {
    repositories {      
       …
         maven { url 'http://developer.huawei.com/repo/'}
    }
}

新增編譯SDK依賴

開啟應用級的“build.gradle”檔案

在dependencies中新增圖形引擎的SDK包,使用Full-SDK,以及AR Engine的SDK包

dependencies {
….
implementation 'com.huawei.scenekit:full-sdk:5.0.2.302'
implementation 'com.huawei.hms:arenginesdk:2.13.0.4'
}

上述步驟可以參考開發者網站中的應用開發介紹

在AndroidManifest.xml中新增許可權

開啟main中的AndroidManifest.xml檔案,在<application 前新增相機的使用許可權

<!--相機許可權-->
<uses-permission android:name="android.permission.CAMERA" />

開發步驟

MainActivity配置

在MainActivity的layout配置檔案中新增兩個按鈕,一個背景設為產品的預覽圖,另一個新增文字“Try it on!”,引導使用者進行試戴。

<Button
    android:layout_width="260dp"
    android:layout_height="160dp"
    android:background="@drawable/sunglasses"
    android:onClick="onBtnShowProduct" />


<Button

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:text="Try it on!"

    android:textAllCaps="false"

    android:textSize="24sp"

    android:onClick="onBtnTryProductOn" />

點選onBtnShowProduct按鈕,會載入產品的3D模型,而點選onBtnTryProductOn,則會進入AR試戴介面。

產品3D模型展示

1、建立一個繼承自SceneView的SceneSampleView

public class SceneSampleView extends SceneView {

    public SceneSampleView(Context context) {

        super(context);

    }

    public SceneSampleView(Context context, AttributeSet attributeSet) {

        super(context, attributeSet);

    }

}

重寫surfaceCreated完成SceneView的建立和初始化,loadScene載入的是要進行渲染顯示的模型檔案,目前支援glTF和glb格式素材的渲染,loadSkyBox、loadSpecularEnvTexture、loadDiffuseEnvTexture分別進行天空盒紋理、鏡面反射紋理和漫反射紋理的載入,目前支援的是cubemap格式的dds檔案。

所載入的素材都存放在src->main->assets->SceneView資料夾內。

@Override

public void surfaceCreated(SurfaceHolder holder) {

    super.surfaceCreated(holder);

    // 載入渲染素材

    loadScene("SceneView/sunglasses.glb");

    //呼叫loadSkyBox載入天空盒紋理貼圖素材

    loadSkyBox("SceneView/skyboxTexture.dds");

    //呼叫loadSpecularEnvTexture載入環境光反射貼圖素材

    loadSpecularEnvTexture("SceneView/specularEnvTexture.dds");

    //呼叫loadDiffuseEnvTexture載入環境光漫反射貼圖素材

    loadDiffuseEnvTexture("SceneView/diffuseEnvTexture.dds");

}

2、新建一個SceneViewActivity,繼承自Activity,在其中用onCreate方法呼叫setContentView,傳入在layout檔案中用xml標籤建立的SampleView,

public class SceneViewActivity extends Activity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_sample);

    }

}

layout檔案中的SampleView建立為

<com.huawei.scene.demo.sceneview.SceneSampleView

    android:layout_width="match_parent"

    android:layout_height="match_parent"/>

3、在MainActivity中新建onBtnShowProduct,當點選對應的按鈕時,就會呼叫SceneViewActivity,將商品的3D模型載入,進行渲染,然後顯示出來

public void onBtnShowProduct(View view) {

    startActivity(new Intent(this, SceneViewActivity.class));

}

產品AR試戴展示

通過HMS Core提供的面部識別、影像渲染和AR顯示能力,可以非常便捷的實現產品的AR試戴展示

1、建立一個FaceViewActivity,繼承自Activity,同時建立對應的layout檔案

在layout中建立face_view,用於顯示試戴效果

<com.huawei.hms.scene.sdk.FaceView

    android:id="@+id/face_view"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    app:sdk_type="AR_ENGINE"></com.huawei.hms.scene.sdk.FaceView>

同時建立一個開關,用於對比佩戴與不佩戴的效果差別

<Switch

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:id="@+id/switch_view"

    android:layout_alignParentTop="true"

    android:layout_marginTop="15dp"

    android:layout_alignParentEnd="true"

    android:layout_marginEnd ="15dp"

    android:text="Try it on"

    android:theme="@style/AppTheme"

    tools:ignore="RelativeOverlap" />

2、在FaceViewActivity中重寫onCreate方法,獲取FaceView

public class FaceViewActivity extends Activity {

    private FaceView mFaceView;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_face_view);

        mFaceView = findViewById(R.id.face_view);

    }

}

3、建立switch開關的監聽方法,當開關開啟時,使用loadAsset方法載入商品的3D模型,LandmarkType可以選定與人臉的識別位置

mSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

    @Override

    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

        mFaceView.clearResource();

        if (isChecked) {

            // Load materials.

         int index = mFaceView.loadAsset("FaceView/sunglasses.glb", LandmarkType.TIP_OF_NOSE);

        }

    }

});

模型的大小和位置可以通過setInitialPose進行調整,建立position,rotation,scale陣列,將要調整的數值傳入

final float[] position = { 0.0f, 0.0f, -0.15f };

final float[] rotation = { 0.0f, 0.0f, 0.0f, 0.0f };

final float[] scale = { 2.0f, 2.0f, 0.3f };

在loadAsset語句下面加入

mFaceView.setInitialPose(index, position, scale, rotation);

4、在MainActivity中新建onBtnTryProductOn,點選按鈕時呼叫FaceViewActivity讓使用者檢視AR試戴效果

public void onBtnTryProductOn(View view) {

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)

            != PackageManager.PERMISSION_GRANTED) {

        ActivityCompat.requestPermissions(

                this, new String[]{ Manifest.permission.CAMERA }, FACE_VIEW_REQUEST_CODE);

    } else {

        startActivity(new Intent(this, FaceViewActivity.class));

    }

}

訪問華為開發者聯盟官網

獲取開發指導文件
華為HMS Core官方論壇

AR Engine開源倉庫連結:GitHubGitee

解決整合問題請到Stack Overflow

關注我們,第一時間瞭解 HMS Core 最新技術資訊~

相關文章