webgl怎么添加git动图呢

发布于 2023-03-16 22:12:01

我想在模型上,放一张gif图,但是绘制上去后,没有动。要怎么绘制才能让gif图正常动起来呢

查看更多

关注者
0
被浏览
1.6k
Jsonco
Jsonco 图形社区官方人员 2023-03-17
奔驰的蜗牛

感谢你的问题。我没有看到你的代码,所以不能明确判断出是程序的问题。但我可以给你一些思路。
首先,不管是webgl还是threejs如果想实现gif图动态变化,核心一点就是需要实时读取gif图每一帧的数据,因为gif本身是自带动画的。如果你直接将gif作为纹理贴图直接贴到模型上他是不能实现动态变化的。
其次,如果你要实现gif的自动播放效果,你需要将gif每一帧的图片数据解析出来,然后再去实时传到threejs纹理上面就可以。一般常用gif图片解析库有,omggif和giflib,这两个库都可以实现每一帧率的解析,接下来我们以omggif为例子吧,具体看看代码如何操作。
1、加载gif图片并解析帧数据

let gif = './aaa.gif';  //你的地址
fetch(gif )
  .then((res1) => res1.arrayBuffer())
  .then((res2) => {
    let gifarr = new Uint8Array(res2);
    let gifparse = OMGIF.parseGIF(gifarr );
    let frames = gifparse .frames.map((frame) => frame.canvas);

  });

2、将帧数据转换为threejs纹理。
在threejs中,可以使用THREE.TextureLoader或THREE.CanvasTexture来加载纹理,THREE.CanvasTexture与基本纹理类几乎相同,只是它将needsUpdate设置为立即。这非常符合gif的特点。

let texture = new THREE.CanvasTexture(frame);

3、将解析出来的数据创建放到threejs纹理对象即可。webgl的话就是imagetexture2D那一大块api哈。

let material = new THREE.MeshBasicMaterial({ map: texture });

4、下面就是将纹理赋值到几何上面了,代码很常见

let geometry = new THREE.PlaneGeometry(100, 100);
let mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);

5、后面是很关键的了,就是实时更新纹理,说白了就是更新解析出来的gif帧数据

function render() {
  requestAnimationFrame(render);
  mesh.material.map.needsUpdate = true;
  renderer.render(scene, camera);
}
render();

上面就是大致的思路,因为表达能力有限,希望可以抛引玉。

2 个回答
hongbin
hongbin 2023-04-01
这家伙很懒,什么也没写!

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览