精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一起學 WebGL:感受三維世界之視圖矩陣

開發 前端
對于一個立方體來說,我們從它的正前方看,不管距離它多遠,也只能看到一個二維的正方形。因此我們需要引入 視圖矩陣(view matrix)。它的作用就像是一個在特定位置的攝像頭。

大家好,我是前端西瓜哥。之前繪制的圖形都是在 XY 軸所在的平面上,這次我們來加入一點深度信息 z,帶你走入三維的世界。

視圖矩陣

對于一個立方體來說,我們從它的正前方看,不管距離它多遠,也只能看到一個二維的正方形。因此我們需要引入 視圖矩陣(view matrix)。它的作用就像是一個在特定位置的攝像頭。

視圖矩陣需要三個信息:

  1. 視點位置;
  2. 觀察點位置;
  3. 上方向;

就好比我們站在某個位置看一個模型,眼睛的位置就是觀察點,目光落在的點就是視點。我們站著看,上方向 就是朝上(y 正軸方向),躺著看就是水平方向,倒立著看就是朝下(y 負半軸方向)。

實際上我們并沒有一個真正的視口,我們的世界坐標的正中心永遠是原點,z 負半軸指向觀察者。

但我們可以利用相對運動的原理,給圖形做一個相反的操作,比如我往右邊走 1 個單位去看模型,其實等價于我不懂,模型向左移動 1 個單位,它們的效果是一樣的。

視圖矩陣的算法實現如下:

function createViewMatrix(eyeX, eyeY, eyeZ, atX, atY, atZ, upX, upY, upZ) {
  const normalize = (v) => {
    const length = Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
    return [v[0] / length, v[1] / length, v[2] / length];
  };
  const subtract = (v1, v2) => {
    return [v1[0] - v2[0], v1[1] - v2[1], v1[2] - v2[2]];
  };
  const cross = (v1, v2) => {
    return [
      v1[1] * v2[2] - v1[2] * v2[1],
      v1[2] * v2[0] - v1[0] * v2[2],
      v1[0] * v2[1] - v1[1] * v2[0]
    ];
  };

  const zAxis = normalize(subtract([eyeX, eyeY, eyeZ], [atX, atY, atZ]));
  const xAxis = normalize(cross([upX, upY, upZ], zAxis));
  const yAxis = normalize(cross(zAxis, xAxis));

  return new Float32Array([
    xAxis[0],
    yAxis[0],
    zAxis[0],
    0,
    xAxis[1],
    yAxis[1],
    zAxis[1],
    0,
    xAxis[2],
    yAxis[2],
    zAxis[2],
    0,
    -(xAxis[0] * eyeX + xAxis[1] * eyeY + xAxis[2] * eyeZ),
    -(yAxis[0] * eyeX + yAxis[1] * eyeY + yAxis[2] * eyeZ),
    -(zAxis[0] * eyeX + zAxis[1] * eyeY + zAxis[2] * eyeZ),
    1
  ]);
}

視圖坐標的實現細節不講,不重要。(順帶一提,上面的算法由 Github Copilot 生成)

通過這個方法計算出矩陣,傳入到頂點著色器的矩陣變量中,和頂點位置計算即可。

const viewMatrix = createViewMatrix(0.2, 0.25, 0.25, 0, 0, 0, 0, 1, 0);
const u_ViewMatrix = gl.getUniformLocation(gl.program, "u_ViewMatrix");
gl.uniformMatrix4fv(u_ViewMatrix, false, viewMatrix);

其他的創建緩沖區的邏輯就不講了,之前的文章都講過了。

完整代碼

貼一下完整代碼:

/** @type {HTMLCanvasElement} */
const canvas = document.querySelector("canvas");
const gl = canvas.getContext("webgl");

const vertexShaderSrc = `
attribute vec4 a_Position;
attribute vec4 a_Color;
uniform mat4 u_ViewMatrix;
varying vec4 v_Color;
void main() {
 gl_Position = u_ViewMatrix * a_Position;
 v_Color = a_Color;
}
`;

