ARCore 增强图像 如何在运行时创建新的对象渲染器



我正在使用Java在Android Studio中扩展"Augmented Image"Arcore项目,我想在运行时创建新的对象渲染器,以便在增强图像上生成新对象。我看到了"Hello AR"项目,但在那个例子中,它创建了同一对象的更多实例,因此使用相同的对象渲染器。我需要创建不同的对象,所以我认为我需要创建不同的对象渲染器。

我尝试在"createOnGlThread"方法中创建我需要的所有对象渲染器,但这需要时间,而我更喜欢在运行时创建它们。它给我的问题是着色器。它不能在"createOnGlThread"方法之外创建它们,因为ShaderUtil中的"GLES20.glCreateShader(type("方法总是返回0,而"GLES20.glGetShaderiv(shader,GLES20.GL_COMPILE_STATUS,compileStatus,0(;"在compileStatus中也返回0,并启动RuntimeException("创建着色器时出错。

如何在"createOnGlThread"方法之外创建对象渲染器?

您可以做的不是首先创建所有对象渲染器,例如,当选择了模型时,请尝试创建它们。 假设您在屏幕上有一个按钮,当您单击该按钮时,您想要创建一个新的对象渲染器并更改模型和纹理。以下是您可以如何处理此问题。

myNewModel.setOnClickListener {
objectName = "newModelFromAssets"
objectTexture ="newTextureFromAssets"
objectRenderer = ObjectRenderer()
isModelSelected = true
}

然后在 onDrawFrame 中执行以下操作:

if (isModelSelected) {
isModelSelected = false
try {
objectRenderer.createOnGlThread(
this,
objectName,
objectTexture
)
objectRenderer.setDepthTexture(
depthTexture.depthTexture,
depthTexture.depthWidth,
depthTexture.depthHeight
)
objectRenderer.setMaterialProperties(
0.0f,
2.0f,
0.5f,
6.0f
)
} catch (e: Exception) {
Log.e("onSurfaceCreated", "Failed to read plane texture")
}
}

就这样。

一个更简单的解决方案是使用"queueEvent"从主线程与OPENGL交互,如下所示:

surfaceView.queueEvent {
//render your object
}

最新更新