#AsuultSambar :

ASUULT.NET - МОНГОЛ УЛС МАНДАН БАДРАГ!
It is currently Oct.20.18 1:16 am

All times are UTC+09:00




Post new topic  Reply to topic  [ 25 posts ] 
Author Message
 Post subject: Java Monkey Engine
PostPosted: Oct.12.09 10:35 am 
Offline
Ноёлогч Гишvvн
Ноёлогч Гишvvн

Joined: Mar.15.07 4:36 pm
Posts: 1013
Энэ энжайныг яаж эклипсдээ тохируулах( суулгах ) вэ?

Би Eclipse galileo-той тэгээд http://tortoisesvn.net/downloads эндээс тэр TortoiseSVN-1.6.5.16974-win32-svn-1.6.5.msi татаж аваад суулгасын
тэгээд SVN ээ тохируулах гэхээр Eclipse дээр гарч ирэхгүй юм.

энэ видеог үзээд дуурайхгаад байгаашд :
http://video.google.com/videosearch?hl= ... BIQqwQwAw#

Энэ видеоны дагуу бол ингэж гарч ирэх ёстой юмшиг

Image

_________________
no edit


Last edited by OXGETR on Oct.12.09 10:48 am, edited 1 time in total.

Top
   
 Post subject: Re: Java Monkey Engine
PostPosted: Oct.12.09 10:46 am 
Offline
Ноёлогч Гишvvн
Ноёлогч Гишvvн

Joined: Mar.15.07 4:36 pm
Posts: 1013
Ер нь энэ SVN гэдэг нь юу юум бэ?

_________________
no edit


Top
   
 Post subject: Re: Java Monkey Engine
PostPosted: Oct.12.09 10:45 pm 
Offline
Ноёлогч Гишvvн
Ноёлогч Гишvvн

Joined: Mar.15.07 4:36 pm
Posts: 1013
зиа зиа болчлоо
энэн дээр юм хум хийсэн хүн байна уу?

_________________
no edit


Top
   
 Post subject: Re: Java Monkey Engine
PostPosted: Oct.24.09 1:13 am 
Offline
Ноёлогч Гишvvн
Ноёлогч Гишvvн

Joined: Mar.15.07 4:36 pm
Posts: 1013
хүн байдаггүй эээ :m1:

_________________
no edit


Top
   
 Post subject: Re: Java Monkey Engine
PostPosted: Oct.30.09 2:43 am 
Offline
Гал Дөл Гишvvн
Гал Дөл Гишvvн
User avatar

Joined: Nov.30.06 9:58 am
Posts: 1480
Location: Camp nou-d балай авж байна!!!
крузо ах арал дээр ганцаараа амьдрал зохиодог санаанд орчихлоо :hihi:

_________________
Mes que un club :jinguudeh:


Top
   
 Post subject: Re: Java Monkey Engine
PostPosted: Oct.30.09 11:27 pm 
Offline
Ноёлогч Гишvvн
Ноёлогч Гишvvн

Joined: Mar.15.07 4:36 pm
Posts: 1013
чи тэгвэл баасан уу? :hihi:

_________________
no edit


Top
   
 Post subject: Re: Java Monkey Engine
PostPosted: Oct.31.09 7:42 pm 
Offline
Ноёлон Ноёрхогч Гишvvн
Ноёлон Ноёрхогч Гишvvн
User avatar

Joined: Oct.25.06 2:00 am
Posts: 1079
Location: cyber world
Би ганцаараа л энэ энжинийг сонирхогч юм байх гэж бодсон, ашгүй сонирхогчид нэмэгдэж байна. Надаас асуух зүйл байвал асуугаарай би бас мэдэхгүй зүйлээ асууя :) ер нь бол энэ хөдөлгүүр надад хамгийн их таалагдсан нь.

_________________
whatever!


Top
   
 Post subject: Re: Java Monkey Engine
PostPosted: Oct.31.09 7:57 pm 
Offline
Ноёлон Ноёрхогч Гишvvн
Ноёлон Ноёрхогч Гишvvн
User avatar

Joined: Oct.25.06 2:00 am
Posts: 1079
Location: cyber world
Энийг хөдөлгүүрийг тохируулахын тулд заавал SVN клиэнт ашиглах хэрэггүй ээ.
http://code.google.com/p/jmonkeyengine/downloads/list
энэ холбоос бол jME 2.0.1 гэдэг хамгийн сүүлийн тогтвортой хувилбар нь.
jME2_0_1-Stable.zip гэсэн файлыг нь татаж аваад eclipse дээрээ тохируулахад
хангалттай.

_________________
whatever!


Top
   
 Post subject: Re: Java Monkey Engine
PostPosted: Nov.01.09 12:13 am 
Offline
Ноёлогч Гишvvн
Ноёлогч Гишvvн

Joined: Mar.15.07 4:36 pm
Posts: 1013
блогийг чинь үзсэн сайн хийсэн байна лээ шүү
ID гаа пмдчих чамаас асуух юм асар их байна

_________________
no edit


Top
   
 Post subject: Re: Java Monkey Engine
