1. 程式人生 > >android 使用OPENGL ES繪製一個圓環-三維空間

android 使用OPENGL ES繪製一個圓環-三維空間

package com.scout.eeeeeee;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.util.ArrayList;
import javax.microedition.khronos.opengles.GL10;
public class huanCH
{
private FloatBuffer ding;//頂點緩衝
private FloatBuffer wen;//紋理緩衝
private FloatBuffer myNormalBuffer
;//法向量緩衝 int vcount; int textureid; float rSpan; float cSpan; float ring_Radius; float circle_Radius; public float mAngleX; public float mAngleY; public float mAngleZ; public huanCH(float rSpan,float cSpan,float ring_Radius,float circle_Radius,int textureid) { //rSpan表示環每一份多少度;cSpan表示圓截環每一份多少度;ring_Radius表示環半徑;circle_Radius圓截面半徑。
this.rSpan=rSpan; this.cSpan=cSpan; this.circle_Radius=circle_Radius; this.ring_Radius=ring_Radius; this.textureid=textureid; ArrayList<Float> val=new ArrayList<Float>(); ArrayList<Float> ial=new ArrayList<Float>();//法向量存放列表 for(float circle_Degree=50f;circle_Degree<130f;circle_Degree
+=cSpan) { for(float ring_Degree=-90f;ring_Degree<0f;ring_Degree+=rSpan) { float x1=(float) ((ring_Radius+circle_Radius*Math.cos(Math.toRadians(circle_Degree)))*Math.cos(Math.toRadians(ring_Degree))); float y1=(float) (circle_Radius*Math.sin(Math.toRadians(circle_Degree))); float z1=(float) ((ring_Radius+circle_Radius*Math.cos(Math.toRadians(circle_Degree)))*Math.sin(Math.toRadians(ring_Degree))); float x2=(float) ((ring_Radius+circle_Radius*Math.cos(Math.toRadians(circle_Degree)))*Math.cos(Math.toRadians(ring_Degree+rSpan))); float y2=(float) (circle_Radius*Math.sin(Math.toRadians(circle_Degree))); float z2=(float) ((ring_Radius+circle_Radius*Math.cos(Math.toRadians(circle_Degree)))*Math.sin(Math.toRadians(ring_Degree+rSpan))); float x3=(float) ((ring_Radius+circle_Radius*Math.cos(Math.toRadians(circle_Degree+cSpan)))*Math.cos(Math.toRadians(ring_Degree+rSpan))); float y3=(float) (circle_Radius*Math.sin(Math.toRadians(circle_Degree+cSpan))); float z3=(float) ((ring_Radius+circle_Radius*Math.cos(Math.toRadians(circle_Degree+cSpan)))*Math.sin(Math.toRadians(ring_Degree+rSpan))); float x4=(float) ((ring_Radius+circle_Radius*Math.cos(Math.toRadians(circle_Degree+cSpan)))*Math.cos(Math.toRadians(ring_Degree))); float y4=(float) (circle_Radius*Math.sin(Math.toRadians(circle_Degree+cSpan))); float z4=(float) ((ring_Radius+circle_Radius*Math.cos(Math.toRadians(circle_Degree+cSpan)))*Math.sin(Math.toRadians(ring_Degree))); val.add(x1);val.add(y1);val.add(z1); val.add(x4);val.add(y4);val.add(z4); val.add(x2);val.add(y2);val.add(z2); val.add(x2);val.add(y2);val.add(z2); val.add(x4);val.add(y4);val.add(z4); val.add(x3);val.add(y3);val.add(z3); //各個頂點圓截面中心的組成的圓環上的點的座標 float a1=(float) (x1-(ring_Radius*Math.cos(Math.toRadians(ring_Degree)))); float b1=y1-0; float c1=(float) (z1-(ring_Radius*Math.sin(Math.toRadians(ring_Degree)))); float l1=getVectorLength(a1, b1, c1);//模長 a1=a1/l1;//法向量規格化 b1=b1/l1; c1=c1/l1; float a2=(float) (x2-(ring_Radius*Math.cos(Math.toRadians(ring_Degree+rSpan)))); float b2=y1-0; float c2=(float) (z2-(ring_Radius*Math.sin(Math.toRadians(ring_Degree+rSpan)))); float l2=getVectorLength(a2, b2, c2);//模長 a2=a2/l2;//法向量規格化 b2=b2/l2; c2=c2/l2; float a3=(float) (x3-(ring_Radius*Math.cos(Math.toRadians(ring_Degree+rSpan)))); float b3=y1-0; float c3=(float) (z3-(ring_Radius*Math.sin(Math.toRadians(ring_Degree+rSpan)))); float l3=getVectorLength(a3, b3, c3);//模長 a3=a3/l3;//法向量規格化 b3=b3/l3; c3=c3/l3; float a4=(float) (x4-(ring_Radius*Math.cos(Math.toRadians(ring_Degree)))); float b4=y1-0; float c4=(float) (z4-(ring_Radius*Math.sin(Math.toRadians(ring_Degree)))); float l4=getVectorLength(a4, b4, c4);//模長 a4=a4/l4;//法向量規格化 b4=b4/l4; c4=c4/l4; ial.add(a1);ial.add(b1);ial.add(c1);//頂點對應的法向量 ial.add(a2);ial.add(b2);ial.add(c2); ial.add(a4);ial.add(b4);ial.add(c4); ial.add(a2);ial.add(b2);ial.add(c2); ial.add(a3);ial.add(b3);ial.add(c3); ial.add(a4);ial.add(b4);ial.add(c4); } } vcount=val.size()/3; float[] vertexs=new float[vcount*3]; for(int i=0;i<vcount*3;i++) { vertexs[i]=val.get(i); } ByteBuffer vbb=ByteBuffer.allocateDirect(vertexs.length*4); vbb.order(ByteOrder.nativeOrder()); ding=vbb.asFloatBuffer(); ding.put(vertexs); ding.position(0); //法向量 float[] normals=new float[vcount*3]; for(int i=0;i<vcount*3;i++) { normals[i]=ial.get(i); } ByteBuffer ibb=ByteBuffer.allocateDirect(normals.length*4); ibb.order(ByteOrder.nativeOrder()); myNormalBuffer=ibb.asFloatBuffer(); myNormalBuffer.put(normals); myNormalBuffer.position(0); //紋理 int row=(int) (360.0f/cSpan); int col=(int) (360.0f/rSpan); float[] textures=generateTexCoor(row,col); ByteBuffer tbb=ByteBuffer.allocateDirect(textures.length*4); tbb.order(ByteOrder.nativeOrder()); wen=tbb.asFloatBuffer(); wen.put(textures); wen.position(0); } public void drawSelf(GL10 gl) { gl.glRotatef(mAngleX, 1, 0, 0);//旋轉 gl.glRotatef(mAngleY, 0, 1, 0); gl.glRotatef(mAngleZ, 0, 0, 1); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, ding); gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);//開啟法向量緩衝 gl.glNormalPointer(GL10.GL_FLOAT, 0, myNormalBuffer);//指定法向量緩衝 gl.glEnable(GL10.GL_TEXTURE_2D); gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, wen); gl.glBindTexture(GL10.GL_TEXTURE_2D, textureid); gl.glDrawArrays(GL10.GL_TRIANGLES, 0, vcount); gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);//關閉緩衝 gl.glEnable(GL10.GL_TEXTURE_2D); gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); gl.glDisableClientState(GL10.GL_NORMAL_ARRAY); } //自動切分紋理產生紋理陣列的方法 public float[] generateTexCoor(int bw,int bh) { float[] result=new float[bw*bh*6*2]; float sizew=1.0f/bw;//列數 float sizeh=1.0f/bh;//行數 int c=0; for(int i=0;i<bh;i++) { for(int j=0;j<bw;j++) { //每行列一個矩形,由兩個三角形構成,共六個點,12個紋理座標 float s=j*sizew; float t=i*sizeh; result[c++]=s; result[c++]=t; result[c++]=s; result[c++]=t+sizeh; result[c++]

相關推薦

android 使用OPENGL ES繪製一個-三維空間

package com.scout.eeeeeee; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import java.util.ArrayList; import javax.mi

android 使用OPENGL ES繪製一個圓柱體-三維空間

package com.scout.eeeeeee; /** * Created by liuguodong on 2017/10/29. */ import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuf

CAD技巧-如何在CAD中繪製一個

CAD技巧,如何在CAD中繪製一個圓環?在日常的工作中,在編輯CAD圖紙的時候,我們需要藉助CAD編輯器中的許多圖形來編輯一張完整的CAD圖紙檔案,以此來設計出我們滿意的圖紙,我們會使用到許多的圖形比如說多邊形、直線、正方,長方形等一些圖形,但是我們如何在CAD中繪製一個圓環了?具體要怎麼來操作?下面我們就來

Android OpenGL ES 開發教程 22 繪製一個球體

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android開發 ImageView上繪製旋轉(透明度不同的旋轉,利用canvas drawArc實現)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

android遊戲開發(OpenGL ES繪製矩形平面)

接觸android將近一年了,以前學的應用開發,現在自學android遊戲開發,把自己學到的分享出來一下,(這也是我的第一篇部落格),不說廢話了,開始正文: GLRender類用於圖形的渲染工作,Util類用於glrender中的資料緩衝。 GLRender類: pack

Android OpenGL ES 2.0繪圖:繪製紋理

紋理,在OpenGL中,可以理解為載入到顯示卡視訊記憶體中的圖片。 Android裝置在 2.2開始支援OpenGL ES2.0,從前都是ES1.0 和 ES1.1的版本。 簡單來說,OpenGL ES是為了嵌入裝置進行功能剪裁後的OpenGL版本。ES2.0是和1.x版本不相容的,區別和相容性參見

Android OpenGL ES 開發(二)— 繪製三角形

        在前一篇部落格我們知道了Android中OpenGL ES是什麼,然後知道了怎麼搭建一個OpenGL ES的執行環境,現在我們就來開始繪製我們自己想要的圖形了(繪製圖片會在後面講解,因為繪製圖形是繪製圖片的基礎),我們最先開始繪製一個三角形

初學Android,OpenGL ES繪製平面多邊形(八十)

在Android中使用OpenGL ES需三步1.建立GLSurfaceView元件,使用Activity顯示GLSurfaceView元件2.為GLSurfaceView建立GLSurfaceView.Renderer例項,實現Renderer類時需要實現接口裡的三個方法 

【Qt for AndroidOpenGL ES 繪製彩色立方體

Qt 內建對OpenGL ES的支援,選用Qt進行OpenGL ES的開發是非常方便的,許多輔助類都已經具備。從Qt 5.0開始增加了一個QWindow類,該類既可以使用OpenGL繪製3D圖形,也可以使用QPainter繪製2D傳統的GDI+圖形,5.0以前的QGLWid

android opengl es新增紋理,繪製立方體紋理,立方體使用不同紋理

           紋理就是給物體表面新增圖片,色彩之類,可以認為是上色。            基本步驟: 開啟紋理開關建立紋理繫結紋理設定紋理引數生成紋理設定紋理頂點資料 具體看如下程式碼: @Override public void onSurfaceCrea

Android OpenGL ES 2.0繪圖:繪製紋理

http://mobile.51cto.com/aengine-437172.htm publicclass MyGLSurfaceView extends GLSurfaceView { public MyGLSurfaceView(Context context

Android OpenGL ES (二) 繪製三維/空間座標系

 * 此檔案是關於3D座標軸的繪製,用jiasu.java和jiasu.xml實現了使用者介面  * 關於3D處理的所有程式都在此檔案中  *zjk 2014/03/04  */ public class Jiasudu implements Renderer {float x=-0.5f,y=-0.5f,z

Android 系列 5.2使用OpenGL ES繪製旋轉立方體

5.2使用OpenGL ES繪製旋轉立方體 問題 您想建立一個基本的OpenGL ES應用程式。 解 建立一個GLSurfaceView和一個自定義渲染器,將繪製一個旋轉立方體。 討論 Android通過OpenGL ES API支援3D圖形,這是一種專為嵌入式裝置設計的O

Android OpenGL ES 開發:繪製圖形

# OpenGL 繪製圖形步驟 上一篇介紹了 OpenGL 的相關概念,今天來實際操作,使用 OpenGL 繪製出圖形,對其過程有一個初步的瞭解。 OpenGL 繪製圖形主要概括成以下幾個步驟: 1. 建立程式 2. 初始化著色器 3. 將著色器加入程式 4. 連結並使用程式 6. 繪製圖形 上述每個

Android OpenGL ES 入門系列(一) --- 了解OpenGL ES的前世今生

target 初始化 vertex 單獨 http hang tex 變化 3d圖 轉載請註明出處 本文出自Hansion的博客 OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三維圖形 API 的子集,

Unity3D UGUI Shader畫一個

end mas log AI IT targe nsf item form Shader "Unlit/NewUnlitShader" { Properties { _MainTex ("Texture", 2D) = "white" {}

CAD技巧-如何在CAD中繪制一個

a13 http 電腦桌面 工作 分享圖片 使用 process 官網 搜索 CAD技巧,如何在CAD中繪制一個圓環?在日常的工作中,在編輯CAD圖紙的時候,我們需要借助CAD編輯器中的許多圖形來編輯一張完整的CAD圖紙文件,以此來設計出我們滿意的圖紙,我們會使用到許多的圖

Android OpenGL ES 簡明開發教程一 概述

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android OpenGL ES 簡明開發教程二 構造OpenGL ES View

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!