OPENGL 坐標軸轉換

来源:https://www.cnblogs.com/changeMsBlog/archive/2019/08/24/11404306.html
-Advertisement-
Play Games

坐標軸 平移 旋轉 縮放 重置坐標軸 矩陣操作 示例 1、坐標軸 OpenGL 使用的右手坐標系,從正面看原點,逆時針旋轉被認為是正旋轉。 x軸:從左到右 y軸:從底部向上 z軸:從屏幕背向朝向前方 2、平移 public abstract void glTranslatef(float x ,fl ...


  • 坐標軸
  • 平移
  • 旋轉
  • 縮放
  • 重置坐標軸
  • 矩陣操作
  • 示例
1、坐標軸  OpenGL 使用的右手坐標系,從正面看原點,逆時針旋轉被認為是正旋轉。 x軸:從左到右 y軸:從底部向上 z軸:從屏幕背向朝向前方   2、平移
public abstract void glTranslatef(float x ,float y, float z)
平移操作相當於對坐標值進行加減法 二維中起點{-2,1} 要到{1,3} 我們需要添加{3,2} 三維中 {1,1,0} 要移動到{1,1,-3},我們需要添加{0,0,-3} 移動到屏幕中
gl.glTranslatef(0,0,-3);

 

3、旋轉

public abstract void glRotatef(float angle,float x,float y,float z)
對坐標軸進行的操作 x,y,z 定義旋轉的矢量,角度值是旋轉的度數,   執行平移和旋轉的順序很重要 先平移-旋轉,首先在網格上進行平移然後旋轉它,則在網格坐標系當前狀態上進行平移,新位置進行旋轉 先旋轉-後平移, 首先旋轉,後移動到自己的旋轉坐標系     4、縮放
public abstract void glScalef(float x,float y,float z)
縮放相當於將所有點的坐標值與縮放值相乘,對坐標軸進行的操作。gl.glScalef(2f,2f,2f) 進行縮放。意味著所有頂點乘與2 縮放與平移: 縮放和平移的順序很重要 平移2個單位,縮放值0.5
gl.glTranslatef(2,0,0);
gl.glScalef(0.5f,0.5f,0.5f);

先進行縮放,後平移

gl.glScanlef(0.5f,0.5f,0.5f);
gl.glTranslatef(2,0,0);

 

 

5、重置坐標軸 glLoadIdentity
public abstract void glLoadIdentity();
  6、矩陣操作 glPushMatrix
public abstract void glPushMatrix();

複製當前操作後的矩陣保存到堆棧中.

glPopMatrix

public abstract void glPopMatrix();
從堆棧中獲取上一個保存的矩陣,   實踐案例:    繪製3個方格,A、B、C 。縮放B 50%,然後讓A、C比B小50% ,然後讓A逆時針旋轉屏幕中心。B硬順時針繞A旋轉,最後C繞B順時針旋轉,逆時針繞其自身中心高速旋轉。
public class GLES20Renderer3 implements GLSurfaceView.Renderer{
    private Square square;
    private float angle=0;
    public GLES20Renderer3(){
        square=new Square();
    }
    
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        gl.glClearColor(0.0f,0.0f,0.0f,0.5f);
        gl.glShadeModel(GL10.GL_SMOOTH);
        gl.glClearDepthf(1.0f);
        gl.glEnable(GL10.GL_DEPTH_TEST);
        gl.glDepthFunc(GL10.GL_LEQUAL);
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_NICEST);
    }
    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        gl.glViewport(0,0,width,height);
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        GLU.gluPerspective(gl,45.0f,(float)width/(float)height,0.1f,100.0f);
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
    }
    @Override
    public void onDrawFrame(GL10 gl) {
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
        gl.glLoadIdentity();
        gl.glTranslatef(0,0,-10);
        //A
        gl.glPushMatrix();
        gl.glRotatef(angle,0,0,1);
        square.draw(gl);
        gl.glPopMatrix();
        //B
        gl.glPushMatrix();
        gl.glRotatef(-angle,0,0,1);
        gl.glTranslatef(2,0,0);
        gl.glScalef(.5f,.5f,.5f);
        square.draw(gl);
        //C
        gl.glPushMatrix();
        gl.glRotatef(-angle,0,0,1);
        gl.glTranslatef(2,0,0);
        gl.glScalef(.5f,.5f,.5f);
        square.draw(gl);
       
        gl.glPopMatrix();
        gl.glPopMatrix();
        angle++;

    }


}
public class Square {
private float vertices[]={
-1.0f,1.0f,0.0f,
-1.0f,-1.0f,0.0f,
1.0f,-1.0f,0.0f,
1.0f,1.0f,0.0f,
};
private short[] indices={0,1,2,0,2,3};
private FloatBuffer vertexBuffer;
private ShortBuffer indexBuffer;
public Square(){
ByteBuffer vbb=ByteBuffer.allocateDirect(vertices.length*4);
vbb.order(ByteOrder.nativeOrder());
vertexBuffer=vbb.asFloatBuffer();
vertexBuffer.put(vertices);
vertexBuffer.position(0);

ByteBuffer ibb=ByteBuffer.allocateDirect(indices.length*2);
ibb.order(ByteOrder.nativeOrder());
indexBuffer=ibb.asShortBuffer();
indexBuffer.put(indices);
indexBuffer.position(0);


}
public void draw(GL10 gl){
gl.glFrontFace(GL10.GL_CCW);
gl.glEnable(GL10.GL_CULL_FACE);
gl.glCullFace(GL10.GL_BACK);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(3,GL10.GL_FLOAT,0, vertexBuffer);
gl.glDrawElements(GL10.GL_TRIANGLES,indices.length,GL10.GL_UNSIGNED_SHORT,indexBuffer);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisable(GL10.GL_CULL_FACE);
}

}

 

 

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