PostPosted: Nov.04.09 10:01 pm 
Offline
Ноёлон Ноёрхогч Гишvvн
Ноёлон Ноёрхогч Гишvvн
User avatar

Joined: Oct.25.06 2:00 am
Posts: 1079
Location: cyber world
хэй яагаад ойрдоо чимээгүй байнаа. Мессэнжэртээ орж ирж байгаа юу?

_________________
whatever!


Top
   
 Post subject: Re: Java Monkey Engine
PostPosted: Mar.19.10 3:56 am 
Offline
Ноёлон Ноёрхогч Гишvvн
Ноёлон Ноёрхогч Гишvvн
User avatar

Joined: Oct.25.06 2:00 am
Posts: 1079
Location: cyber world
Жава Монкей Хөдөлгүүр бол одоогийн байдлаар хамгийн сайн хамгийн хурдан 3D жава тоглоомын хөдөлгүүр билээ. OpenGL-ийн native хэрэгжүүлэлтүүд рүү жава хэлнээс bind хийх замаар ажилладаг бөгөөд Joshua Slack гэдэг хүн анх David H.Eberly-ийн 3D Game Engine Design гэдэг номыг анх уншсанаар энэ хөдөлгүүрийг зохиох урам орсон гэдэг. Одоогийн байдлаар энэхүү хөдөлгүүр олон сайн хакер(мэргэжилтэн)үүдийн хүчээр чимээгүйхэн хөгжүүлэгдсээр 2.0 гэсэн хувилбар гараад байна. Мөн jmonkeyphysic гэсэн хэрэгжүүлэлт хийгдсэн ба Physx, ODE, Bullet ... гэх мэт олон физик хөдөлгүүрүүдийн хийсвэрлэн физик давхаргыг хийж өгсөн өөрөөр хэлбэл тоглоомондоо физик код бичсэн ч гэсэн тэр цаанаа физикийн ямар native хэрэгжүүлэлтэнд bind хийснээс үл хамаарна. Мөн платформ хамаарахгүй MacOS, Linux, Windows гэх мэт үйлдлийн системүүд дээр бүгдэн дээр нь ажиллана. Форумд нь хүмүүс маш эелдэгээр таны хүссэн асуултанд хариулах болно. Энэ хөдөлгүүрийг сонирхогчдын тоо өдрөөс өдөрт нэмэгдсээр л байна. Илүү дэлгэрэнгүй мэдээллийг эндээс аваарай. Хөдөлгүүрийн одоогийн 2.0 хувилбарыг эндээс аваад форумаас нь eclipse netbeans гэх мэт өөрийн IDE дээрээ хэрхэн тохируулах талаар дэлгэрэнгүй харж болно. Хэрвээ тохируулсан бол мөн хөдөлгүүрийг онцлог бүх шинжийг агуулсан jme-demos хэмээх google project бий. Үүнийг мөн эндээс харж болно.
Физик хэрэгжүүлэлт нь маш сайн байгаа биз. Дараах бичлэгийг хараарай.

_________________
whatever!


Top
   
 Post subject: Re: Java Monkey Engine
PostPosted: Mar.19.10 4:06 am 
Offline
Ноёлон Ноёрхогч Гишvvн
Ноёлон Ноёрхогч Гишvvн
User avatar

Joined: Oct.25.06 2:00 am
Posts: 1079
Location: cyber world
Түрүүн дурдсан Давид Эбэрлигийн Тоглоомын хөдөлгүүрийн дезайн гэдэг номыг
http://www.koschonline.com/%7Esiliconbrain/Ebooks/Game%20Engine%20and%20Game%20Design/Game%20Engine%20Programming/3D%20Game%20Engine%20Design%20-%20David%20H.%20Eberly.pdf
Эндээс татаарай
Image

_________________
whatever!


Top
   
PostPosted: Mar.19.10 4:16 am 
Offline
Ноёлон Ноёрхогч Гишvvн
Ноёлон Ноёрхогч Гишvvн
User avatar

Joined: Oct.25.06 2:00 am
Posts: 1079
Location: cyber world
энэ хөдөлгүүрийг ашиглаж бичих анхны програмыг тайлбарлая.



import com.jme.app.SimpleGame;
import com.jme.math.Vector3f;
import com.jme.scene.shape.Box;

public class HelloWorld extends SimpleGame{
public static void main(String[] args) {
// Объект үүсгэх
HelloWorld app=new HelloWorld();
// Тохиргооны цонхыг эхлэхэд нь харуулах
app.setConfigShowMode(ConfigShowMode.AlwaysShow);
// Програмыг эхлүүлэх
app.start();
}
protected void simpleInitGame() {
// Хайрцаг үүсгэх
Box b=new Box
("My box",new Vector3f(0,0,0),new Vector3f(1,1,1));
// scene graph -луу хавсаргах
rootNode.attachChild(b);
}
}


