【libGDX】使用Mesh繪制立方體

1 前言

????????本文主要介紹使用 Mesh?繪制立方體,讀者如果對 Mesh 不太熟悉,請回顧以下內容:

  • 使用Mesh繪制三角形
  • 使用Mesh繪制矩形
  • 使用Mesh繪制圓形

????????在繪制立方體的過程中,主要用到了 MVP (Model View Projection)矩陣變換。

  • Model:模型變換,施加在模型上的空間變換,包含平移變換(translateM)、旋轉變換(rotateM)、對稱變換(transposeM)、縮放變換(scaleM);
  • View:觀察變換,施加在觀察點上的變換,用于調整觀察點位置、觀察朝向、觀察正方向;
  • Projection:透視變換,施加在視覺上的變換,用于調整模型的透視效果(如:矩形的透視效果是梯形)。

????????上述變換依次疊加,得到一個總的變換矩陣,即 MVP 變換矩陣,mvpMatrix = projectionMatrix * viewMatrix * modelMatrix,MVP 變換作用到模型的原始坐標矩陣上,得到的最終坐標矩陣即為用戶觀測到的模型狀態。?

? ? ? ? 對于立體圖形的繪制,繪制前需要清除深度緩存,并開啟深度測試,如下。

Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT | GL30.GL_DEPTH_BUFFER_BIT);
Gdx.gl.glEnable(GL30.GL_DEPTH_TEST);

2 繪制立方體

????????本節將使用?Mesh、ShaderProgram、Shader 繪制立方體,OpenGL ES 的實現見博客 →?繪制立方體。

????????DesktopLauncher.java

package com.zhyan8.game;import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application;
import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration;public class DesktopLauncher {public static void main (String[] arg) {Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration();config.setForegroundFPS(60);config.setTitle("Cube");new Lwjgl3Application(new Cube(), config);}
}

? ? ? ? Cube.java

package com.zhyan8.game;import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL30;
import com.badlogic.gdx.graphics.Mesh;
import com.badlogic.gdx.graphics.PerspectiveCamera;
import com.badlogic.gdx.graphics.VertexAttribute;
import com.badlogic.gdx.graphics.VertexAttributes.Usage;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;
import com.badlogic.gdx.math.Matrix4;
import com.badlogic.gdx.math.Vector3;public class Cube extends ApplicationAdapter {private PerspectiveCamera mCamera;private ShaderProgram mShaderProgram;private Mesh mMesh;private Vector3 mRotateAxis; // 旋轉軸private int mRotateAgree = 0; // 旋轉角度Matrix4 mModelMatrix; // 模型變換矩陣@Overridepublic void create() {initCamera();initShader();initMesh();mRotateAxis = new Vector3(0.3f, 0.5f, 0.7f);mModelMatrix = new Matrix4();}@Overridepublic void render() {Gdx.gl.glClearColor(0.455f, 0.725f, 1.0f, 1.0f);Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT | GL30.GL_DEPTH_BUFFER_BIT);Gdx.gl.glEnable(GL30.GL_DEPTH_TEST);mShaderProgram.bind();transform();mMesh.render(mShaderProgram, GL30.GL_TRIANGLES);}@Overridepublic void dispose() {mShaderProgram.dispose();mMesh.dispose();}private void initCamera() { // 初始化相機mCamera = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());mCamera.near = 0.3f;mCamera.far = 1000f;mCamera.position.set(0f, 0f, 2.5f);mCamera.lookAt(0, 0, 0);mCamera.update();}private void initShader() { // 初始化著色器程序String vertex = Gdx.files.internal("shaders/cube_vertex.glsl").readString();String fragment = Gdx.files.internal("shaders/cube_fragment.glsl").readString();mShaderProgram = new ShaderProgram(vertex, fragment);}private void initMesh() { // 初始化網格float[] vertices = getVertices(0.5f, 1.0f);short[] indices = getIndices();VertexAttribute vertexPosition = new VertexAttribute(Usage.Position, 3, "a_position");VertexAttribute colorPosition = new VertexAttribute(Usage.ColorUnpacked, 4, "a_color");mMesh = new Mesh(true, vertices.length / 7, indices.length, vertexPosition, colorPosition);mMesh.setVertices(vertices);mMesh.setIndices(indices);}private void transform() { // MVP矩陣變換mRotateAgree = (mRotateAgree + 2) % 360;mModelMatrix.idt(); // 模型變換矩陣單位化mModelMatrix.rotate(mRotateAxis, mRotateAgree);Matrix4 mvpMatrix = mModelMatrix.mulLeft(mCamera.combined);mShaderProgram.setUniformMatrix("u_mvpTrans", mvpMatrix);}private float[] getVertices(float r, float c) { // 獲取頂點數據float[] vertex = new float[] {r, r, r, c, c, c, 1, //0-r, r, r, 0, c, c, 1, //1-r, -r, r, 0, 0, c, 1, //2r, -r, r, c, 0, c, 1, //3r, r, -r, c, c, 0, 1, //4-r, r, -r, 0, c, 0, 1, //5-r, -r, -r, 0, 0, 0, 1, //6r, -r, -r, c, 0, 0, 1 //7};return vertex;}private short[] getIndices() { // 獲取三角形頂點索引序列short[] indices = new short[] {0, 1, 2, 0, 2, 3, //前面0, 5, 1, 0, 4, 5, //上面0, 3, 7, 0, 7, 4, //右面6, 5, 4, 6, 4, 7, //后面6, 3, 2, 6, 7, 3, //下面6, 2, 1, 6, 1, 5 //左面};return indices;}
}

