1. OpenGL中的一个重要的概念:环绕。
2. 详细的介绍GL11.GL_TRIANGLE_FAN和GL11.GL_TRIANGLE_STRIP参数。
1. 环绕
我们知道画一个三角形有两种画法:顺时针和逆时针。如下图所示:
在OpenGL中把顶点的指定次序以及方向的组合称为环绕(winding)。
因此,上图中左边的三角形被称为具有逆时针环绕方向,而右边的三角形被认为具有顺时针环绕方向。而在缺省情况下:OpenGL认为多边形具有正面逆时针方向的环绕。这意味着上图左侧的三角形是这个三角形的证明,右侧的三角形是那个三角形的背面。(是不是不能理解???哈哈,你肯定在二维平面里考虑问题了,换成三维平面,再试一试!)
这个问题为什么非常重要呢?很快你将会看到,你常常希望为一个多边形的正面和背面分别设置不同的物理特性。你可以隐藏一个多边形的背面(这样可以减少渲染工作),或者给它设置一种不同的颜色和反射属性(这个不理解,期待以后的教程吧J)。在一个场景中,使所有的多边形保持环绕的一致,并使用正面多边形来绘制所有实心物体的外表是非常重要的。
当然了,如果你希望改变OpenGL的这个缺省行为,你可以调用下面这个函数:GL11.glFrontFace(GL11.GL_CW);GL_CW参数告诉OpenGL顺时针环绕的多边形将被认为是正面的。你可以使用GL11.GL_CCW参数将正面重新恢复为逆时针环绕。(不推荐更改默认行为,还是约定俗成的好,不然别人不好理解你的代码)。
2.GL11.GL_TRIANGLE_FAN
在很多情况下面,我们要画多个三角形,但是这些三角形有围绕一个中心点,我们将如何画出呢?按照我们上期讲述的方法,那只有一个先指定一个三角形的顶点数据,然后画出这个三角形,再接着清除上述指定的顶点信息,再画一个三角形…如此,一个一个的画,我们试想一下,对于中心顶点,我们要赋值多次,而且这样一次又一次的画三角形效率肯定很低。现在我们使用GL11.GL_TRIANGLE_FAN参数,画多个围绕一个中心点的三角形。代码如下:
package com.helloworld.fneg;
import java.util.Random;
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.backends.jogl.JoglApplication;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL11;
import com.badlogic.gdx.graphics.Mesh;
import com.badlogic.gdx.graphics.VertexAttribute;
import com.badlogic.gdx.graphics.VertexAttributes.Usage;
/**
*@Copyright:Copyright (c) 2008 - 2100
*@Company:Sagret
*@Author:fengcunhan [email protected]
*@Package:com.helloworld.fneg
*@FileName:Fan**.java
*@Time:2011-1-13
*@User:feng
*/
public class FanTriangle implements ApplicationListener {
private Mesh dodecagonMesh;
private float[] vertices;
private short[] indexs;
private Random random;
@Override
public void create() {
// TODO Auto-generatedmethod stub
dodecagonMesh=new Mesh(true, 32,8, new VertexAttribute(Usage.Position, 3, "point"),newVertexAttribute(Usage.ColorPacked, 4, "color"));
float bordLength=0.5f;
float angleIncrease=(float)((60f/360f)*2.0f*3.14f);
random=new Random();
int i=0;
vertices=new float[32];
vertices[i++]=0;
vertices[i++]=0;
vertices[i++]=0;
vertices[i++]=Color.toFloatBits(255, 0, 0,0);//设置中心点的颜色
//设置六边形六个顶点的颜色
for(float angle=0;angle<=(2.0f*3.14f);angle+=angleIncrease){
float x=(float) (bordLength*Math.cos(angle));
float y=(float) (bordLength*Math.sin(angle));
float z=0;
vertices[i++]=x;
vertices[i++]=y;
vertices[i++]=z;
vertices[i++]=Color.toFloatBits(random.nextInt(255), random.nextInt(255), random.nextInt(255),0);
}
indexs=new short[]{0,1,2,3,4,5,6,7};
dodecagonMesh.setVertices(vertices);
dodecagonMesh.setIndices(indexs);
}
@Override
public void resume() {
// TODO Auto-generatedmethod stub
}
@Override
public void render() {
// TODO Auto-generatedmethod stub
//画出六边形
dodecagonMesh.render(GL11.GL_TRIANGLE_FAN, 0, 8);
}
@Override
public void resize(int width, int height) {
// TODO Auto-generatedmethod stub
}
@Override
public void pause() {
// TODO Auto-generatedmethod stub
}
@Override
public void dispose() {
// TODO Auto-generatedmethod stub
}
/**
* @param args
* @Description:
*/
public static void main(String[] args) {
// TODO Auto-generatedmethod stub
new JoglApplication(new Fan**(), "Hello world", 480, 480, false);
}
}
运行代码,我们得到如下图(大家得到的可能和我不一样,因为颜色是随机的):
用相同的代码,使用GL11.GL_TRIANGLE_STRIP参数,得到的是如下图形:
那么使用GL11.GL_TRIANGLE_STRIP参数,将如何得到一个六边形呢?这个大家自己去完成吧!希望大家能在回复里面贴出来。
转载出处:http://space.189works.com/space-uid-10009991.html