app.setConfigShowMode(ConfigShowMode.AlwaysShow);
код ажиллаахад дараах тохиргооны цонх гарч ирнэ. Дэлгэцийн урт өргөн давтамж
дэлгэц дүүрэн харуулах эсэхмөн рэндэрлэх санг тохируулах боломжтой
(lwjgl, jogl, swt .. гэх мэт)
[Сармагчны зураг]
Image
SimpleGame классаас удамшуулж хэрэглэж байгааг анзаараарай. Ингэснээр бид
энгийн тоглоомыг хурдан үүсгэх боломжтой болж байгаа юм. SimpleGame доторхи
start() методыг дуудан ажиллуулснаар simpleInitGame() метод хамгийн эхэнд
дуудагдан ажиллаж дараа нь цаадах тоглоомын үндсэн циклийш ажиллуулж
эхэлдэг.

simpleInitGame() доторхи кодыг тайлбарлавал Box хэмээх классаар хайрцагийг
төлөөлөх объектийг үүсгэж байна. "My box" нь scene graph доторхи энэ объектийг
төлөөлөх нэр нь, Vector3f(0,0,0) нь огторгуй байршлынх нь координат харин
Vector3f(1,1,1) нь урт өндөр өргөнүүдийн хэмжээг тус тус илэрхийлнэ.

rootNode.attach(b); scene graph хэмээх тоглоомд оролцож буй бүх зүйлсийг
рэндэр хийхэд зориулагдсан мод бүтэцтэй өгөгдлийн бүтэц байх ба орчин
үеийн тоглоомын хөдөлгүүрүүдийн ихэнхи нь энэ өгөгдлийг бүтэцийг ашигладаг
юм. rootNode нь хамгийн дээд талын node буюу зангилаа бөгөөд үүнлүү
ямар нэгэн spatial гэж нэрлэгдэх өөрөөр хэлбэл энэ тохиолдол Box объектийг
хавсаргаж өгснөөр бид хайрцагийг төлөөлүүлэх объектоо зуруулах боломжтой
болж байгаа юм. scene graph-ийн давуу тал нь тухай node-д ямар нэгэн
modification буюу өөрчлөлт хандалтыг хийхэд түүний хүү node-үүдэд нь мөн
хүчинтэй үйлчилдэг. Энгийнээр тайлбарлавал буу барьсан баатар байжээ,
баатар маань эргэх эсвэл шилжих хөдөлгөөн хийхэд түүний буу нь хамт баатартай
харгалзах координат нь байж байх хэрэгтэй үүнийг scene graph хэмээх өгөгдлийн
бүтцийн тусламжтайгаар хялбархан шийддэг юм, баатарыг төлөөлөх spatial
объектэд бууг төлөөлөх объектийг дээрхи rootNode.attach(b)гэдэг шиг л хавсаргаж
өгснөөр баатрын координат шилжилт эсвэл эргүүлэлт хийгдэх бүрд түүний хүү
node болох буу нь хамтдаа шилжилт болон эргүүлэлт хийгдээд явна гэсэн үг.

За ингээд үр дүн болсон програм маань ажиллаж байгаа байдал.
[Hello World зураг]
Image
SimpleGame класс дотор урьдчилан WASD ээр шилжилт хийх хулганаар
хөдөлгөн зорчих T товчоор mesh харуулах L товчоор гэрэлтүүлэх P
товчоор түр зогсолт хийх B товчоор bounding хүрээг харуулах гэх мэт
үйлдлүүдийг урьдчилаад хийгээд өгсөн байдаг. Энэ класс жишээ байдлаар
ажиллуулах их тохиромжтой. Харин та өөрийн гэсэн тоглоом бүтээхэд
BaseGame классаас удамшуулж хэрэглэх хэрэгтэй ингэсэн тохиолдолд оролт
дэлгэц физик гэх мэтийг бүгдийг өөрийнхөөрөө тохируулах өргөн боломжтой
болж ирнэ. SimpleGame маань BaseSimpleGame классаас BaseSimpleGame
нь BaseGame-ээс удамшсан класс байдаг.

_________________
whatever!


Top
   
 Post subject: jMonkeyEngine Hello Node
PostPosted: Mar.19.10 4:18 am 
Offline
Ноёлон Ноёрхогч Гишvvн
Ноёлон Ноёрхогч Гишvvн
User avatar

Joined: Oct.25.06 2:00 am
Posts: 1079
Location: cyber world
Өмнө нь jME-ийн HelloWorld-ийг тайлбарласан билээ. Энэ постоороо jME-ийн дараах хэдэн ойлголтуудыг танилцуулах болноо. Үүнд:
Node - Мод бүтэц дэх нэг өгөгдөл буюу объект
Bounding Volumes - Объектийг хүрээлэх хэмжээс
Sphere - Бөмбөрцөг. Өмнө хайрцаг үүсгэж байсан, түүн шиг нэг объект юм
Color - Ямар нэгэн объектод өнгө оноож будаж болно
Translation - Объектийн 3-н хэмжээс дэх огторгуйн байрлалыг өгнө
Scaling - Объектийг хүссэн хэмжээгээр дурын тэнхлэгийн дагуу сунгах боломжийг олгоно