????????cube_vertex.glsl

#version 300 esin vec3 a_position;
in vec4 a_color;uniform mat4 u_mvpTrans; // MVP矩陣變換out vec4 v_color;void main() {gl_Position = u_mvpTrans * vec4(a_position, 1.0);v_color = a_color;
}

????????cube_fragment.glsl

#version 300 es
precision mediump float; // 聲明float型變量的精度為mediumpin vec4 v_color;out vec4 fragColor;void main() {fragColor = v_color;
}

????????運行效果如下。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164974.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164974.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164974.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

目標檢測YOLO系列從入門到精通技術詳解100篇-【目標檢測】計算機視覺(最終篇)

目錄 知識儲備 KITTI數據集 1.KITTI數據集概述 2.數據采集平臺 3.Dataset詳述 算法原理

GIT無效的源路徑/URL

ssh-add /Users/haijunyan/.ssh/id_rsa ssh-add -K /Users/haijunyan/.ssh/id_rsa

windows11上enable WSL

Windows電腦上要配置linux(這里指ubuntu)開發環境,主要有三種方式: 1)在windows上裝個虛擬機(比如vmware)。缺點是vmware加載ubuntu后系統會變慢很多,而且需要通過samba來實現window…

git clone -mirror 和 git clone 的區別

目錄 前言兩則區別git clone --mirrorgit clone 獲取到的文件有什么不同瘦身倉庫如何選擇結語開源項目 前言 Git是一款強大的版本控制系統,通過Git可以方便地管理代碼的版本和協作開發。在使用Git時,常見的操作之一就是通過git clone命令將遠程倉庫克隆…

【vue2】axios請求與axios攔截器的使用詳解

🥳博 主:初映CY的前說(前端領域) 🌞個人信條:想要變成得到,中間還有做到! 🤘本文核心:當我們在路由跳轉前與后我們可實現觸發的操作 【前言】ajax是一種在javaScript代碼中發請…

低代碼開發與IT開發的區別

目錄 一、含義不同 二、開發門檻不同 三、兩者之間的區別 1、從技術特征來看 2、從目標開發者來看 四、低代碼平臺使用感受? (1)自定義模塊,滿足不同的業務需求 (2)工作流引擎,簡化復雜流程的管…

機器學習實戰-第4章 基于概率論的分類方法: 樸素貝葉斯

樸素貝葉斯 概述 貝葉斯分類是一類分類算法的總稱,這類算法均以貝葉斯定理為基礎,故統稱為貝葉斯分類。本章首先介紹貝葉斯分類算法的基礎——貝葉斯定理。最后,我們通過實例來討論貝葉斯分類的中最簡單的一種: 樸素貝葉斯分類。 貝葉斯理論 & 條件概率 貝葉斯理論 …

linux網絡之網絡層與數據鏈路層

文章目錄 一、網絡層 1.IP協議 2.IP協議頭格式 3.網段劃分 4.特殊ip地址 5.IP地址的數量限制 6.私有ip和公網IP 7.路由 二、數據鏈路層 1.以太網 2.以太網幀格式 3.MAC地址 4.對比理解MAC地址和IP地址 5.MTU 6.ARP協議 ARP協議的工作流程 ARP數據報的格式 7.DNS 8.ICMP協議 9.N…

