歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android 3d 球形建模

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