Энэ постоороо TriMesh классыг танилцуулах болно. Бид өмнөх постуудаар
jME-ийн цаанаасаа бэлдээд өгцөн Box, Sphere классуудаар объект үүсгэж
байсан билээ. Тэгвэл TriMesh класс нь өөрсдөө объектийг бүтээх боломжийг
олгож байгаа юм. Тэхээр энэ постоор бид хавтай дөрвөлжин объектийг
өөрсдөө хийж үзэх болно.
import com.jme.app.SimpleGame;
import com.jme.bounding.BoundingBox;
import com.jme.math.Vector2f;
import com.jme.math.Vector3f;
import com.jme.renderer.ColorRGBA;
import com.jme.scene.TexCoords;
import com.jme.scene.TriMesh;
import com.jme.util.geom.BufferUtils;
public class HelloTriMesh extends SimpleGame {
public static void main(String[] args) {
HelloTriMesh app = new HelloTriMesh();
app.setConfigShowMode(ConfigShowMode.AlwaysShow);
app.start();
}
protected void simpleInitGame() {
// TriMesh классаас jME объектүүдийг цаанаа яг яаж зураад
// байгааг ойлгох боломжтой
TriMesh m=new TriMesh("My Mesh");
// Торны оройн байрлалуудын координатууд
Vector3f[] vertexes={
new Vector3f(0,0,0),
new Vector3f(1,0,0),
new Vector3f(0,1,0),
new Vector3f(1,1,0)
};
// Оройн байрлал бүрт зориулагдсан нормал чиглэл
Vector3f[] normals={
new Vector3f(0,0,1),
new Vector3f(0,0,1),
new Vector3f(0,0,1),
new Vector3f(0,0,1)
};
// Оройн байрлал бүрт зориулагдсан өнгөний утгууд
ColorRGBA[] colors={
new ColorRGBA(1,0,0,1),
new ColorRGBA(1,0,0,1),
new ColorRGBA(0,1,0,1),
new ColorRGBA(0,1,0,1)
};
// Оройн байрлал бүрт зориулагдсан Текстурын координатууд
Vector2f[] texCoords={
new Vector2f(0,0),
new Vector2f(1,0),
new Vector2f(0,1),
new Vector2f(1,1)
};
// Vertex/Normal/Color/TexCoord олонлогуудын индексүүд.
// 3 бүр нь нэг гурвалжинг дүрсэлж байгаа.
int[] indexes={
0,1,2,1,2,3
};
// TriMesh-ийг объектийн мэдээллээр хангах
m.reconstruct(BufferUtils.createFloatBuffer(vertexes),
BufferUtils.createFloatBuffer(normals),
BufferUtils.createFloatBuffer(colors),
TexCoords.makeNew(texCoords),
BufferUtils.createIntBuffer(indexes));
// bound-ийг үүсгэх
m.setModelBound(new BoundingBox());
m.updateModelBound();
// scene graph-луу mesh буюу үүсгэсэн торон объектээ хавсаргах
rootNode.attachChild(m);
// орой бүр дэх өнгөнүүдийг харуулах боломжтой болгох
lightState.setEnabled(false);
}
}
[Програм ажиллаж байгаа байдал]

