Cocos Creator 中 _worldMatrix 到底是什麼(上)

来源:https://www.cnblogs.com/yfrs/archive/2019/09/25/ccmatrix1.html
-Advertisement-
Play Games

Cocos Creator 中 _worldMatrix 到底是什麼(上) 1. (矩陣)Matrix是什麼,有什麼用 (矩陣)Matrix一個神奇的存在?在開發過程中對裡邊各項值的含義是不是抓耳撓腮,百思不得其解?今天我們就來庖丁解牛,撥開它的神秘面紗。由於內容較多,關於Cocos Creator ...


Cocos Creator 中 _worldMatrix 到底是什麼(上)

1. (矩陣)Matrix是什麼,有什麼用

(矩陣)Matrix一個神奇的存在?在開發過程中對裡邊各項值的含義是不是抓耳撓腮,百思不得其解?今天我們就來庖丁解牛,撥開它的神秘面紗。由於內容較多,關於Cocos Creator 中的_worldMatrix會分為三篇文章完成。最終形成一個完整的demo

首先我們先看看在Cocos Creator編輯器中,對應圖形的變化都有那些屬性,如下圖

IDE中變換屬性-小院不小

紅框的地方分別是位移、旋轉、縮放、傾斜它們都一一對應一個變換矩陣。

Cocos Creator 中的(矩陣)Matrix 是一個長度16的一維數組,按照先列後行的順序存儲一個 4 x 4 的放方陣。數組索引 0 1 2 3 分別表示矩陣第一列1 2 3 4 的數據。在2d的游戲坐標系中,一個三維矩陣就可以滿足基本的變換,但cocos creator 採用了四維矩陣,應該是為了和3d保持一致。矩陣表示如下(左邊體現Mat4對應屬性排列位置。右邊表示代碼中經常用到的變數a b c d tx ty與矩陣對應的位置信息)

$$
\left[
\begin{matrix}
m00&m04&m08&m12\
m01&m05&m09&m13\
m02&m06&m10&m14\
m03&m07&m11&m15\
\end{matrix}
\right]
=>
\left[
\begin{matrix}
a&c&0&0\
b&d&0&0\
0&0&1&0\
tx&ty&tz&1
\end{matrix}
\right]
$$

這樣的信息有什麼用呢?用來存儲節點 旋轉 縮放 傾斜 平移的圖形變換信息。要想知道其中緣由,複習一下線性代數及高數是很有必要的

  1. 矩陣乘法,以及相關性質
  2. 單位矩陣、逆矩陣、矩陣轉置
  3. 向量
  4. 齊次坐標
  5. 三角函數

有了以上知識,我們就可以簡單的推導下2d情況下,圖形變換對應的4中情況

2. 旋轉矩陣推導

在2d坐標系中,假設存在點(x,y),我們將該點同原點(0,0)相連形成一個線段。此時線段與坐標系中x軸的弧度為a 。 我們將在以原點為圓心,線段的長度半徑r。逆時針旋轉弧度 b,該條線段另外一端坐標變為(x1,y1),如下圖(左1)

旋轉推導

三個函數相關知識

  • 正弦函數和餘弦函數
    sin(a)=y/r => y = rsin(a)
    cos(a)=x/r => x = r
    cos(a)
  • 和角公式
    cos(a+b) = cos(a)cos(b) - sin(a)sin(b)
    sin(a+b) = sin(a)cos(b) + cos(a)sin(b)

由三角函數可以推導出
x1 = rcos(a+b) = rcos(a)cos(b) - rsin(a)sin(b) = xcos(b) - ysin(b)
y1 = r
sin(a+b) =rsin(a)cos(b) + rcos(a)sin(b) = ycos(b) + xsin(b) = xsin(b)+ysin(b)
轉換矩陣形式 B=AX

$$
\left[
\begin{matrix}
x1\y1\1
\end{matrix}
\right]
=
\left[
\begin{matrix}
cos(b)&-sin(b)&0\
sin(b)&cos(b)&0\
0&0&1
\end{matrix}
\right]
\times
\left[
\begin{matrix}
x\y\1
\end{matrix}
\right]
$$

在cocos creator中 ,採用行矩陣的寫法。以上在cocos creator實際運行形式如下,轉換公式如下 $B^T=X^T*A^T$。cocos creator 中剩下的縮放,傾斜,平移,請按照轉置矩陣,自行推導。

$$
\left[
\begin{matrix}
x1&y1&1
\end{matrix}
\right]
=
\left[
\begin{matrix}
x&y&1
\end{matrix}
\right]
\times
\left[
\begin{matrix}
cos(b)&sin(b)&1\
-sin(b)&cos(b)&1\
0&0&1
\end{matrix}
\right]
$$

3. 縮放矩陣推導

在2d坐標系中,假設存在點(x,y)縮放就是將坐標的x或y分別乘以一個縮放因數sx或sy。得到一個新的坐標(x1,y1),如下圖左2。

旋轉推導

由此可得到縮放公式
x1=xsx = xsx + y0
y1=x
sy = x0 + ysy
轉換矩陣形式 B=AX

$$
\left[
\begin{matrix}
x1\y1\1
\end{matrix}
\right]
=
\left[
\begin{matrix}
sx&0&0\
0&sy&0\
0&0&1
\end{matrix}
\right]
\times
\left[
\begin{matrix}
x\y\1
\end{matrix}
\right]
$$

4. 傾斜矩陣推導