import com.jme.app.SimpleGame;
import com.jme.bounding.BoundingBox;
import com.jme.bounding.BoundingSphere;
import com.jme.math.Vector3f;
import com.jme.renderer.ColorRGBA;
import com.jme.scene.Node;
import com.jme.scene.Spatial;
import com.jme.scene.shape.Box;
import com.jme.scene.shape.Sphere;

public class HelloNode extends SimpleGame {
public static void main(String[] args) {
HelloNode app = new HelloNode();
app.setConfigShowMode(ConfigShowMode.AlwaysShow);
app.start();
}

protected void simpleInitGame() {
// Өмнөх постоор энэ кодыг тайлбарласан билээ.
Box b=new Box("My Box",new Vector3f(0,0,0),new Vector3f(1,1,1));
// объектэд culling хийгдэх боломжийг олгохын
// тулд бөмбөрцөгөн хүрээлэлт хийж өгч байна
b.setModelBound(new BoundingSphere());
// Объектэд хамгийн сайн тохирох хүрээлэлтийг тооцоолох
b.updateModelBound();
// y тэнхлэг буюу дээшээгээ 2 нэгжийн байрлал дээр хайрцагийг аваачих
b.setLocalTranslation(new Vector3f(0,2,0));
// Хайрцагийг цэнхэр өнгөөр дүүргэх
b.setDefaultColor(ColorRGBA.blue.clone());

// Хайрцагийг үүсгэж байсан шиг бөмбөрцөгийг үүсгэж байна
Sphere s=new Sphere("My sphere",10,10,1f);
// Бөмбөрцөгийг манай энэ тохиолдолд BoundingBox
// буюу тэгш өнцөгт кубаар хүрээлүүлж байна
s.setModelBound(new BoundingBox());
s.updateModelBound();
// Бөмбөрцөгийг өнгөний санамсаргүй утгуудаар дүүр
s.setRandomColors();

// node буюу зангилаа үүсгээд үүнд хүү зангилаануудыг оноох
Node n=new Node("My Node");
n.attachChild(b);
n.attachChild(s);

// Энэ node-ийг өөрт байгаа бүх хүү
// зангилаануудынх нь хамтаар 5 дахин том хэмжээтэй болгох
n.setLocalScale(5);

// rootNode-өөс гэрэлийг хасна ингэснээр объект өөрийн өнгөөр харагдана
rootNode.setLightCombineMode(Spatial.LightCombineMode.Off);
rootNode.attachChild(n);
}
}
Bounding хэмжээсүүд(BoundingBox, Bounding Sphere) нь jME-г хурдтай ажиллахад
тусалдаг. Объектэд Bound буюу хүрээлэлт хийгдсэнээр юу болох вэ? Таны
тоглоом дахь модель (хүнийг дүрсэлсэн модель) илүү нийлмэл бүтэцтэй болсон
бөгөөд түүнийг бөмбөрцөгөн bounding-аар хүрээлсэн гэж үзье. Бөмбөрцөг бол
математикийн хувьд маш хялбар объект юм тэхээр бөмбөрцөгийн ойролцоо таны
объект visible буюу харагдах горимд байх юм бол энэ төлөвийг jME-д маш хурдтай
хэлэх боломжтой гэсэн үг юм. Харин бөмбөрцөгөөр bounding хийгдсэн таны объект харагдахгүй горимд байвал jME нь таны том хэмжээтэй объектийг зурах талаар
санаа тавилгүйгээр өөр бусад зүйлсдээ санаа тавих боломжтой болж ирж байгаа
юм (Нилээд нийлмэл бүтэцтэй хүнийг дүрсэлсэн объект гэж бод).
Энэ жишээгээр хайрцагийг бөмбөрцөгөөр bounding хийсэн нь хайрцагийг тэгш
өнцөгт кубээр bounding хийснээс илүүтэйгээр сайн мэдээллийг өгөх болно яагаад?
Хайрцаг объектийн эргэн тойронд бөмбөрцөг зурахыг оролдох нь куб зурахыг
оролдохоос илүү хялбар байдаг. Дараах кодод хэрэгжүүлжээ.
b.setModelBound(new BoundingSphere());
Эхлээд объектэд Bounding хэмжээс өгсөнөөр хоосон хүрээлэлт бий болно. "update"
функцийг ажиллуулсанаар яг объектийн хэмжээнд тааруулж bounding хэмжээсийг
тооцоолон тааруулах болно.
b.updateModelBound();