Хамгийн эхний шинэ зүйл бол
// TriMesh классаас jME объектүүдийг цаанаа яг яаж зураад
// байгааг ойлгох боломжтой
TriMesh m=new TriMesh("My Mesh");
Анхаар! new TriMesh() гэж байгуулагчийг хоосоноор битгий үүсгэ. Дандаа
new TriMesh("String name") гэж үүсгэн хэрэглэж бай. Хоосон байгуулагчийг
зөвхөн дотоод кодчлолд хэрэглэдэг бөгөөд ингэх юм бол зөв рэндэрлэгдэж
чадахгүйд хүрнэ. Node, Box, Sphere болон com.jme.scene.Spatial-аас
удамшигдсан бүх объектүүдэд ч гэсэн ижил.
Хэрэв та Box болон Sphere классуудыг хэрхэн бичигдсэнийг нь нээж харах юм бол
public class Box extends Trimesh ....
public class Sphere extends Trimesh ....
гэсэн хэлбэртэй харагдах болно. Өөрөөр хэлбэл Trimesh бол Box, Sphere классуудын эцэг класс юм. Эдгээр огторгуйн дүрснүүд нь Trimesh-ээр хийгддэг гэсэн үг. Одоо хэсэг хэсгээр нь эх кодыг тайлбарлъя.
// Торны оройн байрлалуудын координатууд
Vector3f[] vertexes={
new Vector3f(0,0,0),
new Vector3f(1,0,0),
new Vector3f(0,1,0),
new Vector3f(1,1,0)
};
Эд нар бол бидний дүрсийг үүсгэх гэж байгаа гурвалжингуудын
өнцөгийн координатууд юм. Харин одоо энэ орой бүрт нь нормал
утгуудыг харгалзуулъя.
// Оройн байрлал бүрт зориулагдсан нормал чиглэл
Vector3f[] normals={
new Vector3f(0,0,1),
new Vector3f(0,0,1),
new Vector3f(0,0,1),
new Vector3f(0,0,1)
};
vertex[i] -ийн нормаль утга нь normal[i] , Нормал утга нь 3D графикийн
хамгийн ерөнхий ойлголтуудын нэг юм. Энэ кодны хувьд нормал утгуудад
хамааралтай цэгүүдийн өнгө нь аль чиглэлд илүү их гэрэлтэх вэ гэдгийг
илтгэж байна. Нормал утгууд олгогдсоны дараа орой бүр нь өнгөтэй байх
боломжтой болно.
// Оройн байрлал бүрт зориулагдсан өнгөний утгууд
ColorRGBA[] colors={
new ColorRGBA(1,0,0,1),
new ColorRGBA(1,0,0,1),
new ColorRGBA(0,1,0,1),
new ColorRGBA(0,1,0,1)
};
Эхний хоёр орой нь улаан өнгөтэй дараагийн хоёр нь ногоон өнгөтэй байна
гэдгийг илтгэж байна. Доороос дээшээгээ улаанаас ногоон өнгө хүртэл
smooth шилжилттэй байна гэсэн үг. Жишээн дээр харагдаж байгаа байх.
Дараа нь бид Текстур координатуудын буулгалтыг хийнэ.
// Оройн байрлал бүрт зориулагдсан Текстурын координатууд
Vector2f[] texCoords={
new Vector2f(0,0),
new Vector2f(1,0),
new Vector2f(0,1),
new Vector2f(1,1)
};
Хэрвээ та өмнө нь 3D графиктай ажиллаж байсан бол текстур буулгалт
хийх концепц нь jME-д ч гэсэн ижилхэн байдаг.
Vector2f нь Vector3f-тэй адилхан хэдий ч 2 ширхэг float төрөл бүхий
талбартай гэдгээрээ ялгаатай. Текстур буулгалтын талаар дараа
өгүүлэх болно харин одоо бол TriMesh ийн бүтэцийн тухай яригдаж
байгаа билээ. Эцэст TriMesh-дээ зориулж индексүүдийг үүсгэнэ.
// Vertex/Normal/Color/TexCoord олонлогуудын индексүүд.
// 3 бүр нь нэг гурвалжинг дүрсэлж байгаа.
int[] indexes={
0,1,2,1,2,3
};
TriMesh гэдэг нь Triangle mesh буюу гурвалжин тор гэсэн утгатай юм
өөрөөр хэлбэл гурвалжингуудын цуглуулга гэж ойлгож болно. Индекс
массив үргэлж гуравт худаагддаг байх ёстой(жн нь 3 6 9 12 15 гэх мэт)
Яагаад гэвэл гурвалжинд үргэлж гурван ширхэг координатуудын утга
байдаг. Манай жишээний объект хоёр ширхэг гурвалжингаас бүрддэж
байгааг санах хэрэгтэй. Хэрэв {0,1,2,1,2,3,2,3,0} гэсэн олонлог байвал
гурван ширхэг гурвалжин байна гэж ойлгоно. Эхний 0,1,2 гэсэн гурван
тоог анхааралдаа авцгаая. Энэ нь TriMesh объектийн эхний гурвалжин
нь орой[0]->орой[1]->орой[2] гэсэн дарааллаар холбогдон үүссэн гэсэн
үг. орой[0]-д normal[0]-ийн нормал утга, color[0]-ийн өнгөний утга
texCoord[0]-ийн текстурын байрлалууд гэх мэт утгууд харгалзаж байгаа.
Дараагийн гурвалжин нь орой[1]->орой[2]->орой[3] гэсэн дарааллаар
бүтээгдсэн байгаа. Харин дараах байдалтай хийж болохгүй:
int[] indexes={
0,1,2,1,2,4
};
Дээрхи шиг хийж болохгүй яагаад гэвэл орой[4] гэсэн зүйл байхгүй
болохоор тэр юм. За ингээд бүх өгөгдлүүдээ үүсгэсний дараагаар бид
TriMesh объектоо мэдээллээр хангах хэрэгтэй дараагаар нь bounding
хийх хэрэгтэй.
// TriMesh-ийг объектийн мэдээллээр хангах
m.reconstruct(BufferUtils.createFloatBuffer(vertexes),
BufferUtils.createFloatBuffer(normals),
BufferUtils.createFloatBuffer(colors),
TexCoords.makeNew(texCoords),
BufferUtils.createIntBuffer(indexes));
// bound-ийг үүсгэх
m.setModelBound(new BoundingBox());
m.updateModelBound();
// scene graph-луу mesh буюу үүсгэсэн торон объектээ хавсаргах
rootNode.attachChild(m);
// орой бүр дэх өнгөнүүдийг харуулах боломжтой болгох
lightState.setEnabled(false);
Хамгийн сүүлийн мөр дэх кодын талаар дараачийн хичээлүүдийг үзсэний
дараа танд илүү ойлгогдох болно. Харин одоо хавтгай дээрхи солонгон
өнгийг үүсгэдэг per vertex өнгөнүүдийг зүгээр л асаа.
Энэ жишээнд textCoords ашиглагдаагүй гэдгийг мэдэх хэрэгтэй. Эдгээр нь
таныг объектдээ зураг наах үед л хэрэглэгдэх болно.
m.reconstruct(BufferUtils.createFloatBuffer(vertexes),
null,
null,
null,
BufferUtils.createIntBuffer(indexes));
гэсэн байдалтайгаар хэрэглэсэн ч болох юм. Ингээд scene graph маань
дараах байдалтай байх болно.

За одоо танд гэрийн даалгавар өгье :) хэрвээ ойлгосон бол Пирамид объектийг
энэ TriMesh классыг ашиглаж хийгээрэй. Та бүгд доор коммент үлдээж болно.
Хэн нь хамгийн лаг хийсэн бэ гэдгийг шалгаруулсан ч болно. Хийсэн ажлаа
надад заавал шалгуулаарай за амжилт!
[Гэрийн даалгаварт өгсөн объект]

[Энэ постын үр дүн]
