精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美日本一区二区| 久久久久久久网| 久久人人97超碰精品888| 色哟哟无码精品一区二区三区| 久久一卡二卡| 91蜜桃视频在线| 国产精品美女免费看| 永久免费看片直接| 高潮久久久久久久久久久久久久| 疯狂欧美牲乱大交777| 日韩电影免费观看高清完整| 一区二区三区免费在线视频| 激情成人亚洲| 国产亚洲视频在线| 又黄又色的网站| 国产精品videossex撒尿| 亚洲精品亚洲人成人网在线播放| 精品视频免费观看| 国产精品国产av| 国产亚洲亚洲| 免费不卡欧美自拍视频| 亚洲av综合一区二区| 24小时成人在线视频| 韩曰欧美视频免费观看| 综合视频在线观看| 嫩草研究院在线| 激情都市一区二区| 日韩美女在线观看一区| 亚洲最大的黄色网址| 亚洲宅男一区| 精品久久久久久久久久久久久久久 | 欧美日韩一级在线| 欧洲亚洲精品视频| 成人午夜私人影院| 国产精品嫩草99av在线| 欧美日韩中文字幕日韩欧美| 超碰成人在线免费观看| 久久米奇亚洲| 成人va在线观看| 91日韩在线视频| 免费黄色片视频| 99视频+国产日韩欧美| 久久精品中文字幕一区| 99久久99久久精品免费看小说.| 激情av综合| 日韩女优制服丝袜电影| 污视频网址在线观看| 视频在线日韩| 色先锋资源久久综合| 日韩欧美一区二| 欧美韩日亚洲| 一区二区三区欧美亚洲| 亚洲综合激情五月| 欧美r级在线| 国产精品欧美久久久久无广告| 欧美成ee人免费视频| 色呦呦中文字幕| 成人h精品动漫一区二区三区| 91aaaa| 国产不卡精品视频| 国产精品一区二区三区99| 成人a在线视频| 91成人一区二区三区| 蜜臀91精品一区二区三区| 国产成人av在线播放| 婷婷激情五月综合| 日韩高清在线观看| 国产精品美女主播| 夜夜躁很很躁日日躁麻豆| 欧美aaa在线| 国产精品一区二区性色av| 正在播放木下凛凛xv99| 另类小说一区二区三区| 成人免费视频在线观看超级碰| 91在线公开视频| 国产美女在线观看一区| 亚洲一区二区三区乱码aⅴ| 99久久久国产精品无码网爆| 国产精品一区不卡| 国产精品乱码视频| 无码精品一区二区三区在线| 国产 日韩 欧美大片| 精品国产免费一区二区三区 | 精品一区二区三区香蕉蜜桃| 成人av.网址在线网站| 国产高清视频免费| youjizz国产精品| 欧美精品久久久| 中文字幕日本在线| 一区二区三区四区激情 | 91av久久| 色综合婷婷久久| 日日躁夜夜躁aaaabbbb| 欧美日韩黄网站| 日韩经典中文字幕| 青青青视频在线播放| 欧美99久久| 欧洲精品毛片网站| 91成人在线免费| 成人美女在线观看| 亚洲精品高清国产一线久久| 四季久久免费一区二区三区四区| 精品久久久久人成| www.精品在线| 精品亚洲免a| 色婷婷成人综合| 国产精品1234区| 日本在线不卡视频| 国产精品视频在线免费观看| 巨骚激情综合| 一二三四社区欧美黄| 亚洲五月天综合| 成人涩涩网站| xvideos成人免费中文版| 天天爽夜夜爽夜夜爽精品| 日韩成人免费看| 国产精品视频免费一区| 淫片在线观看| 欧美日韩在线视频首页| 亚洲视频在线不卡| 国产九一精品| 韩国欧美亚洲国产| jizz国产视频| 国产精品欧美一级免费| 91精品91久久久中77777老牛| 国产成人免费视频网站视频社区| 精品一区二区电影| 欧美三级在线免费观看| 日本亚洲三级在线| 麻豆av一区二区| 日本色护士高潮视频在线观看| 欧美综合欧美视频| 一级性生活大片| 一区在线免费| 91视频最新| 久久国产精品一区| 欧美性生活一区| 深爱五月激情网| 91久久亚洲| 超碰国产精品久久国产精品99| av一本在线| 在线观看国产日韩| 亚洲第一综合网| 久久九九99| 女人一区二区三区| 天堂在线中文网官网| 日韩av中文字幕在线播放| 精品在线视频免费观看| 成人午夜又粗又硬又大| 丰满少妇大力进入| 久久精品国产亚洲blacked| 欧美激情中文网| 成人午夜免费在线观看| 亚洲综合999| 中文在线观看免费视频| 最新日韩av| 狠狠色狠狠色综合人人| 九色porny丨入口在线| 亚洲黄页网在线观看| jizz国产免费| 91免费视频观看| 久久国产乱子伦免费精品| 蜜桃国内精品久久久久软件9| 日本午夜精品理论片a级appf发布| 视频二区在线| 欧洲激情一区二区| 中文字幕资源站| 国产在线观看一区二区| 久久久久久久香蕉| 久久久久影视| 国产91在线高潮白浆在线观看| 蜜桃成人在线视频| 欧美军同video69gay| 欧美第一页在线观看| 国产不卡视频在线观看| 成人免费观看cn| 欧美在线关看| 日本中文字幕久久看| 韩日视频在线| 欧美在线播放高清精品| 色欲人妻综合网| 国产精品中文有码| 男人天堂a在线| 日韩精品社区| 国产精品一区二区三区毛片淫片| 天天综合视频在线观看| 91精品国产综合久久久蜜臀粉嫩| 久久r这里只有精品| 久久亚洲私人国产精品va媚药| 免费观看成人网| 日韩精品1区| 91探花福利精品国产自产在线| 成人毛片视频免费看| 日韩欧美国产网站| 久久久精品成人| 国产乱子伦视频一区二区三区| 成人区一区二区| 国产一区国产二区国产三区| 国产日韩换脸av一区在线观看| 国产精品实拍| 亚洲精品一区二区三区在线观看| 激情五月色婷婷| 国产精品视频在线看| 岛国av免费在线| 亚洲国产专区校园欧美| 日本不卡高清视频一区| 国产精品45p| 国产精品扒开腿做爽爽爽的视频| 老司机免费在线视频| 精品国产一区二区三区忘忧草| 免费高清在线观看电视| 久久久国产精华| 中文字幕avav| 久久精品首页| 一区视频二区视频| 在线看成人短视频| 99高清视频有精品视频| 日本免费久久| 日韩一级裸体免费视频| 三级视频网站在线| 欧美一级精品大片| 免费av网站在线| 亚洲欧美视频在线观看视频| 亚洲黄色免费视频| 成人小视频免费在线观看| 美女一区二区三区视频| 伊人久久婷婷| 特级西西444| 欧美一区三区| 黄色99视频| 国产午夜亚洲精品一级在线| 国产精品香蕉在线观看| 深夜福利视频一区二区| 欧美久久久精品| a天堂中文在线88| 亚洲欧美激情另类校园| 亚洲产国偷v产偷v自拍涩爱| 欧美三级在线播放| 亚洲va在线观看| 欧美日韩一区二区免费在线观看| 校园春色 亚洲| 国产精品久久久久久久久免费桃花 | 91九色国产视频| 五月激情久久| 欧洲亚洲妇女av| 嗯~啊~轻一点视频日本在线观看| 久久97精品久久久久久久不卡| 超碰免费在线观看| 亚洲精品自拍偷拍| 国产刺激高潮av| 亚洲国产97在线精品一区| 国产伦理一区二区| 欧美日韩精品三区| 中文字幕人成人乱码亚洲电影| 欧美伊人久久久久久久久影院 | 成人黄色一区二区| 裸体一区二区| 18禁裸男晨勃露j毛免费观看| 亚洲欧美综合久久久| 亚洲第一页在线视频| 91影院成人| 吴梦梦av在线| 欧美三级小说| av在线免费观看国产| 欧美一区二区三区久久精品茉莉花 | 波多野结衣啪啪| 色婷婷综合久久久久中文一区二区 | 日韩成人18| 99re视频在线播放| 日本欧美三级| 欧美日韩系列| 国产欧美日韩精品一区二区免费| 麻豆av一区二区| 日韩www.| 一区二区三视频| 欧美日韩水蜜桃| 亚洲一区二区在| 久久久久久美女精品| 中国一级黄色录像| 欧美午夜不卡| 春日野结衣av| 日本中文字幕一区二区视频| www.色.com| 成人久久18免费网站麻豆| 欧美激情 亚洲| 不卡一区中文字幕| 在线观看亚洲大片短视频| 亚洲欧美自拍偷拍色图| 久久久精品国产sm调教网站| 亚洲一区二区三区四区中文字幕| 国产无套粉嫩白浆内谢| 欧美日韩国产精品一区二区不卡中文| 亚洲男人的天堂在线视频| 色噜噜狠狠色综合欧洲selulu| 最近中文字幕在线观看视频| 制服视频三区第一页精品| 亚洲乱码国产乱码精品精软件| 亚洲色图综合网| 久操视频在线免费播放| 久久久久久久久久久av| 日韩免费电影| 成人毛片网站| 国产一区二区精品福利地址| 中文字幕制服丝袜在线| 99热在线成人| 中国丰满人妻videoshd| 老司机免费视频一区二区三区| 18禁一区二区三区| 国产精品网站一区| 国产无套内射又大又猛又粗又爽 | 国产毛片视频网站| 人人超碰91尤物精品国产| 亚洲成人av免费观看| 2021国产精品久久精品| 91久久久久久久久久久久久久| 亚洲国产精品一区二区久久 | 国产尤物99| 日产精品一区二区| 妞干网在线观看视频| 蜜桃久久av一区| 亚洲自拍偷拍一区二区 | 欧美成人精品欧美一级私黄| 精品久久久久久久久久久| 成人av免费播放| 在线观看视频亚洲| а√天堂资源官网在线资源| 97人人做人人人难人人做| 狠狠操综合网| 高清无码视频直接看| 老司机精品视频在线| 久操视频在线观看免费| 亚洲国产aⅴ天堂久久| 一区二区 亚洲| 亚洲天堂男人的天堂| 99爱在线视频| 3d动漫精品啪啪一区二区三区免费| 国产成人高清精品免费5388| 台湾无码一区二区| 久久精品国内一区二区三区| 亚欧洲乱码视频| 懂色aⅴ精品一区二区三区蜜月| 国产伦精品一区二区三区视频痴汉 | 日本在线观看中文字幕| 日韩一二在线观看| 69av亚洲| 成人黄色片在线| av中字幕久久| 成人黄色片视频| 91在线云播放| 日韩精品无码一区二区| 精品福利在线导航| 久久bbxx| 国产精品区一区二区三在线播放| 午夜精品久久久久99热蜜桃导演 | 日韩免费中文专区| 亚洲欧美成人| 久久久午夜精品福利内容| 亚洲成人在线免费| 黑人精品一区二区| 欧美黑人国产人伦爽爽爽| 韩国女主播一区二区三区| 特级西西人体www高清大胆| 激情成人综合网| 天天色影综合网| 91精品国产综合久久福利软件 | eeuss国产一区二区三区| 国产无套粉嫩白浆内谢| 精品久久久三级丝袜| av资源网在线播放| 国产一区二区精品免费| 丝袜美腿亚洲色图| 黄色片网站免费| 欧美性大战久久久久久久| 国产鲁鲁视频在线观看特色| 亚洲伊人久久大香线蕉av| 中文字幕一区二区三区欧美日韩| 97人人模人人爽人人澡| 亚洲精品成人少妇| 亚洲va天堂va欧美ⅴa在线| 久久国产精品影视| 国产调教精品| 能在线观看的av| 国产三级欧美三级日产三级99 | 成人3d动漫一区二区三区91| 亚洲大胆视频| 少妇光屁股影院| 欧美网站一区二区| 国产在线看片| 国产无套精品一区二区| 一区二区三区国产盗摄| 岛国片在线免费观看| 日韩一级免费一区| h片在线观看视频免费免费| 午夜精品美女久久久久av福利| 精品系列免费在线观看| 国产精品自拍视频一区| 日韩中文字幕精品视频| 99久久婷婷国产综合精品青牛牛 | 精品精品导航| 久久亚洲国产精品日日av夜夜|