- 浏览: 42736 次
- 性别:
- 来自: 北京
最新评论
-
guanggsanguo:
运行了,很牛的场景!
97年世界编程大赛第一名写的程序 -
public_private:
发几张效果图就更好啦
3D桌面效果动画类 -
dianqijiaojian:
嘻嘻我是第一个。。。
使用Memory Analyzer tool(MAT)分析内存泄漏(二) -
huchunming2010:
deltaAnchorPosition这个变量作用?OnFee ...
Gallery3D中画图时调用glTranslate函数参数赋值过程 -
zhaoyu_h:
...
Android学习笔记
JOGL 3D空间
我们使用三角形和四边形来创建3D物体,在这一课里我们将把三角形变成三菱锥也就是金字塔的形状,将四边形变成立方体。在上一节课的内容上做一些扩展,我们开始生成真正的3D物体,而不是前面几节课中的三维空间中的二维物体,我们给三角形增加一个左侧面,一个右侧面,一个后侧面来生成一个金字塔。给正方体添加左右上下后五个面。在金字塔中我们使用平滑着色(Smooth coloring) ,而正方体我们使用单一着色(flat coloring)进行渲染只是立方体的各个平面使用不通的颜色而已。
下面我们查看实现代码
- package demos.nehe.lesson05;
- /*
- * Lesson05.java
- *
- * Created on July 15, 2003, 11:30 AM
- */
- import javax.media.opengl.GL;
- import javax.media.opengl.GL2;
- import javax.media.opengl.GLAutoDrawable;
- import javax.media.opengl.GLEventListener;
- import javax.media.opengl.glu.GLU;
- /** Port of the NeHe OpenGL Tutorial (Lesson 5)
- * to Java using the Jogl interface to OpenGL. Jogl can be obtained
- * at http://jogl.dev.java.net/
- *
- * @author Kevin Duling (jattier@hotmail.com)
- */
- class Renderer implements GLEventListener {
- //设置立方体的旋转控制变量
- private float rquad = 0.0f;
- //设置三菱椎的旋转控制变量
- private float rtri = 0.0f;
- //OpenGL绘制工具包类
- private GLU glu = new GLU();
- /** Called by the drawable to initiate OpenGL rendering by the client.
- * After all GLEventListeners have been notified of a display event, the
- * drawable will swap its buffers if necessary.
- * @param glDrawable The GLAutoDrawable object.
- */
- public void display(GLAutoDrawable glDrawable) {
- //获取OpenGL操作对象
- final GL2 gl = glDrawable.getGL().getGL2();
- //清理屏幕和深度缓存
- gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
- //重置模型观察矩阵
- gl.glLoadIdentity();
- //将绘制中心左移1.5个单位,向屏幕里移入6个单位
- gl.glTranslatef(-1.5f, 0.0f, -6.0f);
- //设置旋转轴,以Y轴为旋转轴旋转rtri度
- gl.glRotatef(rtri, 0.0f, 1.0f, 0.0f);
- /**
- * 下面的代码创建一个绕者其中心轴旋转的金字塔。
- * 金字塔的上顶点高出原点一个单位,底面中心低于原点一个单位。
- * 上顶点在底面的投影位于底面的中心.
- * 注意所有的面-三角形都是逆时针次序绘制的。
- * 这点十分重要,在以后的课程中我会作出解释。
- * 现在,您只需明白要么都逆时针,要么都顺时针,
- * 但永远不要将两种次序混在一起,除非您有足够的理由必须这么做。
- * 下面我们开始绘制金字塔的各个面
- */
- gl.glBegin(GL2.GL_TRIANGLES); // Drawing Using Triangles
- /**
- * 开始绘制金字塔的的前侧面
- */
- //设置当前的颜色为红色,设置前侧面的上顶点
- gl.glColor3f(1.0f, 0.0f, 0.0f);
- gl.glVertex3f(0.0f, 1.0f, 0.0f);
- //设置当前的颜色为绿色,设置这个前侧面的左顶点
- gl.glColor3f(0.0f, 1.0f, 0.0f);
- gl.glVertex3f(-1.0f, -1.0f, 1.0f);
- //设置当前的颜色为蓝色,设置前侧面的右顶点
- gl.glColor3f(0.0f, 0.0f, 1.0f);
- gl.glVertex3f(1.0f, -1.0f, 1.0f);
- /**
- * 绘制金字塔的右侧面
- * 设置渲染颜色为红色,当前的点为右侧面的上顶点
- */
- gl.glColor3f(1.0f, 0.0f, 0.0f);
- gl.glVertex3f(0.0f, 1.0f, 0.0f);
- //设置当前的颜色为蓝色,当前的点为右侧面的左顶点
- gl.glColor3f(0.0f, 0.0f, 1.0f);
- gl.glVertex3f(1.0f, -1.0f, 1.0f);
- //设置当前的颜色为绿色,当前的点位右侧面右顶点
- gl.glColor3f(0.0f, 1.0f, 0.0f);
- gl.glVertex3f(1.0f, -1.0f, -1.0f);
- /**
- * 绘制金字塔的背面
- * 设置当前渲染颜色为红色,当前的点位背面的上顶点
- */
- gl.glColor3f(1.0f, 0.0f, 0.0f);
- gl.glVertex3f(0.0f, 1.0f, 0.0f);
- //设置当前的颜色为绿色,当前的点为背面的左顶点
- gl.glColor3f(0.0f, 1.0f, 0.0f);
- gl.glVertex3f(1.0f, -1.0f, -1.0f);
- //设置当前的颜色为蓝色,当前的点为背面的右顶点
- gl.glColor3f(0.0f, 0.0f, 1.0f);
- gl.glVertex3f(-1.0f, -1.0f, -1.0f);
- /**
- * 绘制金字塔的左侧面
- * 设置颜色为红色,设置左侧面的上顶点
- */
- gl.glColor3f(1.0f, 0.0f, 0.0f);
- gl.glVertex3f(0.0f, 1.0f, 0.0f);
- //设置颜色为蓝色,设置左侧面的左顶点
- gl.glColor3f(0.0f, 0.0f, 1.0f);
- gl.glVertex3f(-1.0f, -1.0f, -1.0f);
- //设置颜色为绿色,设置左侧面的右顶点
- gl.glColor3f(0.0f, 1.0f, 0.0f);
- gl.glVertex3f(-1.0f, -1.0f, 1.0f);
- //完成金字塔的绘制
- gl.glEnd();
- //重置模型观察矩阵
- gl.glLoadIdentity();
- //将绘制中心从当前的的位置右移1.5个单位,移入屏幕6个单位
- gl.glTranslatef(1.5f, 0.0f, -6.0f);
- //设置立方体围绕轴坐标为(1.0 , 1.0 , 1.0)以rquad的角度旋转
- gl.glRotatef(rquad, 1.0f, 1.0f, 1.0f);
- //开始绘制立方体
- gl.glBegin(GL2.GL_QUADS);
- //开始绘制立方体体的各个面
- //绘制立方体的顶面,设置颜色为绿色
- gl.glColor3f(0.0f, 1.0f, 0.0f);
- gl.glVertex3f(1.0f, 1.0f, -1.0f); // 四边形的右上顶点 (顶面)
- gl.glVertex3f(-1.0f, 1.0f, -1.0f);// 四边形的左上顶点 (顶面)
- gl.glVertex3f(-1.0f, 1.0f, 1.0f);// 四边形的左下顶点 (顶面)
- gl.glVertex3f(1.0f, 1.0f, 1.0f);// 四边形的右下顶点 (顶面)
- //绘制立方体的底面,设置颜色为橙色
- gl.glColor3f(1.0f, 0.5f, 0.0f);
- gl.glVertex3f(1.0f, -1.0f, 1.0f);// 四边形的右上顶点(底面)
- gl.glVertex3f(-1.0f, -1.0f, 1.0f);// 四边形的左上顶点(底面)
- gl.glVertex3f(-1.0f, -1.0f, -1.0f);// 四边形的左下顶点(底面)
- gl.glVertex3f(1.0f, -1.0f, -1.0f);// 四边形的右下顶点(底面)
- //绘制立方体的前面, 颜色改成红色
- gl.glColor3f(1.0f, 0.0f, 0.0f);
- gl.glVertex3f(1.0f, 1.0f, 1.0f);// 四边形的右上顶点(前面)
- gl.glVertex3f(-1.0f, 1.0f, 1.0f);// 四边形的左上顶点(前面)
- gl.glVertex3f(-1.0f, -1.0f, 1.0f);// 四边形的左下顶点(前面)
- gl.glVertex3f(1.0f, -1.0f, 1.0f);// 四边形的右下顶点(前面)
- //绘制立方体的后面,设置颜色为黄色
- gl.glColor3f(1.0f, 1.0f, 0.0f);
- gl.glVertex3f(1.0f, -1.0f, -1.0f);// 四边形的右上顶点(后面)
- gl.glVertex3f(-1.0f, -1.0f, -1.0f);// 四边形的左上顶点(后面)
- gl.glVertex3f(-1.0f, 1.0f, -1.0f);// 四边形的左下顶点(后面)
- gl.glVertex3f(1.0f, 1.0f, -1.0f);// 四边形的右下顶点(后面)
- gl.glColor3f(0.0f, 0.0f, 1.0f); // 颜色改成蓝色
- gl.glVertex3f(-1.0f, 1.0f, 1.0f);// 四边形的右上顶点(左面)
- gl.glVertex3f(-1.0f, 1.0f, -1.0f);// 四边形的左上顶点(左面)
- gl.glVertex3f(-1.0f, -1.0f, -1.0f);// 四边形的左下顶点(左面)
- gl.glVertex3f(-1.0f, -1.0f, 1.0f);// 四边形的右下顶点(左面)
- gl.glColor3f(1.0f, 0.0f, 1.0f); // 颜色改成紫罗兰色
- gl.glVertex3f(1.0f, 1.0f, -1.0f);// 四边形的右上顶点(右面)
- gl.glVertex3f(1.0f, 1.0f, 1.0f);// 四边形的左上顶点(右面)
- gl.glVertex3f(1.0f, -1.0f, 1.0f);// 四边形的左下顶点(右面)
- gl.glVertex3f(1.0f, -1.0f, -1.0f);// 四边形的右下顶点(右面)
- gl.glEnd(); // Done Drawing The Quad
- gl.glFlush();
- rtri += 0.2f;// 增加金字塔的旋转变量
- rquad += 0.15f;// 增加立方体的旋转变量
- }
- /** Called when the display mode has been changed. <B>!! CURRENTLY UNIMPLEMENTED IN JOGL !!</B>
- * @param glDrawable The GLAutoDrawable object.
- * @param modeChanged Indicates if the video mode has changed.
- * @param deviceChanged Indicates if the video device has changed.
- */
- public void displayChanged(GLAutoDrawable glDrawable, boolean modeChanged, boolean deviceChanged) {
- }
- /** Called by the drawable immediately after the OpenGL context is
- * initialized for the first time. Can be used to perform one-time OpenGL
- * initialization such as setup of lights and display lists.
- * @param glDrawable The GLAutoDrawable object.
- */
- public void init(GLAutoDrawable glDrawable) {
- //获取GL对象
- GL2 gl = glDrawable.getGL().getGL2();
- //启用阴影平滑
- gl.glShadeModel(GL2.GL_SMOOTH);
- //设置背景颜色为黑色
- gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
- //设置深度缓存
- gl.glClearDepth(1.0f);
- //启用深度测试
- gl.glEnable(GL.GL_DEPTH_TEST);
- //所作的深度测试的类型
- gl.glDepthFunc(GL.GL_LEQUAL);
- // 告诉系统对透视进行修正
- gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST); // Really Nice Perspective Calculations
- }
- /** Called by the drawable during the first repaint after the component has
- * been resized. The client can update the viewport and view volume of the
- * window appropriately, for example by a call to
- * GL.glViewport(int, int, int, int); note that for convenience the component
- * has already called GL.glViewport(int, int, int, int)(x, y, width, height)
- * when this method is called, so the client may not have to do anything in
- * this method.
- * @param glDrawable The GLAutoDrawable object.
- * @param x The X Coordinate of the viewport rectangle.
- * @param y The Y coordinate of the viewport rectanble.
- * @param width The new width of the window.
- * @param height The new height of the window.
- */
- public void reshape(GLAutoDrawable glDrawable, int x, int y, int width, int height) {
- final GLU glu = new GLU();
- final GL2 gl = glDrawable.getGL().getGL2();
- //防止被零除
- if (height <= 0) // avoid a divide by zero error!
- height = 1;
- final float h = (float) width / (float) height;
- //设置视窗的大小
- gl.glViewport(0, 0, width, height);
- //选择投影矩阵 ,投影矩阵负责为我们的场景增加透视。
- gl.glMatrixMode(GL2.GL_PROJECTION);
- //重置投影矩阵;
- gl.glLoadIdentity();
- //设置视口的大小
- glu.gluPerspective(45.0f, h, 1.0, 20.0);
- //启用模型观察矩阵;模型观察矩阵中存放了我们的物体讯息。
- gl.glMatrixMode(GL2.GL_MODELVIEW);
- gl.glLoadIdentity();
- }
- public void dispose(GLAutoDrawable arg0) {
- throw new UnsupportedOperationException("Not supported yet.");
- }
- }
package demos.nehe.lesson05; /* * Lesson05.java * * Created on July 15, 2003, 11:30 AM */ import javax.media.opengl.GL; import javax.media.opengl.GL2; import javax.media.opengl.GLAutoDrawable; import javax.media.opengl.GLEventListener; import javax.media.opengl.glu.GLU; /** Port of the NeHe OpenGL Tutorial (Lesson 5) * to Java using the Jogl interface to OpenGL. Jogl can be obtained * at http://jogl.dev.java.net/ * * @author Kevin Duling (jattier@hotmail.com) */ class Renderer implements GLEventListener { //设置立方体的旋转控制变量 private float rquad = 0.0f; //设置三菱椎的旋转控制变量 private float rtri = 0.0f; //OpenGL绘制工具包类 private GLU glu = new GLU(); /** Called by the drawable to initiate OpenGL rendering by the client. * After all GLEventListeners have been notified of a display event, the * drawable will swap its buffers if necessary. * @param glDrawable The GLAutoDrawable object. */ public void display(GLAutoDrawable glDrawable) { //获取OpenGL操作对象 final GL2 gl = glDrawable.getGL().getGL2(); //清理屏幕和深度缓存 gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); //重置模型观察矩阵 gl.glLoadIdentity(); //将绘制中心左移1.5个单位,向屏幕里移入6个单位 gl.glTranslatef(-1.5f, 0.0f, -6.0f); //设置旋转轴,以Y轴为旋转轴旋转rtri度 gl.glRotatef(rtri, 0.0f, 1.0f, 0.0f); /** * 下面的代码创建一个绕者其中心轴旋转的金字塔。 * 金字塔的上顶点高出原点一个单位,底面中心低于原点一个单位。 * 上顶点在底面的投影位于底面的中心. * 注意所有的面-三角形都是逆时针次序绘制的。 * 这点十分重要,在以后的课程中我会作出解释。 * 现在,您只需明白要么都逆时针,要么都顺时针, * 但永远不要将两种次序混在一起,除非您有足够的理由必须这么做。 * 下面我们开始绘制金字塔的各个面 */ gl.glBegin(GL2.GL_TRIANGLES); // Drawing Using Triangles /** * 开始绘制金字塔的的前侧面 */ //设置当前的颜色为红色,设置前侧面的上顶点 gl.glColor3f(1.0f, 0.0f, 0.0f); gl.glVertex3f(0.0f, 1.0f, 0.0f); //设置当前的颜色为绿色,设置这个前侧面的左顶点 gl.glColor3f(0.0f, 1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f); //设置当前的颜色为蓝色,设置前侧面的右顶点 gl.glColor3f(0.0f, 0.0f, 1.0f); gl.glVertex3f(1.0f, -1.0f, 1.0f); /** * 绘制金字塔的右侧面 * 设置渲染颜色为红色,当前的点为右侧面的上顶点 */ gl.glColor3f(1.0f, 0.0f, 0.0f); gl.glVertex3f(0.0f, 1.0f, 0.0f); //设置当前的颜色为蓝色,当前的点为右侧面的左顶点 gl.glColor3f(0.0f, 0.0f, 1.0f); gl.glVertex3f(1.0f, -1.0f, 1.0f); //设置当前的颜色为绿色,当前的点位右侧面右顶点 gl.glColor3f(0.0f, 1.0f, 0.0f); gl.glVertex3f(1.0f, -1.0f, -1.0f); /** * 绘制金字塔的背面 * 设置当前渲染颜色为红色,当前的点位背面的上顶点 */ gl.glColor3f(1.0f, 0.0f, 0.0f); gl.glVertex3f(0.0f, 1.0f, 0.0f); //设置当前的颜色为绿色,当前的点为背面的左顶点 gl.glColor3f(0.0f, 1.0f, 0.0f); gl.glVertex3f(1.0f, -1.0f, -1.0f); //设置当前的颜色为蓝色,当前的点为背面的右顶点 gl.glColor3f(0.0f, 0.0f, 1.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f); /** * 绘制金字塔的左侧面 * 设置颜色为红色,设置左侧面的上顶点 */ gl.glColor3f(1.0f, 0.0f, 0.0f); gl.glVertex3f(0.0f, 1.0f, 0.0f); //设置颜色为蓝色,设置左侧面的左顶点 gl.glColor3f(0.0f, 0.0f, 1.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f); //设置颜色为绿色,设置左侧面的右顶点 gl.glColor3f(0.0f, 1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f); //完成金字塔的绘制 gl.glEnd(); //重置模型观察矩阵 gl.glLoadIdentity(); //将绘制中心从当前的的位置右移1.5个单位,移入屏幕6个单位 gl.glTranslatef(1.5f, 0.0f, -6.0f); //设置立方体围绕轴坐标为(1.0 , 1.0 , 1.0)以rquad的角度旋转 gl.glRotatef(rquad, 1.0f, 1.0f, 1.0f); //开始绘制立方体 gl.glBegin(GL2.GL_QUADS); //开始绘制立方体体的各个面 //绘制立方体的顶面,设置颜色为绿色 gl.glColor3f(0.0f, 1.0f, 0.0f); gl.glVertex3f(1.0f, 1.0f, -1.0f); // 四边形的右上顶点 (顶面) gl.glVertex3f(-1.0f, 1.0f, -1.0f);// 四边形的左上顶点 (顶面) gl.glVertex3f(-1.0f, 1.0f, 1.0f);// 四边形的左下顶点 (顶面) gl.glVertex3f(1.0f, 1.0f, 1.0f);// 四边形的右下顶点 (顶面) //绘制立方体的底面,设置颜色为橙色 gl.glColor3f(1.0f, 0.5f, 0.0f); gl.glVertex3f(1.0f, -1.0f, 1.0f);// 四边形的右上顶点(底面) gl.glVertex3f(-1.0f, -1.0f, 1.0f);// 四边形的左上顶点(底面) gl.glVertex3f(-1.0f, -1.0f, -1.0f);// 四边形的左下顶点(底面) gl.glVertex3f(1.0f, -1.0f, -1.0f);// 四边形的右下顶点(底面) //绘制立方体的前面, 颜色改成红色 gl.glColor3f(1.0f, 0.0f, 0.0f); gl.glVertex3f(1.0f, 1.0f, 1.0f);// 四边形的右上顶点(前面) gl.glVertex3f(-1.0f, 1.0f, 1.0f);// 四边形的左上顶点(前面) gl.glVertex3f(-1.0f, -1.0f, 1.0f);// 四边形的左下顶点(前面) gl.glVertex3f(1.0f, -1.0f, 1.0f);// 四边形的右下顶点(前面) //绘制立方体的后面,设置颜色为黄色 gl.glColor3f(1.0f, 1.0f, 0.0f); gl.glVertex3f(1.0f, -1.0f, -1.0f);// 四边形的右上顶点(后面) gl.glVertex3f(-1.0f, -1.0f, -1.0f);// 四边形的左上顶点(后面) gl.glVertex3f(-1.0f, 1.0f, -1.0f);// 四边形的左下顶点(后面) gl.glVertex3f(1.0f, 1.0f, -1.0f);// 四边形的右下顶点(后面) gl.glColor3f(0.0f, 0.0f, 1.0f); // 颜色改成蓝色 gl.glVertex3f(-1.0f, 1.0f, 1.0f);// 四边形的右上顶点(左面) gl.glVertex3f(-1.0f, 1.0f, -1.0f);// 四边形的左上顶点(左面) gl.glVertex3f(-1.0f, -1.0f, -1.0f);// 四边形的左下顶点(左面) gl.glVertex3f(-1.0f, -1.0f, 1.0f);// 四边形的右下顶点(左面) gl.glColor3f(1.0f, 0.0f, 1.0f); // 颜色改成紫罗兰色 gl.glVertex3f(1.0f, 1.0f, -1.0f);// 四边形的右上顶点(右面) gl.glVertex3f(1.0f, 1.0f, 1.0f);// 四边形的左上顶点(右面) gl.glVertex3f(1.0f, -1.0f, 1.0f);// 四边形的左下顶点(右面) gl.glVertex3f(1.0f, -1.0f, -1.0f);// 四边形的右下顶点(右面) gl.glEnd(); // Done Drawing The Quad gl.glFlush(); rtri += 0.2f;// 增加金字塔的旋转变量 rquad += 0.15f;// 增加立方体的旋转变量 } /** Called when the display mode has been changed. <B>!! CURRENTLY UNIMPLEMENTED IN JOGL !!</B> * @param glDrawable The GLAutoDrawable object. * @param modeChanged Indicates if the video mode has changed. * @param deviceChanged Indicates if the video device has changed. */ public void displayChanged(GLAutoDrawable glDrawable, boolean modeChanged, boolean deviceChanged) { } /** Called by the drawable immediately after the OpenGL context is * initialized for the first time. Can be used to perform one-time OpenGL * initialization such as setup of lights and display lists. * @param glDrawable The GLAutoDrawable object. */ public void init(GLAutoDrawable glDrawable) { //获取GL对象 GL2 gl = glDrawable.getGL().getGL2(); //启用阴影平滑 gl.glShadeModel(GL2.GL_SMOOTH); //设置背景颜色为黑色 gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f); //设置深度缓存 gl.glClearDepth(1.0f); //启用深度测试 gl.glEnable(GL.GL_DEPTH_TEST); //所作的深度测试的类型 gl.glDepthFunc(GL.GL_LEQUAL); // 告诉系统对透视进行修正 gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST); // Really Nice Perspective Calculations } /** Called by the drawable during the first repaint after the component has * been resized. The client can update the viewport and view volume of the * window appropriately, for example by a call to * GL.glViewport(int, int, int, int); note that for convenience the component * has already called GL.glViewport(int, int, int, int)(x, y, width, height) * when this method is called, so the client may not have to do anything in * this method. * @param glDrawable The GLAutoDrawable object. * @param x The X Coordinate of the viewport rectangle. * @param y The Y coordinate of the viewport rectanble. * @param width The new width of the window. * @param height The new height of the window. */ public void reshape(GLAutoDrawable glDrawable, int x, int y, int width, int height) { final GLU glu = new GLU(); final GL2 gl = glDrawable.getGL().getGL2(); //防止被零除 if (height <= 0) // avoid a divide by zero error! height = 1; final float h = (float) width / (float) height; //设置视窗的大小 gl.glViewport(0, 0, width, height); //选择投影矩阵 ,投影矩阵负责为我们的场景增加透视。 gl.glMatrixMode(GL2.GL_PROJECTION); //重置投影矩阵; gl.glLoadIdentity(); //设置视口的大小 glu.gluPerspective(45.0f, h, 1.0, 20.0); //启用模型观察矩阵;模型观察矩阵中存放了我们的物体讯息。 gl.glMatrixMode(GL2.GL_MODELVIEW); gl.glLoadIdentity(); } public void dispose(GLAutoDrawable arg0) { throw new UnsupportedOperationException("Not supported yet."); } }
程序运行的主类
- package demos.nehe.lesson05;
- import demos.common.GLDisplay;
- /**
- * @author Kevin J. Duling
- */
- public class Lesson05 {
- public static void main(String[] args) {
- GLDisplay neheGLDisplay = GLDisplay.createGLDisplay("Lesson 05: 3D 空间");
- neheGLDisplay.addGLEventListener(new Renderer());
- neheGLDisplay.start();
- }
- }
相关推荐
### 三维图形编程基础——使用JOGL与Java3D #### 一、概述 《三维图形编程基础——使用JOGL与Java3D》是一本专为计算机科学领域内的学生、科学家及工程师编写的书籍,主要介绍了如何利用JOGL(Java Binding for ...
这个教学案例可能还涵盖了如何加载模型,设置光源,以及如何在3D空间中定位和旋转物体等基本3D图形操作。同时,通过分析`NEHE_第十二课_测试(十四)_.rar`这个资源,我们可以进一步了解NEHE教程中的相关实践,这个...
在探讨《JOGL学习PDF2》中所提及的“JOGL2:Touring the World”这一主题时,我们深入剖析了Java编程环境下的OpenGL(JOGL)应用,通过构建一个小型的3D世界,展示了一系列高级渲染技术和游戏开发技巧。本章重点介绍...
视口决定了3D图形在2D屏幕上的显示区域,而投影则控制了3D空间到2D视图的映射方式,如正交投影和透视投影。 绘制长方体的关键在于定义其顶点。长方体有六个面,每个面由两个三角形组成。我们需要为每个顶点指定坐标...
这些坐标与3D空间中的位置坐标分开处理。 6. **JOGL中的纹理操作**:在JOGL中,可以使用`GLTexture`类来创建和管理纹理对象。这包括加载图像文件、设置过滤模式(如线性过滤或最近点过滤)、调整纹理参数以及绑定和...
在本项目中,我们探讨的是如何利用JOGL实现透视投影和正交投影,这两种在3D图形渲染中常见的投影方式。 透视投影是模拟真实世界中物体离观察者越远显得越小的效果,是我们在日常生活中看到的自然景象。它基于几何...
通过JOGL,开发人员可以创建高性能的2D和3D图形应用程序,并且能够跨平台运行。 本篇文档主要介绍了基于JOGL的应用——Tour Models GL,这是一个集成了多种高级功能的游戏场景展示程序。它不仅展示了如何加载和定位...
学习3D图形编程,需要理解基本的数学概念,如向量、矩阵和四元数,这些工具用于表示和操作3D空间中的对象。同时,熟悉编程语言(如Java)和图形库(如JOGL)的使用也是必不可少的。随着技能的提高,你将能够创建更...
变换操作如平移、旋转和缩放,能够帮助调整物体在3D空间的位置和形状。而光照和材质则决定了物体在虚拟环境中的视觉效果。 第二本书可能更深入地讨论了Java 3D的高级特性,如视点控制、动画制作、碰撞检测和用户...
在“Foundations of 3D Graphics Programming_ Using JOGL and Java3D.pdf”这本教程中,你将学习到: 1. **Java 3D概述**:Java 3D是一个开放源代码的API,它扩展了Java语言以支持在二维屏幕上展示和操作三维几何...
Chen与Chunyang Chen共同编写的关于利用JOGL(Java Binding for OpenGL)和Java 3D进行三维图形编程的专业教材。本书主要面向计算机科学、工程学领域的学生、科研人员及工程师,旨在帮助读者掌握使用Java进行三维...
2. `Transform3D`:用于处理3D空间中的旋转、平移和缩放,是动画化3D对象的关键。在文字动画中,可能通过改变`Transform3D`对象来实现文字的移动、旋转或改变大小。 3. `AnimationController`:Java 3D中负责管理...
本书不仅涵盖了Java 3D API,还涉及了JOGL(Java Binding for OpenGL)、JInput(用于输入设备管理)以及JOAL(Java Binding for OpenAL,用于音频处理)等API的使用,为读者提供了全面的3D游戏开发框架。...
通过Java和JOGL,开发者能够将这些概念转化为实际的代码,创建出一个动态且具有互动性的3D飞行模拟器。这个项目对于学习3D图形编程和理解游戏开发流程的初学者来说,是一个非常有价值的实践案例。
- **变换**:平移、旋转和缩放是调整物体在3D空间中位置和大小的基本操作。 2. **场景图(Scene Graph)** - **节点**:Java 3D中的基本构建块,表示3D场景中的对象或属性。 - **根节点**:场景图的起点,通常是...
开发者可能使用了矩阵变换来处理3D空间中的物体定位和旋转,通过顶点数组和颜色缓冲区实现渲染。同时,为了优化性能,可能会有帧率控制和多线程处理,确保游戏在各种设备上都能流畅运行。 此外,游戏的音效和动画也...
- **坐标转换**:在3D空间中,理解并实现坐标转换至关重要,包括旋转、平移和缩放矩阵。 - **向量与矩阵运算**:在处理3D变换时,向量和矩阵运算用于描述物体的位置、方向和形状。 5. **算法与数据结构**: - **...
标签"3D"和"java Graphics"明确指出了书的主题方向:使用Java语言实现三维图形编程,特别是通过JOGL(Java Binding for the OpenGL)和Java 3D两种技术。JOGL是一种让Java应用程序能够使用OpenGL接口的工具,而Java ...