在2d坐標系中,假設存在點(x,y)傾斜分為x軸傾斜以及y軸傾斜。沿x軸傾斜,就是將該點與點(x,0)連接而成的線段,以(x,0)為圓心,旋轉弧度a。如下圖(左3,左4) 得到一個新的坐標(x1,y1)。

旋轉推導

由此可得到傾斜公式

  • 沿x軸傾斜弧度a (圖左3)
    x1=x+ytan(a)
    y1=y
    轉換矩陣形式 B=AX

$$
\left[
\begin{matrix}
x1\y1\1
\end{matrix}
\right]
=
\left[
\begin{matrix}
1&tan(a)&0\
0&1&0\
0&0&1
\end{matrix}
\right]
\times
\left[
\begin{matrix}
x\y\1
\end{matrix}
\right]
$$

  • 沿y軸傾斜弧度a (圖左4)
    x1=x
    y1=y+xtan(a)=xtan(a)+y
    轉換矩陣形式 B=AX

$$
\left[
\begin{matrix}
x1\y1\1
\end{matrix}
\right]
=
\left[
\begin{matrix}
1&0&0\
tan(a)&1&0\
0&0&1
\end{matrix}
\right]
\times
\left[
\begin{matrix}
x\y\1
\end{matrix}
\right]
$$

5. 平移矩陣推導

在2d坐標中,假設存在點(x,y)平移分別是將 x 或 y 加上 x方向位移 tx 或 y方向位移 ty。從而得到新的點坐標(x1,y1)(圖左5)

旋轉推導

此可得到公式

x1=x+tx
y1=y+ty

轉換矩陣形式 B=AX

$$
\left[
\begin{matrix}
x1\y1\1
\end{matrix}
\right]
=
\left[
\begin{matrix}
1&0&tx\
0&1&ty\
0&0&1
\end{matrix}
\right]
\times
\left[
\begin{matrix}
x\y\1
\end{matrix}
\right]
$$

6. 複合變換

將變換矩陣,依次相乘得到一個新的矩陣記為$T_c$,使得$B=X*T_c$。所以**Cocos Creator中的,_worldMatrix,就是當前節點在世界坐標系中對應的複合變換矩陣**$T_c$。矩陣的乘法不滿足交換律。所以不同的順序,變換的效果會不相同。

7.小結

未完待續,中篇,我將分析CCNode.js 中 _updateLocalMatrix 方法為切入點,來加強對Cocos Creator 中 _worldMatrix理解。下篇,利用理解的知識完成圖形變換demo。再次加強對_worldMatrix認知。

歡迎感興趣的朋友關註我的微信訂閱號"小院不小",或者點擊下方的二維碼關註。我將多年開發中遇到的難點,以及一些有意思的功能,體會都會一一發佈到我的訂閱號中。需要本文demo可以在公眾號中回覆matrix

微信關註【小院不小】

維護了一個Coscos Creator 的游戲開發群,歡迎喜歡聊技術的朋友加入

微信群

閑來無事,採用cocos creator開發了一個小游戲【坦克俠】,感興趣的朋友一個可以來玩玩

小游戲坦克俠


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在平時網上商城購物時,我們能夠通過放大鏡效果來使我們看圖片能夠更加的清楚,今天我就來給大家分享一下我學習的放大鏡特效 下圖是原圖的樣子 下圖是滑鼠放上去的效果 接下來我們就看一看放大鏡效果是如何實現的 1.首先我們還是先把div佈局寫出來 2.其次是css部分 3.最後是js部分代碼 ...
  • 昨天朋友圈被「請給我一面國旗@微信官方」刷屏,雖然知道是假的,但是從另一個角度來看,弄清楚如何實現更有趣。 1、canvas 這就不得不提到小程式中的 API canvas,H5 中也是有 canvas 的,不過之前也一直沒有機會用,這次正好乘機試試水。 晚上回家看了下官方文檔,網上搜了一些類似的功 ...
  • 本方法是在不改變原 js 的情況下,通過擴展方法來實現本目的 首先在 datetimebox 控制項中擴展一個 綁定雙擊事件 的方法 然後在 datetimebox 控制項中的 onShowPanel 事件中 進行綁定雙擊事件 註意:上述兩個 擴展必須 放在 載入 datetimebox 控制項 之前。 ...
  • 我們也都知道上傳圖片的樣子是這樣的(選擇前)是這樣的(選擇後)。 先在HTML設置圖片上傳 然後編輯css樣式 最後設置js上傳圖片後的變化 最終呈現出來的結果如下:選擇前選擇後。 本文屬於簡單的小白文,只是講述知識點,如有幫助,切勿複製,請自行修改使用 ...
  • 從ES6開始,JavaScript就朝著工程化和麵向對象的大步邁進,我們並不知道這對於年輕的JavaScript來說是好還是壞,因為它最開始是做為一款輕量級的腳本語言而風靡全球的。這個問題就留給時間來證明吧! ...
  • let triangle={ a:1, b:2, c:3 } function coloTriangle(){ this.color='red'; } coloTriangle.prototype=triangle; let color=new coloTriangle(); Object.defi ...
  • 在陽光明媚最適合打盹的下午, 特意靜音的手機竟然動起來了, 你沒看錯, 它震動了.... 上帝(顧客)來電, "報表查詢系統左側樹狀菜單中設備的中文名稱不能排序", 要增加排序功能....bu la...bu la... , 增加xxx ,增加xxx 開始乾吧! 原諒我上面那麼多廢話... 華麗的分 ...
  • 123 /*** 修改*/ function changeTextareaValue(obj) { $(obj).html(obj.value);} /** * 列印 */ function clickPrint(){ bdhtml = window.document.body.innerHTML;... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...