日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenGl绘制螺旋线

發布時間:2025/3/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenGl绘制螺旋线 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

/**
?* 緩沖區工具類
?*/
public class BufferUtil {
?/**
? * 將浮點數組轉換成字節緩沖區
? */
?public static ByteBuffer arr2ByteBuffer(float[] arr){
??ByteBuffer ibb = ByteBuffer.allocateDirect(arr.length * 4);
??ibb.order(ByteOrder.nativeOrder());
??FloatBuffer fbb = ibb.asFloatBuffer();
??fbb.put(arr);
??ibb.position(0);
??return ibb ;
?}
?
?/**
? * 將list轉換成字節緩沖區
? */
?public static ByteBuffer list2ByteBuffer(List<Float> list){
??ByteBuffer ibb = ByteBuffer.allocateDirect(list.size() * 4);
??ibb.order(ByteOrder.nativeOrder());
??FloatBuffer fbb = ibb.asFloatBuffer();
??for(Float f : list){
???fbb.put(f);
??}
??ibb.position(0);
??return ibb ;
?}
}

?

/** ?

* 渲染器

?*/

public abstract class AbstractMyRenderer implements android.opengl.GLSurfaceView.Renderer

{ ?

?private float ratio;??

??public float xrotate = 0f;//圍繞x軸旋轉角度

public float yrotate = 0f;//圍繞x軸旋轉角度 ?

?/**

? * 1.

? */ ?

public void onSurfaceCreated(GL10 gl, EGLConfig config)

{ ?

?//清平色 ?

?gl.glClearColor(0f, 0f, 0f, 1f); ??

//啟用頂點緩沖區數組

??gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); ?

}

/** ?

* 2.

? */

?public void onSurfaceChanged(GL10 gl, int width, int height) {

//設置視口

??gl.glViewport(0, 0, width, height); ??

ratio = (float)width / (float)height; ??

//投影矩陣 ?

?gl.glMatrixMode(GL10.GL_PROJECTION);

??//加載單位矩陣 ?

?gl.glLoadIdentity(); ?

?//設置平截頭體 ??

gl.glFrustumf(-ratio, ratio, -1, 1, 3f, 7f); ?}

/**

? * 3.

? */ ?

public abstract void onDrawFrame(GL10 gl);

}

/**

?* 線代,依次相連,不閉合

?*/

public class MyLineStripRenderer extends AbstractMyRenderer{

?public void onDrawFrame(GL10 gl) {

??//清除顏色緩沖區 ??

gl.glClear(GL10.GL_COLOR_BUFFER_BIT); ?

?//設置繪圖顏色 ??

gl.glColor4f(1f, 0f, 0f, 1f); ?? ??

//操作模型視圖矩陣

??gl.glMatrixMode(GL10.GL_MODELVIEW);

??gl.glLoadIdentity(); ??

//設置眼球的參數 ?

?GLU.gluLookAt(gl,0f,0f,5f, 0f, 0f, 0f, 0f,1f,0f);

?? ??//旋轉角度 ??

gl.glRotatef(xrotate, 1, 0, 0); ??

gl.glRotatef(yrotate, 0, 1, 0); ?? ?

?//計算點坐標 ??

float r = 0.5f ;//半徑 ??

List<Float> coordsList = new ArrayList<Float>(); ?

?float x = 0f,y = 0f,z = 1f ; ??

float zstep = 0.005f ; ??

for(float alpha = 0f ; alpha < Math.PI * 6 ; alpha = (float) (alpha + Math.PI / 32)){ ??

?x = (float) (r * Math.cos(alpha)); ???

y = (float) (r * Math.sin(alpha)); ???

z = z - zstep ; ???

coordsList.add(x); ???

coordsList.add(y); ???

coordsList.add(z); ?

?} ?? ??

//指定頂點指針 ??

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, BufferUtil.list2ByteBuffer(coordsList)); ??

gl.glDrawArrays(GL10.GL_LINE_STRIP, 0, coordsList.size() / 3);

?}

}

?

//主界面

public class MainActivity extends Activity {

???? private AbstractMyRenderer render;??

private MyGLSurfaceView view;

?public void onCreate(Bundle savedInstanceState) {

?super.onCreate(savedInstanceState); ???????

view = new GLSurfaceView(this); ???????

render = new MyLineStripRenderer(); ?????

?? view.setRenderer(render); ???????

//GLSurfaceView.RENDERMODE_CONTINUOUSLY:持續渲染(默認) ???????

//GLSurfaceView.RENDERMODE_WHEN_DIRTY:臟渲染,命令渲染 ???????

view.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); ???????

setContentView(view); ???

}

public boolean onKeyDown(int keyCode, KeyEvent event) {

float step = 5f ; ???

?//up ???

?if(keyCode == KeyEvent.KEYCODE_DPAD_UP){ ??? ??

render.xrotate = render.xrotate - step ; ???

?} ??? ?else if(keyCode == KeyEvent.KEYCODE_DPAD_DOWN){ ??? ?

?render.xrotate = render.xrotate + step ; ???

?} ??? ?else if(keyCode == KeyEvent.KEYCODE_DPAD_LEFT){ ??? ??

render.yrotate = render.yrotate + step ; ???

?} ??? ?else if(keyCode == KeyEvent.KEYCODE_DPAD_RIGHT){ ??? ??

render.yrotate = render.yrotate - step ; ??? ?

} ??? ?

//請求渲染,和臟渲染配合使用 ??? ?

view.requestRender(); ???

?return super.onKeyDown(keyCode, event); ???

}

}

轉載于:https://www.cnblogs.com/danmao/p/3817396.html

總結

以上是生活随笔為你收集整理的OpenGl绘制螺旋线的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。