b.setLocalTranslation(new Vector3f(0,2,0));
Харин одоо бид объектийг хөдөлгөж үзэх гэж байна. Vector3f класс нь x, y, z гэсэн
гурван талбартай тэхээр дээрхи код нь дээшээ 2 нэгжээр байрлалаа авсан байгааг
илтгэж байна. Хэрэв доошоо 2 нэгж байрлуулъя гэвэл Vector3f(0,-2,0) гэж өгнө.
b.setDefaultColor(ColorRGBA.blue.clone());
Энэ код нь объектийг нэлэнхүйд нь цэнхэр өнгөөр будаж байна. Хэрэв улаан өнгө
өгмөөр байвал ColorRGBA.red гэх маягаар өгнө. Мөн түүнчлэн ColorRGBA(0,1,0,1)
гэж хэрэглэж болно эдгээр дөрвөн тоонууд нь харгалзан Улаан/Ногоон/Хөх/Alpha
утгуудыг илэрхийлдэг эдгээр утгууд нь 0-оос 1-ийн хоорондох хувийн утга байх
ёстой. Alpha бол гэрэл нэвтрэлтийг илэрхийлдэг тогтсон хэллэг юм өөрөөр
тунгалагшил ч гэж хэлж болох байхаа. Alpha утга 0 бол та юу ч харахгүй гэсэн үг.
0.5 бол хагас нэвтрэлттэй харагдана. Харин одоо бөмбөрцөг зурцгаая.
Sphere s=new Sphere("My sphere",10,10,1f);
jME нь муруй шугамыг зурж чаддаагүй зүгээр гурвалжингуудыг зурдаг. Тойргийг
гурвалжингаар зурах нь маш хэцүү зүгээр л аль болох тойрогийн хэлбэрт дөхөж
очихоор л зурдаг. Эхний хоёр тоо нь шугамнуудын нягтшилийг дүрсэлдэг. Хэрэв
та 10,10 утгануудын оронд 5,5 гэсэн утганууд өгвөл маш муу харагдах бөмбөрцөгтэй
болно гэсэн үг :) 30,30 гэж өгөх юм бол маш их гурвалжингууд цугласан тул үнэхээр
бөмбөрцөг мэт харагдана. Гэвч хэт их гурвалжингуудаас бүрдэнэ гэдэг нь FPS
- Frame Per Second секундэд харуулах кадруудын тоог төдий чинээгээр
удаашруулна гэсэн үг билээ. Хамгийн сүүлийн 1 гэсэн утга нь бөмбөрцөгийн радиусыг
илэрхийлж байна. Бөмбөрцөгт өөрийн гэсэн нэр өгөх хэрэгтэй түүнийг "My sphere"
гэж өгчээ. Харин одоо бөмбөрцөгтөө зориулж бас өнгө онооё.
s.setRandomColors();
бөмбөрцөгийг бүрдүүлж буй гурвалжингуудын орой бүрт санамсаргүй өнгөний утга
очино. Үүний ажиллаж байгаа програмаас хараарай.
Харин одоо хичээлийн гол зүйл болох шинээр node үүсгэцгээе.
Node n=new Node("My Node");
n.attachChild(b);
n.attachChild(s);
box болон sphere хоёроо rootNode-д хавсаргаж өгөхийн оронд эхлээд бид n гэж
үүсгэсэн node-д хавсаргаж өгч байна. Мөн бид энэ node-өө хүү node-үүдтэй нь
хамтаар 5 дахин томруулахыг хүсвэл
n.setLocalScale(5);
өмнө нь ашигласан setLocalTranslation-тай ижилхэн хэрэглэгдэж байна мөн
setLocalRotation гэсэн функц бас байдаг үүний тухай дараа өгүүлнэ.
scene graph маань дараах бүтэцтэй харагдаж байна.
Image
Та програмаа ажиллуулчаад B товчийг дарвал Bounding хийсэн хүрээ болоод таны
объектүүд харагдах болноо. parent/child хамааралыг bounding-аас харж болно
Image

_________________
whatever!


Top
   
PostPosted: Mar.19.10 4:23 am 
Offline
Ноёлон Ноёрхогч Гишvvн
Ноёлон Ноёрхогч Гишvvн
User avatar

Joined: Oct.25.06 2:00 am
Posts: 1079
Location: cyber world
Энэ постоороо 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);
}
}
[Програм ажиллаж байгаа байдал]
Image
Хамгийн эхний шинэ зүйл бол
// 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 маань
дараах байдалтай байх болно.
Image
За одоо танд гэрийн даалгавар өгье :) хэрвээ ойлгосон бол Пирамид объектийг
энэ TriMesh классыг ашиглаж хийгээрэй. Та бүгд доор коммент үлдээж болно.
Хэн нь хамгийн лаг хийсэн бэ гэдгийг шалгаруулсан ч болно. Хийсэн ажлаа
надад заавал шалгуулаарай за амжилт!
[Гэрийн даалгаварт өгсөн объект]
Image
[Энэ постын үр дүн]
Image

_________________
whatever!


Top
   
 Post subject: Re: Java Monkey Engine
PostPosted: Mar.19.10 5:34 am 
Offline
Ноёлон Ноёрхогч Гишvvн
Ноёлон Ноёрхогч Гишvvн
User avatar

Joined: Oct.25.06 2:00 am
Posts: 1079
Location: cyber world
Энэ постоор бид MaterialState, TextureState, LightState, PointLight классуудын хэрэглээг үзнэ.

import java.net.URL;
import com.jme.app.SimpleGame;
import com.jme.bounding.BoundingBox;
import com.jme.bounding.BoundingSphere;
import com.jme.image.Texture;
import com.jme.light.PointLight;
import com.jme.math.Vector3f;
import com.jme.renderer.ColorRGBA;
import com.jme.scene.Node;
import com.jme.scene.shape.Box;
import com.jme.scene.shape.Sphere;
import com.jme.scene.state.LightState;
import com.jme.scene.state.MaterialState;
import com.jme.scene.state.TextureState;
import com.jme.util.TextureManager;