-Advertisement-
Play Games
更多相關文章
  • /*the waiting game:儘管人生如此艱難,不要放棄;不要妥協;不要失去希望*/ 隨著MySQL MGR的版本的升級以及技術成熟,在把MHA拉下神壇之後, MGR越來越成為MySQL高可用的首選方案。MGR的搭建並不算很複雜,但是有一系列手工操作步驟,為了簡便MGR的搭建和故障診斷,這裡 ...
  • datanode無法連接到namenode namenode在清空hadoop.tmp.dir和namenode.dir文件夾重新格式化後,datanode還是無法連接到namenode並報錯: hdfs.server.datanode.DataNode: Problem connecting to ...
  • 一、集群規劃 這裡搭建一個 3 節點的 HBase 集群,其中三台主機上均為 。同時為了保證高可用,除了在 hadoop001 上部署主 服務外,還在 hadoop002 上部署備用的 服務。Master 服務由 Zookeeper 集群進行協調管理,如果主 不可用,則備用 會成為新的主 。 二、前 ...
  • MySQL常見的8種SQL錯誤用法 前言 MySQL在2016年仍然保持強勁的資料庫流行度增長趨勢。越來越多的客戶將自己的應用建立在MySQL資料庫之上,甚至是從Oracle遷移到MySQL上來。但也存在部分客戶在使用MySQL資料庫的過程中遇到一些比如響應時間慢,CPU打滿等情況。 阿裡雲RDS專 ...
  • SQL單表查詢 一、單表查詢的語法 select列名1,列名2... from 表名 where 條件 group by field having 篩選 order by field limit 限制條數 二、關鍵字的執行優先順序 from where group by having select d ...
  • Explain工具介紹 使用EXPLAIN關鍵字可以模擬優化器執行SQL語句,分析查詢語句或是結構的性能瓶頸。在select語句之前增加explaion關鍵字,MySQL會在查詢上設置一個標記,執行查詢會返回執行計劃的信息,而不是執行SQL。 Explaion分析示例 actor建表語句: CREA ...
  • Mongodb最基礎入門教程 如果想瞭解一下redis的入門教程,可以去看一下我的上一篇博客 Mongodb的安裝大家可以參考一下其他博主的博客,這裡我就不做介紹了。不過值得註意的是,在Linux版本中如果啟動mongodb的時候出現下麵這個錯誤(在windows版本中不會出現下麵的問題): mon ...
  • 一、基本概念 一個典型的 Hbase Table 表如下: 1.1 Row Key (行鍵) 是用來檢索記錄的主鍵。想要訪問 HBase Table 中的數據,只有以下三種方式: + 通過指定的 進行訪問; + 通過 Row Key 的 range 進行訪問,即訪問指定範圍內的行; + 進行全表掃描 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...