华为 AR 引擎 .obj 文件无法正确呈现
Huawei AR Engine .obj file not rendering properly
我有一个 android 应用程序,我正在使用华为 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.");
}
为了调整模型的大小,您可以将 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格式
我有一个 android 应用程序,我正在使用华为 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.");
}
为了调整模型的大小,您可以将 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格式