public class HelloStates extends SimpleGame {
public static void main(String[] args) {
HelloStates app = new HelloStates();
app.setConfigShowMode(ConfigShowMode.AlwaysShow);
app.start();
}

protected void simpleInitGame() {
// Объектүүдээ эхлэн үүсгэх. Ямар нэгэн шинэ зүйл алга.
Box b=new Box("my box",new Vector3f(1,1,1),new Vector3f(2,2,2));
b.setModelBound(new BoundingBox());
b.updateModelBound();
Sphere s=new Sphere("My sphere",15,15,1);
s.setModelBound(new BoundingSphere());
s.updateModelBound();
Node n=new Node("My root node");

// Ачаалах текстур зургийн байгаа байрлалыг заасан URL хаягийг авах
URL monkeyLoc;
monkeyLoc=HelloStates.class.getClassLoader()
.getResource("jmetest/data/images/Monkey.jpg");

// TextureState-ийг авах
TextureState ts=display.getRenderer().createTextureState();
// TextureManager-ийг хэрэглэн текстурыг санах ойд ачаалах
Texture t=TextureManager.loadTexture(
monkeyLoc,
Texture.MinificationFilter.BilinearNearestMipMap,
Texture.MagnificationFilter.Bilinear);
// TextureState-д текстур зургаа даалгах
ts.setTexture(t);

// MaterialState-ийг авах
MaterialState ms=display.getRenderer().createMaterialState();
// MaterialState-д цацруулсан өнгө өгөх
ms.setEmissive(new ColorRGBA(0f,.2f,0f,1));

// Цэгэн гэрлийг үүсгэх
PointLight l=new PointLight();
// Цэгэн гэрэлд байрлал өгөх
l.setLocation(new Vector3f(0,10,5));
// Улаан гэрэл өгөх
l.setDiffuse(ColorRGBA.red.clone());
// Гэрэлтүүлэх
l.setEnabled(true);

// Гэрлээ дотор нь байруулахад зориулж LightState-ийг үүсгэх
LightState ls=display.getRenderer().createLightState();
// Гэрлийг хавсаргах
ls.attach(l);


// b-д renderstate ts-ийг мэдээлэх
b.setRenderState(ts);
// n нь renderstate ms-ийг хэрэглэх хэрэгтэй
n.setRenderState(ms);
// SimpleGame-аар хийгдсэн бүх хуучин гэрэлнүүдийг модноос салгах
lightState.detachAll();
// n зангилааны доор гэрлийн эффектийг өгөх
n.setRenderState(ls);

// b болон s -ийг n зангилаарүү хавсаргаад n-ийгээ rootNode-лүү хавсаргах
n.attachChild(b);
n.attachChild(s);
rootNode.attachChild(n);
}
}

[Програм маань ажилласан үр дүн]
Image
Шинэ зүйлээс эхлэн кодыг тайлбарлъя. Эхний код маань Сармагчны зургийг тодорхойлон зааж өгч байна.

// Ачаалах текстур зургийн байгаа байрлалыг заасан URL хаягийг авах
URL monkeyLoc;
monkeyLoc=HelloStates.class.getClassLoader()
.getResource("jmetest/data/images/Monkey.jpg");

бид энэ Monkey.jpg зургийг куб объект дээр наан хэрэгллэх юм. Үүний тулд бидэнд TextureState объект хэрэг болно.

// TextureState-ийг авах
TextureState ts=display.getRenderer().createTextureState();
Энд бидний хувьд шинэ зүйл гарч ирж байна. Дээрхи display объект нь SimpleGame класс дотор бичигдсэн байгаа. Рэндэрлэх үүрэгтэй объектийг нь авч байгаад түүнээсээ texturestate-ийг үүсгэн авч байна. Манай жишээ нь LWJGL-ийг хэрэглэж байгаа тул дээрхи байдалтай кодоор хийгдэж байна. Харин бид JOGL рэндэрлэгч санг хэрэглэж байгаа тохиолдолд TextureState маань JOGL-той харьцана. Энэ хоёр рэндэрлэгч орчноос хамааралгүй код бичихийг хүсвэл та дараах байдалтайгаар код бичих боломжтой.

// TextureState-ийг авах
TextureState ts=
DisplaySystem.getDisplaySystem.getRenderer().createTextureState();

SimpleGame дотор DisplaySystem.getDisplaySystem() ижилхэн чанартай байдаг. Бид одоо текстур төлөвтэй боллоо. Үүнийгээ Текстурлүү хавсаргая.
// TextureManager-ийг хэрэглэн текстурыг санах ойд ачаалах
Texture t=TextureManager.loadTexture(
monkeyLoc,
Texture.MinificationFilter.BilinearNearestMipMap,
Texture.MagnificationFilter.Bilinear);

