1542605579614-4723a488-9f04-4ab6-83da-c4b2cdc4a634.png

    此文上接一系列文章,先从基础概念开始,上一篇是物体旋转。

    缩放和平移一样简单。

    让我们将位置乘以期望的缩放值,这是前例中的变化部分。

    1. <script id="2d-vertex-shader" type="x-shader/x-vertex">
    2. attribute vec2 a_position;
    3. uniform vec2 u_resolution;
    4. uniform vec2 u_translation;
    5. uniform vec2 u_rotation;
    6. uniform vec2 u_scale;
    7. void main() {
    8. // 缩放
    9. vec2 scaledPosition = a_position * u_scale;
    10. // 旋转
    11. vec2 rotatedPosition = vec2(
    12. scaledPosition.x * u_rotation.y + scaledPosition.y * u_rotation.x,
    13. scaledPosition.y * u_rotation.y - scaledPosition.x * u_rotation.x);
    14. // 平移
    15. vec2 position = rotatedPosition + u_translation;

    然后需要在 JavaScript 中绘制的地方设置缩放量。

    1. ...
    2. var scaleLocation = gl.getUniformLocation(program, "u_scale");
    3. ...
    4. var scale = [1, 1];
    5. ...
    6. // 绘制场景
    7. function drawScene() {
    8. ...
    9. // 设置平移
    10. gl.uniform2fv(translationLocation, translation);
    11. // 设置旋转
    12. gl.uniform2fv(rotationLocation, rotation);
    13. // 设置缩放
    14. gl.uniform2fv(scaleLocation, scale);
    15. // 绘制几何体
    16. var primitiveType = gl.TRIANGLES;
    17. var offset = 0;
    18. var count = 18; // 6 个三角形组成 'F', 每个三角形 3 个点
    19. gl.drawArrays(primitiveType, offset, count);
    20. }

    现在我们有了缩放,拖动滑块试试。

    image.png

    CodePen 地址

    值得一提的是,缩放值为负数的时候会翻转几何体。

    希望之前的3篇文章能够帮助你理解平移,旋转和缩放。接下来我们将使用矩阵,这三种操作将包含在一个矩阵中,并表现为一种常用形式。