const fragmentShaderSrc = `
precision mediump float;
varying vec4 v_Color;
void main() {
  gl_FragColor = v_Color;
}
`;

/**** 渲染器生成處理 ****/
// 創建頂點渲染器
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, vertexShaderSrc);
gl.compileShader(vertexShader);
// 創建片元渲染器
const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fragmentShaderSrc);
gl.compileShader(fragmentShader);
// 程序對象
const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
gl.useProgram(program);
gl.program = program;

// prettier-ignore
const verticesColors = new Float32Array([
  // 下方的紅色三角形
  0, 0.2, -0.2, 1, 0, 0,  // 位置和顏色信息
  -0.2, -0.2, -0.2, 1, 0, 0,  
  0.2, -0.2, -0.2, 1, 0, 0,  
  // 上方的黃色三角形
  0, 0.2, 0, 1, 1, 0,  // 點 1 的位置和顏色信息
  -0.2, -0.2, 0, 1, 1, 0,  // 點 2
  0.2, -0.2, 0, 1, 1, 0,  // 點 3
]);
// 每個數組元素的字節數
const SIZE = verticesColors.BYTES_PER_ELEMENT;

// 創建緩存對象
const vertexColorBuffer = gl.createBuffer();
// 綁定緩存對象到上下文
gl.bindBuffer(gl.ARRAY_BUFFER, vertexColorBuffer);
// 向緩存區寫入數據
gl.bufferData(gl.ARRAY_BUFFER, verticesColors, gl.STATIC_DRAW);

// 獲取 a_Position 變量地址
const a_Position = gl.getAttribLocation(gl.program, "a_Position");
gl.vertexAttribPointer(a_Position, 3, gl.FLOAT, false, SIZE * 6, 0);
gl.enableVertexAttribArray(a_Position);

const a_Color = gl.getAttribLocation(gl.program, "a_Color");
gl.vertexAttribPointer(a_Color, 3, gl.FLOAT, false, SIZE * 6, SIZE * 3);
gl.enableVertexAttribArray(a_Color);

/****** 視圖矩陣 ****/
// prettier-ignore
// 取消下面一行注釋,并注釋下下一行代碼,可觀察沒有使用視圖矩陣的原始效果
// const viewMatrix = new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0,0,0,1]);
const viewMatrix = createViewMatrix(0.2, 0.25, 0.25, 0, 0, 0, 0, 1, 0);
const u_ViewMatrix = gl.getUniformLocation(gl.program, "u_ViewMatrix");
gl.uniformMatrix4fv(u_ViewMatrix, false, viewMatrix);

/*** 繪制 ***/
// 清空畫布,并指定顏色
gl.clearColor(0, 0, 0, 1);
gl.clear(gl.COLOR_BUFFER_BIT);
// 繪制三角形
gl.drawArrays(gl.TRIANGLES, 0, 6);

function createViewMatrix(eyeX, eyeY, eyeZ, atX, atY, atZ, upX, upY, upZ) {
  const normalize = (v) => {
    const length = Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
    return [v[0] / length, v[1] / length, v[2] / length];
  };
  const subtract = (v1, v2) => {
    return [v1[0] - v2[0], v1[1] - v2[1], v1[2] - v2[2]];
  };
  const cross = (v1, v2) => {
    return [
      v1[1] * v2[2] - v1[2] * v2[1],
      v1[2] * v2[0] - v1[0] * v2[2],
      v1[0] * v2[1] - v1[1] * v2[0]
    ];
  };

  const zAxis = normalize(subtract([eyeX, eyeY, eyeZ], [atX, atY, atZ]));
  const xAxis = normalize(cross([upX, upY, upZ], zAxis));
  const yAxis = normalize(cross(zAxis, xAxis));

  return new Float32Array([
    xAxis[0],
    yAxis[0],
    zAxis[0],
    0,
    xAxis[1],
    yAxis[1],
    zAxis[1],
    0,
    xAxis[2],
    yAxis[2],
    zAxis[2],
    0,
    -(xAxis[0] * eyeX + xAxis[1] * eyeY + xAxis[2] * eyeZ),
    -(yAxis[0] * eyeX + yAxis[1] * eyeY + yAxis[2] * eyeZ),
    -(zAxis[0] * eyeX + zAxis[1] * eyeY + zAxis[2] * eyeZ),
    1
  ]);
}

