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