歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android 3d 球形建模

Android 3d 球形建模

日期:2017/3/1 10:12:48   编辑:Linux編程

opengl裡的對球形的建模:首先要把球形表式由點組成的模型。現在的問題是:怎麼把這個球用點集進行表示。

代碼如下:

  1. final int UNIT_SIZE=10000;
  2. ArrayList<Integer> alVertix=new ArrayList<Integer>();//存放頂點坐標的ArrayList
  3. final int angleSpan=18;//將球進行單位切分的角度
  4. for(int vAngle=-90;vAngle<=90;vAngle=vAngle+angleSpan){//垂直方向angleSpan度一份
  5. for(int hAngle=0;hAngle<360;hAngle=hAngle+angleSpan)//水平方向angleSpan度一份
  6. {//縱向橫向各到一個角度後計算對應的此點在球面上的坐標
  7. double xozLength=scale*UNIT_SIZE*Math.cos(Math.toRadians(vAngle));
  8. int x=(int)(xozLength*Math.cos(Math.toRadians(hAngle)));
  9. int z=(int)(xozLength*Math.sin(Math.toRadians(hAngle)));
  10. int y=(int)(scale*UNIT_SIZE*Math.sin(Math.toRadians(vAngle)));
  11. //將計算出來的XYZ坐標加入存放頂點坐標的ArrayList
  12. alVertix.add(x);alVertix.add(y);alVertix.add(z);
  13. }
  14. }

  1. final int UNIT_SIZE=10000;
  2. ArrayList<Integer> alVertix=new ArrayList<Integer>();//存放頂點坐標的ArrayList
  3. final int angleSpan=18;//將球進行單位切分的角度
  4. for(int vAngle=-90;vAngle<=90;vAngle=vAngle+angleSpan){//垂直方向angleSpan度一份
  5. for(int hAngle=0;hAngle<360;hAngle=hAngle+angleSpan)//水平方向angleSpan度一份
  6. {//縱向橫向各到一個角度後計算對應的此點在球面上的坐標
  7. double xozLength=scale*UNIT_SIZE*Math.cos(Math.toRadians(vAngle));
  8. int x=(int)(xozLength*Math.cos(Math.toRadians(hAngle)));
  9. int z=(int)(xozLength*Math.sin(Math.toRadians(hAngle)));
  10. int y=(int)(scale*UNIT_SIZE*Math.sin(Math.toRadians(vAngle)));
  11. //將計算出來的XYZ坐標加入存放頂點坐標的ArrayList
  12. alVertix.add(x);alVertix.add(y);alVertix.add(z);
  13. }
  14. }

講解:

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

Copyright © Linux教程網 All Rights Reserved