华为 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文件?