`
lyunabc
  • 浏览: 558832 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

Android OpenGL ES 开发教程(19):绘制迷你太阳系

 
阅读更多

前面介绍了3D坐标系统和3D坐标变换以及在OpenGL ES中坐标变换的过程,并与相机拍照片的过程做类比,以便更好的理解这OpenGL中构造3D模型的一部步骤:

本例提供绘制一个迷你太阳系系统作为前面知识的总结,这个迷你太阳系,有一个红色的太阳,一个蓝色的地图和一个白色的月亮构成:

  • 太阳居中,逆时针自转。
  • 地球绕太阳顺时针公转,本身不自转。
  • 月亮绕地球顺时针公转,自身逆时针自转。

为简单起见,使用一个2D五角星做为天体而没有使用球体(绘制球体在后面有介绍),构造一个Star类:

public class Star {
 // Our vertices.
 protected float vertices[];
 
 // Our vertex buffer.
 protected FloatBuffer vertexBuffer;
 
 public Star() {
 
 float a=(float)(1.0f/(2.0f-2f*Math.cos(72f*Math.PI/180.f)));
 float bx=(float)(a*Math.cos(18*Math.PI/180.0f));
 float by=(float)(a*Math.sin(18*Math.PI/180f));
 float cy=(float)(-a * Math.cos(18*Math.PI/180f));
 vertices=new float[]{
 0,a,0.5f,cy,-bx,by,bx,by,-0.5f,cy
 };
 
 ByteBuffer vbb
 = ByteBuffer.allocateDirect(vertices.length * 4);
 vbb.order(ByteOrder.nativeOrder());
 vertexBuffer = vbb.asFloatBuffer();
 vertexBuffer.put(vertices);
 vertexBuffer.position(0);
 
 }
 
 /**
 * This function draws our star on screen.
 * @param gl
 */
 public void draw(GL10 gl) {
 // Counter-clockwise winding.
 gl.glFrontFace(GL10.GL_CCW);
 // Enable face culling.
 gl.glEnable(GL10.GL_CULL_FACE);
 // What faces to remove with the face culling.
 gl.glCullFace(GL10.GL_BACK);
 
 // Enabled the vertices buffer for writing
 //and to be used during
 // rendering.
 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
 // Specifies the location and data format of
 //an array of vertex
 // coordinates to use when rendering.
 gl.glVertexPointer(2, GL10.GL_FLOAT, 0,
 vertexBuffer);
 
 gl.glDrawArrays(GL10.GL_LINE_LOOP, 0,5);
 
 // Disable the vertices buffer.
 gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
 // Disable face culling.
 gl.glDisable(GL10.GL_CULL_FACE);
 }
 
}

Star定义了五角星的五个顶点,并使用glDrawArrays 来绘制五角星,因此vertices 顶点的顺序比较重要。

然后定义一个DrawSolarSystem 来绘制这个迷你太阳系:

public class DrawSolarSystem extends OpenGLESActivity
 implements IOpenGLDemo{
 
 private Star sun=new Star();
 private Star earth=new Star();
 private Star moon=new Star();
 
 private int angle=0;
 
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 
 }
 
 public void DrawScene(GL10 gl) {
 super.DrawScene(gl);
 gl.glLoadIdentity();
 GLU.gluLookAt(gl,0.0f, 0.0f, 15.0f,
 0.0f, 0.0f, 0.0f,
 0.0f, 1.0f, 0.0f);
 // Star A
 // Save the current matrix.
 gl.glPushMatrix();
 // Rotate Star A counter-clockwise.
 gl.glRotatef(angle, 0, 0, 1);
 gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
 // Draw Star A.
 sun.draw(gl);
 // Restore the last matrix.
 gl.glPopMatrix();
 // Star B
 // Save the current matrix
 gl.glPushMatrix();
 // Rotate Star B before moving it,
 //making it rotate around A.
 gl.glRotatef(-angle, 0, 0, 1);
 // Move Star B.
 gl.glTranslatef(3, 0, 0);
 // Scale it to 50% of Star A
 gl.glScalef(.5f, .5f, .5f);
 gl.glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
 // Draw Star B.
 earth.draw(gl);
 // Star C
 // Save the current matrix
 gl.glPushMatrix();
 // Make the rotation around B
 gl.glRotatef(-angle, 0, 0, 1);
 gl.glTranslatef(2, 0, 0);
 // Scale it to 50% of Star B
 gl.glScalef(.5f, .5f, .5f);
 // Rotate around it's own center.
 gl.glRotatef(angle*10, 0, 0, 1);
 gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
 // Draw Star C.
 moon.draw(gl);
 // Restore to the matrix as it was before C.
 gl.glPopMatrix();
 // Restore to the matrix as it was before B.
 gl.glPopMatrix();
 // Increse the angle.
 angle++;
 
 }
 
}

使用GLU的gluLookAt 来定义modelview Matrix ,把相机放在正对太阳中心(0,0,0),距离15 (0,0,15)。

使用glPushMatrix和glPopMatrix 来将当前Matrix入栈或是出栈。

首先将当前matrix 入栈,以红色绘制太阳,并逆向转动,将当前matrix 入栈的目的是在能够在绘制地球时恢复当前栈。

然后绘制地球,使用局部坐标系来想象地球和太阳之间的相对运动,地球离开一距离绕太阳公转,相当于先旋转地球的局部坐标系,然后再平移地球的局部坐标系。对应到代码为先glRotatef ,然后glTranslate.

最后是绘制月亮,使用类似的空间想象方法。

本例下载

分享到:
评论

相关推荐

    Android OpenGL ES 简明开发教程

    ### Android OpenGL ES 开发教程详解 #### 概述与历史沿革 OpenGL ES(OpenGL for Embedded Systems)作为OpenGL API的子集,专为移动设备、PDA和游戏主机等嵌入式系统设计,旨在简化3D图形应用的开发流程。自2003...

    Android OpenGL ES 简明开发教程四:3D 坐标变换

    在Android平台进行3D图形开发时,OpenGL ES(Open Graphics Library for Embedded Systems)是一项关键的技术。它允许开发者在移动设备上创建复杂的3D图形和动画。在OpenGL ES的环境中,3D坐标变换是构建和操作3D...

    Android OpenGL ES 绘制三维/空间坐标系透明

    在这个主题中,我们主要关注如何在Android平台上使用OpenGL ES绘制一个透明的三维/空间坐标系。这个过程涉及到几个关键的概念和技术。 首先,我们要理解OpenGL ES中的坐标系。OpenGL ES采用右手坐标系,其中X轴正...

    OpenGL ES应用开发实践指南 Android卷

    由资深Android开发专家根据OpenGLES2.0版本撰写,不仅系统地讲解了OpenGLES的核心概念、技术,以及Android的图形机制,还通过大量案例讲解了在Android上进行OpenGLES开发的方法和技巧。  《OpenGL ES应用开发实践...

    Android平台 OpenGL ES3.0绘制点、线、三角形实现源码

    Android平台,OpenGL ES3.0 点、线、三角形绘制方式源码实现举例。 相关绘制方式文章讲解请参考: https://xiaxl.blog.csdn.net/article/details/8873002

    Android OpenGL ES 简明开发教程相关源码真正的3D图形

    Android OpenGL ES 简明开发真正的3D图 ...Android平台提供的OpenGL ES API主要定义在包android.opengl ,javax.microedition.khronos.egl ,javax.microedition.khronos.opengles ,java.nio 等几个包中

    Android OpenGl ES绘制圆点与优化圆点锯齿

    在Android平台上,OpenGL ES是一种广泛使用的图形库,用于在移动设备上实现高性能的2D和3D图形渲染。本文将深入探讨如何使用OpenGL ES来绘制圆点,并介绍一种方法来优化圆点边缘的锯齿问题,提升视觉效果。 首先,...

    Android开发之OpenGL ES教程

    在Android上设置OpenGL ES视图是开发过程中的第一步,而`GLSurfaceView`是实现这一目标的关键组件。`GLSurfaceView`是Android 1.5引入的一个API类,它为OpenGL ES应用提供了基础框架和生命周期管理。以下是你需要...

    Android OpenGL ES 2.0学习书籍.rar

    最后,了解如何与硬件加速的OpenGLES API交互,以及熟悉GLSL语言(OpenGL Shading Language),是成为OpenGL ES 2.0专家的必经之路。通过编写高效、可读性强的着色器代码,可以创造出各种复杂的视觉效果,实现令人...

    android OpenGL ES 地球仪绘制——球体绘制及纹理映射——源码

    在Android上实现地球仪的绘制,通常涉及到OpenGL ES的几个关键概念和技术,包括基本几何形状的构建、纹理映射以及触摸事件处理。下面我们将详细探讨这些知识点。 1. **OpenGL ES 绘制三角形拼成球体** - 在3D空间...

    Android OpenGL ES 绘制立方体 球体 圆柱 等几何形状

    总的来说,这个项目涉及了Android开发中的3D图形编程,通过OpenGL ES绘制不同类型的几何形状,每个形状作为一个独立的类实现,而renderer类则负责把这些形状渲染到屏幕上,创造出丰富的3D视觉效果。理解并掌握这些...

    Android OpenGL入门示例:绘制三角形和正方形

    通常,这可以通过在build.gradle文件中引入`implementation 'androidx.opengles:opengl-es-utils:1.0.0'`来完成。确保你的项目支持JNI(Java Native Interface),因为OpenGL ES是C/C++接口,需要通过JNI桥接。 接...

    OpenGL ES应用开发实践指南(Android卷).pdf

    由资深Android开发专家根据OpenGLES2.0版本撰写,不仅系统地讲解了OpenGLES的核心概念、技术,以及Android的图形机制,还通过大量案例讲解了在Android上进行OpenGLES开发的方法和技巧。  《OpenGL ES应用开发实践...

    Android 3D游戏开发技术宝典:OpenGL ES 2.0 源代码.7z

    如题,Android 3D游戏开发技术宝典:OpenGL ES 2.0书中的全部源代码。该书由浅入深的讲解了OpenGL ES 2.0在3D游戏开发中的各个方面,还给出了BN赛艇、火力篮球、夜鹰行动三个经典游戏的全部源代码。

    OpenGL ES 2 for Android A Quick-Start Guide

    《OpenGL ES 2 for Android: A Quick-Start Guide》是一本专为Android开发者设计的实用指南,旨在帮助读者快速掌握OpenGL ES 2的核心概念和技术,并应用于Android应用开发中。本书通过丰富的示例代码和清晰易懂的...

    Android OpenGL ES 简明开发教程相关源码添加颜色

    Android OpenGL ES 简明开发教程相关源码添加颜色 简单的上色方法叫做顶点着色(Vertxt coloring),可以使用单色,也可以定义颜色渐变或者使用材质(类同于二维图形中各种Brush类型)。

    Android OpenGL ES 简明开发教程相关源码材质渲染

    这个“Android OpenGL ES 简明开发教程相关源码材质渲染”旨在教授如何在Android应用中利用OpenGL ES进行材质渲染,从而创建出丰富的视觉效果。 材质渲染是OpenGL ES中的关键概念,它涉及到物体表面的外观属性,如...

Global site tag (gtag.js) - Google Analytics