场景:
加载一个基础模型,正面动态替换图片。
1. 加载固定模型:
fun loadBase3DModel(bitmap: Bitmap?) {
val buffer = readAsset(ActivityUtils.getTopActivity(), "base_3d_model.glb")
modelViewer.loadModelGlb(buffer)
modelViewer.transformToUnitCube()
try {
replaceCoverTexture(bitmap)
} catch (e: Exception) {
ToastUtils.showShort(e.localizedMessage)
e.printStackTrace()
}
}
- 找到对应的图层,替换准备好的图片
private fun replaceCoverTexture(cover: Bitmap?) {
val activity = ActivityUtils.getTopActivity()
val engine = modelViewer.engine
val asset = modelViewer.asset!!
val rm = modelViewer.engine.renderableManager
for (entity in asset.entities) {
val renderable = rm.getInstance(entity)
if (renderable == 0) {
continue
}
if (asset.getName(entity) == "xxx") { // ⬅︎ 这里是图层的名字
val material = rm.getMaterialInstanceAt(renderable, 0)
var bitmap = cover
if (ObjectUtils.isEmpty(bitmap)) {
bitmap = BitmapFactory.decodeResource(
activity.resources,
R.mipmap.od_img_launcher
)
}
bitmap = BitmapUtils.adjustPhotoRotation(bitmap, 90)
val width = bitmap.width
val height = bitmap.height
val bytes = bitmap.byteCount
val buffer = ByteBuffer.allocate(bytes)
bitmap.copyPixelsToBuffer(buffer)
buffer.flip()
val builder = Texture.Builder()
val newTexture = builder.width(width)
.height(height)
.levels(0xff)
.format(Texture.InternalFormat.SRGB8_A8)
.sampler(Texture.Sampler.SAMPLER_2D)
.build(engine)
TextureHelper.setBitmap(engine, newTexture, 0, bitmap)
// newTexture.generateMipmaps(engine)
val textureSampler = TextureSampler()
textureSampler.wrapModeR = TextureSampler.WrapMode.REPEAT
textureSampler.wrapModeS = TextureSampler.WrapMode.REPEAT
textureSampler.wrapModeT = TextureSampler.WrapMode.REPEAT
material.setParameter("baseColorIndex", 0)
material.setParameter("baseColorMap", newTexture, textureSampler)
}
}
}
private fun readAsset(context: Context, assetName: String): ByteBuffer {
val input = context.assets.open(assetName)
val bytes = ByteArray(input.available())
input.read(bytes)
return ByteBuffer.wrap(bytes)
}