demo 地址:

https://codesandbox.io/s/ijxwu2?file=/index.js。

這里我繪制了紅色和黃色兩個三角形,紅色在更下邊,z 為 -0.2,黃色在上面一點,z 為 0。

應用視圖矩陣前的效果。因為兩者大小相同,黃色三角形完全蓋住了紅色。

圖片

應用視圖矩陣后:

圖片

結尾

今天簡單講了下讓我們指定一個位置觀察模型的方法:視圖矩陣。

之前我們也講了一個叫做模型矩陣的玩意,模型矩陣就好比一個三維軟件,我們將一個模型導入到場景中,移動它的位置、縮放它的尺寸,旋轉一下之類的。視圖矩陣就好比通過一個攝像機的視角看到的世界。

不知道你發現沒有,這里的兩個三角形并沒有近大遠小的透視效果。此外,當我們的觀察點位置非常靠右或靠左的時候,三角形會缺失部分。

關于這點,我會在下節講解 可視空間,解答這些問題。

責任編輯:姜華 來源: 前端西瓜哥
相關推薦

2023-05-04 08:48:42

WebGL復合矩陣

2023-04-27 08:27:29

WebGL變形矩陣

2023-05-17 08:28:55

2023-04-26 07:42:16

WebGL圖元的類型

2023-06-26 15:14:19

WebGL紋理對象學習

2023-04-12 07:46:24

JavaScriptWebGL

2023-03-29 07:31:09

WebGL坐標系

2023-04-17 09:01:01

WebGL繪制三角形

2023-04-13 07:45:15

WebGL片元著色器

2023-05-16 07:44:03

紋理映射WebGL

2023-05-31 20:10:03

WebGL繪制立方體

2023-04-11 07:48:32

WebGLCanvas

2023-02-28 07:28:50

Spritepixijs

2023-05-06 07:23:57

2022-02-08 14:35:36

分片集群數據庫mongo

2022-11-29 16:35:02

Tetris鴻蒙

2022-12-02 14:20:09

Tetris鴻蒙

2023-03-30 09:32:27

2022-11-14 17:01:34

游戲開發畫布功能

2022-10-18 07:33:57

Maven構建工具
點贊
收藏

51CTO技術棧公眾號

