• context2D上的texture mapping


    [来自:]http://www.alloyteam.com/2012/08/texture-mapping-on-context2d/

    我们在做一些图像变换或者3D建模时,骨架或者网格的“蒙皮”是少不了的。

    在webGL中,也就是“experimental-webgl”的context中,webGL跟openGL一样,提供了一个非常方便的

    JavaScript
    1
    gl.bindTexture

    接口,可以很容易的对某一个指定的面或者网格蒙上指定的素材。并且,被蒙皮的区域做矢量变换,3d rotate之类的,texture会自动随着变换。不用额外的做处理。所以在webGL中,textureMapping是十分容易和方便的。

    这里有个简单的demo,支持webGL的浏览器可以尝试围观下。

    当然,从文章的标题可以看出,我们今天要讨论的内容并不是webGL下的bindTexture。而是在2D的context下怎么对素材进行TextureMapping?

    【Texture Mapping】

    其实只要对canvas 2d context 的api有一定了解,找来找去就会发现,唯一能让图片变形的api应该只有

    JavaScript
    1
    CanvasRenderingContext2D.transform

    了,但是实际上,仅仅折腾这个api,参数改来改去试来试去会发现transform只能完成平行四边形的变换。如下demo:

    假如我想要做到不规则四边形的texture变换,就需要重新考虑一条路子。比如下面这个例子:

    ok,看起来基本已经达到目的了。可以适应任意不规则四边形的变换。

    那么是怎么实现的呢?

    【实现】 

    从上面那个演示demo应该就可以看出来了,还是利用“三角拼凑法”来实现。三角切分法有个维度,切分的越细,得到最终的模拟的结果会越逼真。相应的计算量也会越大。

    假设我们切分的阀值为n,那么代表把每条边先n等分,然后n*n个四边形格子,然后每个格子再沿对角一分为二,这样得到n*n*2个三角形,每个三角形都可以根据它所在的四边形格子进行transfrom的变换,最终拼接起来得到近似的结果。

    具体的实现和demo都可以从这里获取:
    https://github.com/hongru/TextureMapping

    【扩展】

    说了这么多,那么这样的功能在什么地方能用起来呢?更多的情景是在一些2D模拟3D场景并且需要texture做支撑的时候。

    于是,我们在Context 2D中也可以做到图片的3D翻转变换了。当然,如果只是图片的翻转的话,css3的transform-3d也可以做到,我们这里只讨论canvas中context 2d中的实现。

    当然,继续下去,完成一个图片展示的应用也未尝不可,并不需要webGL。如下一个简单的Demo

  • 相关阅读:
    js 实现页面局部(或图片)放大功能(vue)
    momentjs 使用总结
    VUX的使用方法(以弹出框为例)
    vue alert插件(标题为图片)(自写)
    vue 五星评价插件
    ES6 学习笔记(基础)
    SVG
    纯 CSS 实现实心三角形和空心三角形
    selectedIndex和onchange事件
    DOM文档获取和简介
  • 原文地址:https://www.cnblogs.com/hongru/p/2650896.html
Copyright © 2020-2023  润新知