华为 AR 引擎 .obj 文件无法正确渲染

Posted

技术标签:

【中文标题】华为 AR 引擎 .obj 文件无法正确渲染【英文标题】:Huawei AR Engine .obj file not rendering properly 【发布时间】:2021-04-01 01:37:31 【问题描述】:

我有一个安卓应用,我正在使用华为 AR 引擎套件。

我有一个扩展名为 .obj 的模型文件。当我在名为 blender 的应用程序中减小其大小后将此文件添加到我的应用程序时,我的模型无法正确显示。我将它们作为资产添加到 android 项目中。 我正确导出了模型,因为我在必要时检查了它并且我的模型是正确的。

我想调整模型的大小并以更小的尺寸显示它。

我在下面的应用程序中分享了模型的实际情况和屏幕截图。

model screenshot-eiffel

model-in-app

onDrawFrame如下

    public void onDrawFrame(float[] cameraView, float[] cameraProjection, float lightIntensity, VirtualObject obj) 
    ShaderUtil.checkGlError(TAG, "onDrawFrame start.");
    mModelMatrixs = obj.getModelAnchorMatrix();
    Matrix.multiplyMM(mModelViewMatrixs, 0, cameraView, 0, mModelMatrixs, 0);
    Matrix.multiplyMM(mModelViewProjectionMatrixs, 0, cameraProjection, 0, mModelViewMatrixs, 0);
    GLES20.glUseProgram(mGlProgram);
    Matrix.multiplyMV(mViewLightDirections, 0, mModelViewMatrixs, 0, LIGHT_DIRECTIONS, 0);
    MatrixUtil.normalizeVec3(mViewLightDirections);

    GLES20.glUniform4f(mLightingParametersUniform,
            mViewLightDirections[0], mViewLightDirections[1], mViewLightDirections[2], lightIntensity);
    float[] objColors = obj.getColor();

    GLES20.glUniform4fv(mColorUniform, 1, objColors, 0);
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextures[0]);
    GLES20.glUniform1i(mTextureUniform, 0);
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, mVertexBufferId);

    GLES20.glVertexAttribPointer(
            mPositionAttribute, 3, GLES20.GL_FLOAT, false, 0, 0);

    GLES20.glVertexAttribPointer(
            mNormalAttribute, 3, GLES20.GL_FLOAT, false, 0, mNormalsBaseAddress);

    GLES20.glVertexAttribPointer(
            mTexCoordAttribute, 2, GLES20.GL_FLOAT, false, 0, mTexCoordsBaseAddress);
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
    GLES20.glUniformMatrix4fv(
            mModelViewUniform, 1, false, mModelViewMatrixs, 0);
    GLES20.glUniformMatrix4fv(
            mModelViewProjectionUniform, 1, false, mModelViewProjectionMatrixs, 0);
    GLES20.glEnableVertexAttribArray(mPositionAttribute);
    GLES20.glEnableVertexAttribArray(mNormalAttribute);
    GLES20.glEnableVertexAttribArray(mTexCoordAttribute);
    GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, mIndexBufferId);
    GLES20.glDrawElements(GLES20.GL_TRIANGLES, mIndexCount, GLES20.GL_UNSIGNED_SHORT, 0);
    GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);
    GLES20.glDisableVertexAttribArray(mPositionAttribute);
    GLES20.glDisableVertexAttribArray(mNormalAttribute);
    GLES20.glDisableVertexAttribArray(mTexCoordAttribute);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
    ShaderUtil.checkGlError(TAG, "onDrawFrame end.");

【问题讨论】:

【参考方案1】:

为了调整模型的大小,您可以将 SCALE_FACTOR 更改为所需的值,

mModelMatrix[0] = SCALE_FACTOR;
mModelMatrix[5] = SCALE_FACTOR;
mModelMatrix[10] = SCALE_FACTOR;

如果您使用的是 AR Engine 的演示代码,它位于 VirtualObject 中。

而对于模型展示部分,需要根据你使用的模型,针对每一帧修改基于GLSurfaceView的onDrawFrame方法中的渲染代码。如果渲染部分过于复杂,可以尝试使用 Scene Kit 的 AR View 进行模型渲染,支持 glTF 和 glb 格式。

【讨论】:

以上是关于华为 AR 引擎 .obj 文件无法正确渲染的主要内容,如果未能解决你的问题,请参考以下文章

我的渲染技术进阶之旅Google开源的基于物理的实时渲染引擎Filament源码分析:在android中如何使用filamesh命令将.obj或者.fbx文件转换为.filamesh文件?

华为开发者大会主题演讲:图形引擎服务开启图形渲染的无限可能

华为开发者大会主题演讲:图形引擎服务开启图形渲染的无限可能

无法在 AR 增强面部中设置 3d 模型的正确方向

为什么我的2D OpenGL纹理无法正确加载? [关闭]

如何在 Android 中渲染 OBJ 或 FBX?