亚洲精品视频播放| 亚洲欧美经典视频| 国产极品精品在线观看| 国产破处视频在线观看| 欧美日韩国产一区二区在线观看| 亚洲伊人伊色伊影伊综合网| 久久偷窥视频| 国产一区二区波多野结衣| 亚洲高清资源| 在线视频一区二区| 图片区偷拍区小说区| 久久91导航| 一区二区三区欧美久久| 热re99久久精品国99热蜜月| 国产精品久久久久久免费 | 日韩精品中文字幕在线一区| 乱人伦xxxx国语对白| 午夜在线视频| 91麻豆免费看片| 91亚洲精华国产精华| 中文字幕精品无码一区二区| 欧美粗暴jizz性欧美20| 在线免费看av不卡| 亚洲综合自拍网| www.91精品| 欧美在线播放高清精品| av无码久久久久久不卡网站| 色影院视频在线| 久久久精品黄色| 国产伦精品一区二区三区免费视频 | 日韩欧美在线播放视频| 色屁屁www国产馆在线观看| 久久久99精品免费观看| 国产一区二区三区四区五区加勒比| 一区精品在线观看| 美女久久网站| 97av在线视频| 五月天婷婷丁香| 一本一道久久综合狠狠老| 中文在线不卡视频| a毛片毛片av永久免费| 久久悠悠精品综合网| 日韩精品一区二区三区视频| 亚洲精品成人在线播放| 欧美暴力调教| 91福利精品第一导航| 国产91在线视频观看| 不卡av免费观看| 亚洲午夜久久久久久久久电影网 | 国产精品主播视频| а中文在线天堂| 欧美在线综合| 热99精品里视频精品| 免费看毛片网站| 性高湖久久久久久久久| 91av在线精品| 六月丁香在线视频| 亚洲在线日韩| 欧美中文在线观看| 欧美超碰在线观看| 日韩激情一二三区| 国产美女主播一区| 一区二区国产欧美| 国产一区二区福利视频| 亚洲一区久久久| 欧美极品一区| 麻豆精品国产免费| 99久久婷婷| 久久精品视频免费播放| 欧美成人精品一区二区免费看片| 欧美精品日韩| 久久久久久免费精品| 日本一本高清视频| 国产美女精品| 国产精品美女免费看| 91美女精品网站| 国产中文字幕一区| 国产精品日韩高清| 欧美伦理影视网| 国产欧美一区二区在线| 夜夜爽99久久国产综合精品女不卡| 日本在线视频网| 亚洲另类春色国产| 久久久999免费视频| 亚洲精品在线影院| 欧美日韩一区二区不卡| 一区二区在线免费观看视频| 欧美激情影院| 中文字幕精品久久久久| 九九热精品在线观看| 国产亚洲毛片在线| 国产精品一香蕉国产线看观看| 精品人妻无码一区二区| 久久日韩粉嫩一区二区三区| 亚洲高清视频一区| 日本动漫同人动漫在线观看| 福利一区福利二区微拍刺激| 国产日韩欧美久久| 加勒比视频一区| 自拍偷拍亚洲欧美| 日本一区二区三区免费视频| 免费观看在线色综合| 国产精品乱子乱xxxx| www免费网站在线观看| 亚洲综合在线免费观看| 久久精品99国产| 日韩一区二区三区色| 亚洲人成在线免费观看| 国产三级国产精品国产国在线观看| 99精品视频网| 3d动漫啪啪精品一区二区免费| 青青青手机在线视频观看| 亚洲乱码国产乱码精品精可以看| 久久国产亚洲精品无码| 精品国产乱码久久久久久樱花| 亚洲精品网址在线观看| 欧美日韩精品一区二区三区视频播放| 久久精品一区二区三区中文字幕| 99久久精品久久久久久ai换脸| 国产女人在线视频| 欧美日韩中文字幕综合视频| 日日夜夜精品视频免费观看| 国产精品一区二区av交换| 久久久久成人精品| av网站免费播放| 中文字幕成人在线观看| 免费看日本毛片| 日韩视频一二区| 久久精品国产免费观看| 中文字幕在线2019| 久久日韩粉嫩一区二区三区| 免费看黄在线看| 国产精品亚洲综合在线观看| 中文字幕一区二区三区电影| 极品国产91在线网站| av在线播放一区二区三区| 丁香色欲久久久久久综合网| av在线国产精品| 日韩综合视频在线观看| 天天干天天插天天射| 国产亚洲综合色| 久草精品在线播放| 欧美日本成人| 日韩免费av片在线观看| 青青国产在线| 欧美日韩综合视频| 加勒比一区二区| 亚洲免费网站| 久久综合给合久久狠狠色| 春色校园综合激情亚洲| 亚洲精品久久久久中文字幕欢迎你| 免费又黄又爽又色的视频| 国产剧情一区二区| 亚洲中文字幕无码一区二区三区| 国产精品视频一区视频二区| 久久国产精品视频| 亚洲国产999| 亚洲成人在线观看视频| 波多野结衣加勒比| 亚洲神马久久| 欧美一区二区在线| 韩国精品主播一区二区在线观看 | 天天做天天摸天天爽国产一区 | 久久精品一本久久99精品| 91精品国产乱码久久| 中文字幕字幕中文在线中不卡视频| 污版视频在线观看| 亚洲欧美色图| 国产精品theporn88| 国产美女高潮在线观看| 国产丝袜一区视频在线观看| 亚洲乱码国产乱码精品| 欧美国产精品专区| 午夜激情视频网| 国产精品大片免费观看| 久久人人97超碰人人澡爱香蕉| 美脚恋feet久草欧美| 中文字幕视频在线免费欧美日韩综合在线看 | 婷婷五月综合久久中文字幕| 色婷婷综合久久久中文一区二区| 扒开jk护士狂揉免费| 日韩1区2区日韩1区2区| 91精品一区二区三区四区| 国产 日韩 欧美 综合 一区| 日韩免费在线视频| 国产最新在线| 亚洲国产高潮在线观看| 波多野结衣黄色网址| 亚洲欧美色图小说| 国产美女视频免费观看下载软件| 久久精品亚洲| 99亚洲国产精品| 欧美a大片欧美片| 国产女人精品视频| 黄视频在线免费看| 伊人久久大香线蕉av一区二区| 国产日韩欧美中文字幕| 欧美日韩在线免费观看| 国产美女高潮视频| 99国产精品一区| 蜜臀一区二区三区精品免费视频| 亚洲国产国产亚洲一二三| 亚洲午夜在线观看| 国产精品一区二区三区美女| 国产精品一二三视频| av资源中文在线| 久久久国产一区| 精品资源在线看| 精品久久久久久久久久久久久久久 | 五月天国产视频| 久久久久久色| 国产美女主播在线| 五月激情久久久| 日本亚洲欧洲精品| 电影一区二区在线观看| 国产精品专区h在线观看| jk漫画禁漫成人入口| 蜜月aⅴ免费一区二区三区| 黄色影院在线播放| 亚洲黄色成人网| 精品人妻一区二区三区含羞草| 91黄色激情网站| 久久久久久久久久久久久久av| 一区二区欧美在线观看| 日本黄色录像视频| 国产欧美日韩在线看| 噜噜噜在线视频| 成人午夜电影小说| 风韵丰满熟妇啪啪区老熟熟女| 久久精品国产亚洲高清剧情介绍| 久久精品99国产| 亚洲久久在线| 欧美一级视频在线播放| 欧美99在线视频观看| 一区二区三区我不卡| 成人羞羞视频播放网站| 蜜桃视频日韩| 欧美亚洲国产日韩| 国内精品久久久久久久果冻传媒| 玖玖玖视频精品| 亚洲一区中文字幕| 国产精品成人3p一区二区三区| 国产精品日日摸夜夜添夜夜av| xx欧美视频| 热99在线视频| 国产超碰精品| 国产精品91久久久| 欧美与亚洲与日本直播| 国产国语刺激对白av不卡| 三级成人在线| 国产精品久久久久一区二区| 日韩av大片站长工具| 国产成人精彩在线视频九色| 九九热线视频只有这里最精品| 国产成人福利网站| 日本黄色一区| 国产中文字幕亚洲| 国产欧美88| 成人动漫视频在线观看免费| 国产精品xxxav免费视频| 国内成+人亚洲| 亚洲v天堂v手机在线| 欧美国产视频在线观看| 精品国产aⅴ| 亚洲人成影视在线观看| 天天色天天射综合网| 成人国产在线看| 激情六月综合| 国产偷人视频免费| 久久福利视频一区二区| 日本女人黄色片| 成人免费福利片| 亚洲熟妇一区二区三区| 中文字幕精品一区二区精品绿巨人| 四季av中文字幕| 亚洲猫色日本管| 天天操天天爽天天干| 91福利视频在线| 99热这里只有精品9| 精品电影一区二区三区| 可以直接在线观看的av| 日韩有码在线播放| а_天堂中文在线| 热久久免费视频精品| 成人av在线播放| 九色91视频| 四虎成人精品永久免费av九九| 国产黄色激情视频| 视频在线观看一区| 特级西西444www| 91小视频在线| 四虎影院中文字幕| 欧美日韩中文在线| 国产精品特级毛片一区二区三区| 精品美女在线播放| jyzzz在线观看视频| 欧美激情按摩在线| 黄色成人在线视频| 国产乱码精品一区二区三区日韩精品| 经典一区二区| 妺妺窝人体色www看人体| 久久精品日产第一区二区| 中文字幕剧情在线观看| 久久久久免费观看| 国产午夜手机精彩视频| 午夜精品福利在线| 亚洲天堂999| 亚洲国产91色在线| 中文在线观看免费| 国产成人精品优优av| 加勒比视频一区| 午夜啪啪福利视频| 免费成人美女在线观看.| 污片免费在线观看| 亚洲精品伦理在线| 在线观看毛片网站| 亚洲九九九在线观看| 超清av在线| 97人摸人人澡人人人超一碰| 日韩av在线播放网址| 国产xxxxx在线观看| 成人av午夜影院| 久久av高潮av无码av喷吹| 欧美精品v日韩精品v韩国精品v| 精品美女视频在线观看免费软件| 久久久视频精品| 久久精品嫩草影院| 日韩中文不卡| 久久婷婷影院| 波多野结衣福利| 疯狂做受xxxx欧美肥白少妇| 亚洲欧美激情另类| 欧美精品精品精品精品免费| 国产精品日韩精品在线播放| 性欧美精品一区二区三区在线播放 | 99re热视频精品| 日韩精品乱码久久久久久| 精品第一国产综合精品aⅴ| 影音先锋中文在线视频| 51国产成人精品午夜福中文下载| 久久久久久久久99精品大| 91制片厂毛片| 国产精品美女久久久久av爽李琼| 亚洲天堂视频在线播放| 中文字幕av一区二区| 日韩视频网站在线观看| 日本日本精品二区免费| 首页亚洲欧美制服丝腿| 干b视频在线观看| 欧美性色综合网| 永久免费av片在线观看全网站| 国产精品久久在线观看| 国产精品99在线观看| 日韩 国产 一区| 有码一区二区三区| 国产香蕉在线观看| 91sao在线观看国产| 欧美日本成人| 中文字幕 日韩 欧美| 中文字幕综合网| 亚洲精品视频91| 97久久精品在线| 天天躁日日躁狠狠躁欧美| 国产第一页视频| 国产精品美女一区二区三区| 一级特黄aa大片| 美日韩精品视频免费看| 91综合久久爱com| 激情深爱综合网| 国产亚洲婷婷免费| 97在线公开视频| 欧美激情视频网址| 蜜臀av免费一区二区三区| 亚洲欧洲日本精品| 一区二区三区免费网站| 免费理论片在线观看播放老| 国产精品爽黄69| 欧美视频导航| 亚洲精品国产精品国自产网站| 91精品在线麻豆| 国产乱码午夜在线视频| 亚洲欧洲免费无码| 岛国av在线一区| aaa在线视频| 久久国产精品影片| 欧美人妖在线观看| 色噜噜狠狠一区二区| 亚洲午夜精品17c| av在线电影免费观看| 亚洲影院污污.| 久久国产99| 日本妇女毛茸茸| 国产亚洲精品久久久久久777| 粉嫩av国产一区二区三区| 日日橹狠狠爱欧美超碰| 中文字幕在线不卡| 天堂91在线| 3d精品h动漫啪啪一区二区| 日韩高清中文字幕一区| 久久久夜色精品|