Үүний тулд бид TextureManager-ийг хэрэглэнэ. Энэ класс нь URL-аар тодорхойлогдон санах ойд ачаалагдсан текстур зургуудыг зохицуулахад хэрэглэгддэг. MM_LINEAR болон FM_LINEAR утгууд нь текстурд ямар байдлаар шүүлтүүр хийхийг тодорхойлдог. Хамгийн сүүлийн true утга нь mipmap төлөв юм.

Texture State: Объектийн гадаргуу
Текстур зургийг объект бүрэхийн тулд бидэн TextureState класс хэрэг болно. Энэ классыг DisplaySystem-ээр үүсгэдэг.

// TextureState-ийг авах
TextureState ts=display.getRenderer().createTextureState();

Манай TextureState өмнө үүсгэсэн Texture объектийг хүлээн авахад бэлэн болсон

// Assign the texture to the TextureState
ts.setTexture(t);

TextureState нь өгөгдсөн зангилаа болон түүний хүү зангилаануудад зориулагдсан текстуруудын төлөвийг хариуцдаг. Нэг хоромд хариуцагддаг TextureState-ийн төлөвүүдийн тоо нь GPU дээрхи текстур байгууламжуудын тоотой тэнцүү.

MaterialState: Объектийн өнгө
Объект өнгө онооход бидэн MaterialState класс хэрэгтэй. мөн л DisplaySystem-ээр үүсгэгддэг.

// MaterialState-ийг авах
MaterialState ms=display.getRenderer().createMaterialState();

Зиа бид одоо MaterialState-тай болж авлаа тэгвэл үүнд өнгө өгөх хэрэгтэй:

// MaterialState-д өнгөний ялгаралуулалтыг өгөх
ms.setEmissive(new ColorRGBA(0f,.2f,0f,1));

The Emissive Color(Ялгаруулалттай өнгө) нь объектийг жаахан ногоон байдалтай харагдуулна. Доороосоо яагаад жаахан ногоон байгаа учир нь энэ. Материал нь объектийн өнгөний ялгаруулалтын чанар, орчны өнгө, өнгөний сариналт, тусгалын өнгө зэргээр тодорхойлогддог. Мөн материал нь объектийн цацаргалт объектийн альфа утга зэргээр тодорхойлогддог. Тэхээр MaterialState-д setEmissive, setSpecular, setDiffuse, setAmbient, setShininess. гэх зэрэг функцүүд байдаг.
MaterialStates болон per-vertex өнгө олголт хоёрын ялгаа нь MaterialState нь гэрэлтүүлэг сүүдэрлэлтийг хэрэглэдэгт байдаг. Энэ нь илүү дээр харагддаг гэсэн үг юм.


LightState
MaterialState болон TextureState хоёрын үзэгдэх байдал нь гэрлийн эх үүсвэрээс хамааралтай. Гэрлийн эх үүсвэрийг гэрлийг хариуцдаг LightState классаар хийдэг.

// Цэгэн гэрлийг үүсгэх
PointLight l=new PointLight();
// Байрлалыг нь оноох
l.setLocation(new Vector3f(0,10,5));

Дээрхи код нь цэгэн гэрлийн объектийг үүсгэж байна. PointLight-ийг чийдэнтэй зүйрлээрэй. Гэрэлд өөрийн гэсэн өнгө байж болдог тэхээр үүнд улаан өнгө өгье:

// Улаан өнгө өгье
l.setDiffuse(ColorRGBA.red.clone());

PointLight объектийг үүсгэсний дараа LightState-ийг гэрэлрүү хавсаргаж өгөх хэрэгтэй. LightState нь MaterialState-ийн өнгийг харагдах боломжийг олгоно. LightState нь мөн л DisplaySystem-ээр үүсгэгддэг.

// дотор нь гэрлээ тавихын тулд LightState-ийг үүсгэе
LightState ls=display.getRenderer().createLightState();
// Гэрлийг хавсаргах
ls.attach(l);


Объектийн төлөвүүдэд хандах
Бүх төлөвүүдээ үүсгэсний дараагаар тэдгээрийг өөрчлөхийг хүссэн зангилаандаа шилжүүлж өгье. n зангилаа нь b хайрцаг болон s бөмбөрцөгийн эцэг зангилаа юм. n зангилааны бүх хүү зангилаануудыг ms-ийн тусламжтайгаар ногоондуу өнгөтэй болгож байна. ls улаавтар гэрлийг n зангилаан дээр тусгаж өглөө. мөн сармагчны зурган текстурыг болох ts-ийг хайрцаган дээр тохируулъя.

// SimpleGame-д өмнө тохируулагдсан байсан бүх гэрлүүдийг усгах
lightState.detachAll();
// n зангилааны доорхи бүгдэд гэрэл өгөх
n.setRenderState(ls);
// ''n'' зангилаа нь ''ms'' ийг хэрэглэнэ гэдгийг илэрхийлнэ
n.setRenderState(ms);
// ''b'' хайрцаг ''ts''-ийг хэрэглэнэ
b.setRenderState(ts);

_________________
whatever!


Last edited by sharavsambuu on Mar.19.10 5:39 am, edited 1 time in total.

Top
   
 Post subject: Re: Java Monkey Engine
