Filament 3D模型动态替换纹理(图片)

该代码段展示了如何在Android应用中加载一个基础的3DGLB模型,然后将特定图层的纹理替换为指定的Bitmap图片。通过调整图片旋转、创建Texture并设置材质参数来完成动态替换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景:
加载一个基础模型,正面动态替换图片。

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()
        }
    }

  1. 找到对应的图层,替换准备好的图片
 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)
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值