opengl裡的對球形的建模:首先要把球形表式由點組成的模型。現在的問題是:怎麼把這個球用點集進行表示。
代碼如下:
- final int UNIT_SIZE=10000;
- ArrayList<Integer> alVertix=new ArrayList<Integer>();//存放頂點坐標的ArrayList
- final int angleSpan=18;//將球進行單位切分的角度
- for(int vAngle=-90;vAngle<=90;vAngle=vAngle+angleSpan){//垂直方向angleSpan度一份
- for(int hAngle=0;hAngle<360;hAngle=hAngle+angleSpan)//水平方向angleSpan度一份
- {//縱向橫向各到一個角度後計算對應的此點在球面上的坐標
- double xozLength=scale*UNIT_SIZE*Math.cos(Math.toRadians(vAngle));
- int x=(int)(xozLength*Math.cos(Math.toRadians(hAngle)));
- int z=(int)(xozLength*Math.sin(Math.toRadians(hAngle)));
- int y=(int)(scale*UNIT_SIZE*Math.sin(Math.toRadians(vAngle)));
- //將計算出來的XYZ坐標加入存放頂點坐標的ArrayList
- alVertix.add(x);alVertix.add(y);alVertix.add(z);
- }
- }
- final int UNIT_SIZE=10000;
- ArrayList<Integer> alVertix=new ArrayList<Integer>();//存放頂點坐標的ArrayList
- final int angleSpan=18;//將球進行單位切分的角度
- for(int vAngle=-90;vAngle<=90;vAngle=vAngle+angleSpan){//垂直方向angleSpan度一份
- for(int hAngle=0;hAngle<360;hAngle=hAngle+angleSpan)//水平方向angleSpan度一份
- {//縱向橫向各到一個角度後計算對應的此點在球面上的坐標
- double xozLength=scale*UNIT_SIZE*Math.cos(Math.toRadians(vAngle));
- int x=(int)(xozLength*Math.cos(Math.toRadians(hAngle)));
- int z=(int)(xozLength*Math.sin(Math.toRadians(hAngle)));
- int y=(int)(scale*UNIT_SIZE*Math.sin(Math.toRadians(vAngle)));
- //將計算出來的XYZ坐標加入存放頂點坐標的ArrayList
- alVertix.add(x);alVertix.add(y);alVertix.add(z);
- }
- }
講解:
1. 首先把球想成由很多的半徑不一樣的圓所組成的。把球想像成由很多平形於x,z平面的圓所組成的。
2. x,z軸的圓的角度是由0-360,y軸的變動由-90到90。
3. 在java裡,三角函數要用弧度計算,而我們平實一般都是角度來計算。其實不管三角函數用的是角度和弧度,其都是度量的是角的大小,所以對於同一個角,其三角函數的值都是一樣的(不管是用角度計算,還是用弧度計算)。所以sin(x)就不要注重其x是角度還是弧度,只要關心,其是由對邊/斜邊(前題是直角三角形)。
4. 如果對於計算球上每個點的坐標,不太理解,可以在笛卡爾級坐標系裡,畫一個點,再把這個點進行映射到三個坐標軸上去,就可以了。
注:角度和弧度的理解:http://www.linuxidc.com/Linux/2012-08/68252p2.htm