PostPosted: Mar.19.10 5:37 am 
Offline
Асуулт Самбарын Хvндэт Манаач
User avatar

Joined: Mar.12.09 10:10 pm
Posts: 4832
Location: Их дэлгүүрийн урд хүн хүлээж байна.
Ene engine-g ashiglaj diplomaa hiih gj bgaa asuudal garch irvel asuuna shu... tusalj demjeeree

_________________
хэв маягаа эвдэцгэе


Top
   
 Post subject: Re: Java Monkey Engine
PostPosted: Mar.19.10 5:50 am 
Offline
Ноёлон Ноёрхогч Гишvvн
Ноёлон Ноёрхогч Гишvvн
User avatar

Joined: Oct.25.06 2:00 am
Posts: 1079
Location: cyber world
тоглоом хийж байгаа юм уу? эсвэл ямар нэгэн симулаци?

_________________
whatever!


Top
   
 Post subject: Re: Java Monkey Engine
PostPosted: Mar.19.10 6:14 am 
Offline
Асуулт Самбарын Хvндэт Манаач
User avatar

Joined: Mar.12.09 10:10 pm
Posts: 4832
Location: Их дэлгүүрийн урд хүн хүлээж байна.
Poker-n togloom hiih gj bgaa tgd urid umnu n ashiglaj bgaagui...chadah l bgaa gj bodoj bn

_________________
хэв маягаа эвдэцгэе


Top
   
 Post subject: Re: Java Monkey Engine
PostPosted: Mar.20.10 10:30 am 
Offline
Tesseract Club Member
User avatar

Joined: Aug.23.05 8:06 pm
Posts: 2960
Location: АСУУЛТ.net
Нисгэгч wrote:
Poker-n togloom hiih gj bgaa tgd urid umnu n ashiglaj bgaagui...chadah l bgaa gj bodoj bn


Энд engine-ий хэрэг байна уу? :col:

_________________
B4 FB, JB was cool, ASUULT.Net


Top
   
 Post subject: Re: Java Monkey Engine
PostPosted: Mar.20.10 10:32 am 
Offline
Tesseract Club Member
User avatar

Joined: Aug.23.05 8:06 pm
Posts: 2960
Location: АСУУЛТ.net
JAVA-г 3D ер нь график тал дээр явцгүй гэж бодоод байдаг шд. Намайг сэнхрүүлээд өгөөч :D

_________________
B4 FB, JB was cool, ASUULT.Net


Top
   
 Post subject: Re: Java Monkey Engine
PostPosted: Mar.20.10 3:25 pm 
Offline
Ноёлон Ноёрхогч Гишvvн
Ноёлон Ноёрхогч Гишvvн
User avatar

Joined: Oct.25.06 2:00 am
Posts: 1079
Location: cyber world
жава харин хөөрхөн ажилчихдийншүү хурдны хувьд сүүлийн үеийн жава Си-тэй ойр дөхөж очино.

_________________
whatever!


Top
   
 Post subject: Re: Java Monkey Engine
PostPosted: Mar.21.10 2:51 am 
Offline
Tesseract Club Member
User avatar

Joined: Aug.23.05 8:06 pm
Posts: 2960
Location: АСУУЛТ.net
Гайгүй хурган юм байна. Сая хэд хэдэн бичлэг үзэв. Ганцхан хүн develop хийсэн нь сонирхолтой юм. JME 3.0-ийг нь хэр болохыг харж байя

_________________
B4 FB, JB was cool, ASUULT.Net


Top
   
 Post subject: Re: Java Monkey Engine
PostPosted: Mar.21.10 11:34 pm 
Offline
Ноёлон Ноёрхогч Гишvvн
Ноёлон Ноёрхогч Гишvvн
User avatar

Joined: Oct.25.06 2:00 am
Posts: 1079
Location: cyber world
.::Dexter::. wrote:
Гайгүй хурган юм байна. Сая хэд хэдэн бичлэг үзэв. Ганцхан хүн develop хийсэн нь сонирхолтой юм. JME 3.0-ийг нь хэр болохыг харж байя

jME 3.0 харин график карт сайтай комтой байх шаардлагатай юм билээ. Миний GMA 945 маань одоогоор jME 2.0.1 -ийг хөөрхөн ажиллуулчихдаг. гэхдээ HLSL мэтийн нэмэлт shading хэлнүүд нь ажиллахгүй байсан

_________________
whatever!


Top
   
 Post subject: Re: Java Monkey Engine
PostPosted: Jan.12.18 12:01 pm 
Offline
Шинэков Гишvvн
Шинэков Гишvvн

Joined: Jan.12.18 12:00 pm
Posts: 1
Ene deeer bga videog sergeeeh bolmj bga yuuuuu ihk goy sedw bnaa


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 25 posts ] 

All times are UTC+09:00


Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  

Copyright Asuult.NET © 2000-2015.
Administrative Contact: Khundaga Khurelbaatar [hundaga@hotmail.com]
Tel: 1-888-303-4927, Fax: 1-888-406-2264.
Powered by phpBB © 2000-2015 phpBB Group. Powered by phpBB® Forum Software © phpBB Limited