高度圖實際上就是乙個2d陣列。地形實際上就是一系列高度不同的網格而已,這樣陣列中每個元素的索引值剛好可以用來定位不同的網格((x,y),而鎖儲存的值就是網格的高度(z)。
要將高度地圖轉換為場景,只需要讀取的畫素,然後根據畫素的值設定平面的高度,最常用的平面是四邊形,因為四邊形是規則的,可以採用陣列方便統一建立和管理(並能實現地圖的無縫),四邊形由兩個三角形組成,多個四邊形組成了場景地圖。
為將高度地圖轉化為場景,建立乙個heightmap類。要建立等高地圖,首先應當讀取資料,getrgb方法可以將顏色儲存到陣列中。
resolution表示1個畫素所表示的四邊形個數,這裡設定為0.25,乙個四邊形要四個畫素顏色表示。該值增大,使用更多的四邊形來代表地形,地形的平滑度也在不斷的提高,然而,也在增加記憶體的使用空間和cpu需要運算的多邊形數量,因此,每乙個移動的裝置都需要依據可用記憶體,cpu運算能力等進行平衡。
載入**如下
private float resolution = 0.25f;
private int imgw,imgh;
private short heightmap;
private int data;
private int mapwidth;
private int mapheight;
private static final string terrainimgfn="/heightmap.png";
private void loadmapimage() throws ioexception
}//clear data
data = null;
img = null;
system.gc();
}heightmap 類使用createquad方法建立四邊形,四邊形由四個頂點組成,每乙個頂點有乙個變化的y座標,使用heights陣列設定,但x和z不變。
方法**如下:
在讀取顏色資料和能夠構建單個四邊形網面之後,就可以根據等高設定不同高度批量建立四邊形來構成場景
方法如下:
//method
private void createquads()}}
所有建立的四邊形是重疊的,所以有必要將四邊形在xz平面上進行平移, 平移的大小按照網格的實際大小來設定,例如createquad建立的四邊形邊長為510,呼叫postscale方法將四邊形縮小100倍,其邊長為5.1,那麼平移每個四邊形的距離應該為5。1的整數倍
private transform localtransform = new transform();
public void settransform(transform t)
}//建構函式
public heightmap() throws ioexception
heightmap類根據等高圖建立場景流程為: 載入--》data陣列讀取顏色-->heightmap地圖陣列--》createquads()根據地圖陣列建立四邊行陣列--》createquad(heights)根據高度建立四邊形--》settransform()將四邊形在xz平面上平移
heightmap類提供了一些公用方法給遊戲畫布類訪問在建立整個場景時以便將網面新增成場景的一部分
public mesh getquads()
public int getmapwidth()
public int getmapheight()
下面開始構造遊戲場景
遊戲場景類**如下:
public class h3dcanvas extends gamecanvas implements runnable
} camera = new camera();
float aspect = (float) getwidth() / (float) getheight();
camera.setperspective(60.0f, aspect, 0.1f, 150.0f);
camtrans.posttranslate(0.0f, 5.0f, 0.0f);
camera.settransform(camtrans);
world.addchild(camera);
world.setactivecamera(camera);
addwater();
back = new background();
back.setcolor(0xff0000ff);
world.setbackground(back);
thread t = new thread(this);
t.start();
}private void createmap()
catch(exception e)
}private void draw(graphics g)
catch(exception e)
finally
}private void addwater()
catch (exception e)
tiledwater w = new tiledwater(waterim,8);
mesh water = w.getwatermesh();
water.scale(2,2,2);
world.addchild( w.getwatermesh() );
} public void run() catch(exception e) {}
}catch(exception e)
}protected void input()
private void makegeometry(int size, int numtiles)
vertexarray position_array = new vertexarray(points.length/3, 3, 2);
position_array.set(0, points.length/3, points);
short texcoords = new short[8*numtiles];
for(i = 0; i < 8*numtiles; i += 8)
vertexarray texcoord_array = new vertexarray(texcoords.length/2, 2, 2);
texcoord_array.set(0, texcoords.length/2, texcoords);
vertexbuffer.setpositions(position_array, 1.0f, null);
vertexbuffer.settexcoords(0, texcoord_array, 1.0f, null);
int pos1 = 1; int pos2 = 2;
int pos3 = 0; int pos4 = 3;
int indices = new int[4*numtiles];
for(i = 0; i < 4*numtiles; i += 4)
int lengths = new int[numtiles];
for(i = 0; i < numtiles; i++)
lengths[i] = 4;
indexbuffer = new ********striparray(indices,lengths);
} polygonmode polygonmode = new polygonmode();
polygonmode.setperspectivecorrectionenable(true);
polygonmode.setculling(polygonmode.cull_none);
}
J2ME 3D程式設計的一些資料
j2me 3d 程式設計的一些資料 隨著j2me 技術的發展,以及硬體速度的提公升,3d遊戲程式將慢慢的變成主流,最近想學習這一塊的程式設計,所以收集了一些資料,和大家一起分享 1 jsr184 jsr184 是nokia 公司起草的乙個關於 2 nokia的3d 程式設計資料 3 3d引擎 乙個簡...
J2ME 3D程式設計的一些資料
隨著 j2me 技術的發展,以及硬體速度的提公升,3d遊戲程式將慢慢的變成主流,最近想學習這一塊的程式設計,所以收集了一些資料,和大家一起分享 1 jsr184 jsr184 是nokia 公司起草的乙個關於 nokia的3d 程式設計資料 3 3d引擎 乙個簡單的開放源 的 3d遊戲引擎 soft...
J2ME 2D小遊戲入門之遊戲的框架
一 遊戲的框架 我們的遊戲需要乙個通用的遊戲框架,也方便以後的開發,但實現乙個引擎是複雜的。作為初學者如果要你考慮太多的問題,恐怕會讓你偏離主線,這裡只給出canvas的 不理解可以參看本站的另外一篇系列文章 使用midp2.0開發遊戲 public class mygamecanvas exten...