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绘制螺旋线的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UIImagePickerControl
- 下一篇: Android Fragment功能的例