Three.js + CSS3DSprite 首帧精灵图模糊问题排查、解决

一、 现象

页面初次加载,浮窗模糊;

用户一旦缩放/旋转/平移,相机矩阵刷新 → 浮窗就清晰。

二、 相关代码

ini 复制代码
        showAreaModel(item, operateModel) {
            // 显示区块浮窗
            const infoDiv = document.getElementById(`operateModel-${item.tenantId}`);
            if (infoDiv) {
                const bbox = new THREE.Box3().setFromObject(operateModel);
                const center = new THREE.Vector3();
                bbox.getCenter(center);

                let sprite = new CSS3DSprite(infoDiv);
                sprite.position.set(center.x, 0.92, center.z);
                sprite.hdType = '区块浮窗';
                // 原尺寸太大,缩小浮窗
                sprite.scale.multiplyScalar(0.0014);

                this.scene.add(sprite);
                sprite.mainModel = operateModel;
                operateModel.blockCardModel = sprite;
            }
        },

三、经过排查、调研, 最终有效方案

核心思路:避免使用threejs的scale缩放,避免直接用 sprite.scale 缩放,改为 DOM 内层缩放。

实现方式:

给浮窗 DOM 加一层 外包装容器(three.js 控制定位)。

内层 DOM 用 transform: scale() 缩放元素。

创建精灵图时 sprite 保持 scale = 1,不再使用 threejs的scale 缩放。

示例:

css 复制代码
<div class="sprite-wrapper">

   <div class="sprite-inner">浮窗文字</div>

</div>

.sprite-wrapper {

   display: inline-block; /* three.js 控制它 */

}

.sprite-inner {

   transform: scale(0.0014) translate(-50%, -50%); ;    /* 再缩小 */

   transform-origin: top left;  /* 保持对齐 */

}

四、 结论

不要使用threejs 极小缩放精灵图,在dom里使用css缩放元素。

相关推荐
ywf12151 小时前
前端的dist包放到后端springboot项目下一起打包
前端·spring boot·后端
恋猫de小郭2 小时前
2026,Android Compose 终于支持 Hot Reload 了,但是收费
android·前端·flutter
hpoenixf8 小时前
2026 年前端面试问什么
前端·面试
还是大剑师兰特8 小时前
Vue3 中的 defineExpose 完全指南
前端·javascript·vue.js
泯泷8 小时前
阶段一:从 0 看懂 JSVMP 架构,先在脑子里搭出一台最小 JSVM
前端·javascript·架构
mengchanmian9 小时前
前端node常用配置
前端
华洛9 小时前
利好打工人,openclaw不是企业提效工具,而是个人助理
前端·javascript·产品经理
xkxnq9 小时前
第六阶段:Vue生态高级整合与优化(第93天)Element Plus进阶:自定义主题(变量覆盖)+ 全局配置与组件按需加载优化
前端·javascript·vue.js
A黄俊辉A10 小时前
vue css中 :global的使用
前端·javascript·vue.js
小码哥_常10 小时前
被EdgeToEdge适配折磨疯了,谁懂!
前端