You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Three.js Canvas图片渲染:object-fit:cover比例保持及居中问题排查

图片扭曲滑块的Three.js适配问题:object-fit:cover效果与居中修复

我正在开发一个图片扭曲滑块,结构是图片作为背景层,链接作为前景层——鼠标hover每个链接时,背景图片会通过扭曲过渡切换到对应下一张图。

一开始遇到的问题是:不同屏幕尺寸加载页面时,Canvas渲染的图片会拉伸/变形。调整后(2024年3月11日更新),图片比例已经能保持类似object-fit:cover的效果,但图片无法居中于Canvas。尝试修改顶点着色器、ShaderMaterial都没解决,现在需要排查原因并找到解决方案。


初始化时的Canvas与渲染尺寸计算代码

let canvasWidth = images[0].clientWidth;
let canvasHeight = images[0].clientHeight;

let renderWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
let renderHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);

let renderW, renderH;

if( renderWidth > canvasWidth ) {
    renderW = renderWidth;
} else {
    renderW = canvasWidth;
}

renderH = canvasHeight;

renderer.setSize( renderW, renderH );

let aspectRatioCanvas = renderWidth / renderHeight;
let aspectRatio = images[0].clientWidth / images[0].clientHeight;

let scaleWidth = 1;
let scaleHeight = 1;

if (aspectRatio > aspectRatioCanvas) {
    scaleWidth = aspectRatio / aspectRatioCanvas;
} else {
    scaleHeight = aspectRatioCanvas / aspectRatio;
}

let geometry = new THREE.PlaneBufferGeometry(
    renderWidth * scaleWidth,
    renderHeight * scaleHeight,
    1
);

窗口resize事件处理代码

window.addEventListener( 'resize' , function(e) {
    renderWidth = parent.offsetWidth;
    renderHeight = parent.offsetHeight;
    renderer.setSize(renderWidth, renderHeight);

    let newAspectRatioCanvas = renderWidth / renderHeight;
    let newScaleWidth = 1;
    let newScaleHeight = 1;

    if (aspectRatio > newAspectRatioCanvas) {
        newScaleWidth = aspectRatio / newAspectRatioCanvas;
    } else {
        newScaleHeight = newAspectRatioCanvas / aspectRatio;
    }

    object.scale.set(newScaleWidth, newScaleHeight, 1);
});

需求明确

要让Canvas渲染的图片完全模拟CSS的object-fit:cover或background-size:cover行为:

  • 始终保持图片原始比例,无拉伸变形
  • 图片完整覆盖Canvas区域,超出部分裁剪
  • 图片在Canvas中居中显示

内容的提问来源于stack exchange,提问作者VikC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 10:55:01