839 - Not so Mobile (UVA)

題目鏈接如下: Online Judge 這道題劉汝佳的解法極其簡潔,用了20來行就解決了問題。膜拜…… 他的解法如下:天平(UVa839紫書p157)_天平 uva 839_falldeep的博客-CSDN博客 我寫了兩個(都很冗長&#xff…

淺談電氣設備的絕緣在線監測與狀態維修探究

賈麗麗 安科瑞電氣股份有限公司 上海嘉定 201801 摘要:在線監測是控制好電氣設備絕緣的重要方式,為電力系統穩定奠定重要基礎。在線監測電氣設備時,要利用檢測技術促進電力系統運行效率提升,讓電氣設備在具體工作過程中發揮更大作…

升級jdk17過程中,原來的jdk8下的webservice客戶端怎樣處理

背景:之前jdk8環境下,使用的cxf框架,而且是動態加載解析作為客戶端。大家一直相處的很愉快。但是最近升級jdk17,發現cxf不好用了。網上百度,大部分都是說升級cxf版本,并且添加jaxb的相關依賴就可以了。但是…

在線接口測試工具fastmock使用

1、fastmock線上數據模擬器 在平時的項目測試中,尤其是前后端分離的時候,前端人員需要測試調用后端的接口,這個時候會出現測試不方便的情況。此時我們可以使用fastmock平臺在線上模擬出一個可以調用的接口,方便前端人員進行數據測…

C/C++---------------LeetCode第2540. 最小公共值

最小公共值 題目及要求哈希算法雙指針 題目及要求 給你兩個整數數組 nums1 和 nums2 ,它們已經按非降序排序,請你返回兩個數組的 最小公共整數 。如果兩個數組 nums1 和 nums2 沒有公共整數,請你返回 -1 。 如果一個整數在兩個數組中都 至少…

categraf托管與自升級

categraf支持多種方式進行部署、托管,社區里部署和管理categraf也是五花八門,大家自己使用方便即可。 之前我們覺得大家通過ansible之類的工具批量下發/更新就能很簡單地完成任務,最近很多用戶咨詢我們關于categraf有沒有更方便的升級方式&am…

flink和機器學習模型的常用組合方式

背景 flink是一個低延遲高吞吐的系統,每秒處理的數據量高達數百萬,而機器模型一般比較笨重,雖然功能強大,但是qps一般都比較低,日常工作中,我們一般是如何把flink和機器學習模型組合起來一起使用呢? fli…

數據結構與算法【B樹】的Java實現+圖解

目錄 B樹 特性 實現 節點準備 大體框架 實現分裂 實現新增 實現刪除 完整代碼 B樹 也是一種自平衡的樹形數據結構,主要用于管理磁盤上的數據管理(減少磁盤IO次數)。而之前說的AVL樹與紅黑樹適合用于內存數據管理。存儲一個100w的數…

python每日一題——2字母異位詞分組

題目 給你一個字符串數組,請你將 字母異位詞 組合在一起。可以按任意順序返回結果列表。 字母異位詞 是由重新排列源單詞的所有字母得到的一個新單詞。 示例 1: 輸入: strs [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 輸出: [[“bat”],[“nat”…

新的centos7.9安裝jenkins—(一)

更多ruoyi-nbcio功能請看演示系統 gitee源代碼地址 前后端代碼: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后臺管理系統 因為是用java8,所以還是要最后java8版本的jenkins,版本號是2.346.3,后…

【Python】批量將PDG合成PDF,以及根據SS號重命名秒傳的文件

目錄 說明批量zip2pdf批量zip2pdf下載SS號重命名源代碼SS號重命名源代碼下載附錄,水文年鑒 說明 1、zip2pdf是一個開源軟件,支持自動化解壓壓縮包成PDG,PDG合成PDF,筆者在其基礎上做了部分修改,支持批量轉換。 2、秒…

【追求卓越11】算法--二叉樹

引導 接下來的幾節我們開始介紹非線性的數據結構--樹。樹的內容比較多也比較復雜。本節,我們只需要了解關于樹的一些基本概念。以及再進一步了解樹的相關內容--搜索二叉樹。該類型二叉樹在工作中,是我們常接觸的。該節我們介紹關于搜索二叉樹的相關操作&…