锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鎴戠洰鍓嶅彧鏄皾璇曚嬌鐢ㄤ簡MatrixTransform PositionAttitudeTransform Group Projection Switch 絳夊悇縐嶅姛鑳界殑緇勮妭鐐? 鍦ㄤ粙緇峂atrixTransform 鍜?PositionAttitudeTransform 鑺傜偣鍓?鎴戞兂鍏堜粙緇嶄笅osg褰撲腑鐭╅樀鐨勪竴浜涚浉鍏崇煡璇?
鍏跺疄,鏃犻渶鍏沖績osg鐭╅樀鏄浣曞疄鐜扮殑.浣嗘槸瑕佽浣忕殑鏄痮sg涓噰鐢ㄧ殑宸︿箻鎿嶄綔,鎴戜滑騫蟲椂閲岃璁虹殑鎿嶄綔濡傛棆杞鉤縐葷瓑.
OpenGL鐨? newpos = R* T * oldpos //鍏堟墽琛屽鉤縐?鍚庢墽琛?鏃嬭漿 (鍏ㄥ眬鍧愭爣緋?
osg褰撲腑: newpos =oldpos * T *R //鍏堟墽琛屽鉤縐?鍚庢墽琛屾棆杞?nbsp; (鍏ㄥ眬鍧愭爣緋?
鍥犱負鍦╫sg褰撲腑鐭╅樀鎵ц鐨勬搷浣滃垯鏄鐭╅樀鎿嶄綔.鍥犳涓轟簡璺烵penGL鐨勫垪鐭╅樀鍋氬悓姝?鑰屼笉鍦ㄥ畾涔夌殑鏃跺欏氨鐩稿綋浜庡仛浜嗕竴涓漿緗搷浣?鍗?br> 
鍥犳鍦╫sg/State 涓?鍦ㄤ嬌鐢╝pplyModelViewMatrix() osg/State 鏄疧penGL鐘舵佹満鐨勫皝瑁?鏄笌OpenGL浜や簰鐨勭被
![]()
Matrix
inline void applyModelViewMatrix(const osg::RefMatrix* matrix)
{
if (_modelView!=matrix)
{
if (matrix)
{
_modelView=matrix;
glLoadMatrix(matrix->ptr());
}
else
{
_modelView=_identity;
glLoadIdentity();
}
}
}
瀹冩槸鐩存帴浣跨敤glLoadMatrix(matrix)榪涜杞藉叆鐭╅樀鐨?鍥犳瀹冪殑杞疆鍒氬ソ閫傚簲浜哋penGL鍒椾紭鍏堢殑妯″紡.
浣犲彧闇鐗㈣ 鍦∣SG褰撲腑鍙樻崲鐨勬楠ゅ垯鏄乏涔樻搷浣?鍏ㄥ眬鍧愭爣緋?..鍗沖乏杈圭殑鏄厛鎵ц鍙樻崲鐨?
璋堝畬濡備笂鐨勯偅浜涗箣鍚?鎴戜滑鐜板湪鏉ョ湅MatrixTransform 鍜孭ositionAttitudeTransform.
鍙傝冨潗鏍囩郴鏈変笁縐?br> RELATIVE_RF, //鍏ㄥ眬 鐩稿 ()
ABSOLUTE_RF, //灞閮?nbsp; 緇濆 ()
ABSOLUTE_RF_INHERIT_VIEWPOINT //鍩轟簬瑙嗙偣涓涓眬閮ㄥ潗鏍囩郴.寰堝皯鐢ㄥ埌.
MatrixTransform 鏁呭悕 鐭╅樀鍙樻崲鑺傜偣.鍦ㄤ綅浜庡畠鐨勮妭鐐逛箣涓嬬殑鑺傜偣閮藉皢鎸夌収榪欏畠鐨勭煩闃靛彉鎹㈡潵榪涜妯″瀷鍙樻崲鎿嶄綔.鍥犳 MatrixTransform鐨勪富瑕佸姛鑳戒箣涓灝辨槸鎻愪緵妯″瀷鍙樻崲鎿嶄綔..浣犲彧瑕佹牴鎹綘鎵闇瑕佺殑璁劇疆鍏舵ā鍨嬬煩闃靛氨琛?
鍗蟲墽琛?setMatrix() 鍥犳.鏌ョ湅璁$畻褰撳墠World鐭╅樀鐨勬柟娉曞氨鍙互寰堟竻鏅扮殑鏄庣櫧鍏舵渶鍚庣粨鏋滃氨鏄?
濡傛灉鏄浉瀵圭殑.閭d箞 鍏堟墽琛岃嚜韜殑鍙樻崲,鍦ㄦ墽琛岀埗鑺傜偣鐨勫彉鎹㈡搷浣?榪欑被浼糘penGL涓悗鍐欑殑鍙樻崲鏄厛鎵ц鐨勪竴鏍?鍏ㄥ眬鍧愭爣緋昏冭檻)
鍚﹀垯鏄粷瀵圭殑,閭d箞褰撳墠鐭╅樀灝辨槸鑷韓鐭╅樀
![]()
MatrixTransform
bool MatrixTransform::computeLocalToWorldMatrix(Matrix& matrix,NodeVisitor*) const

{
if (_referenceFrame==RELATIVE_RF)
{
matrix.preMult(_matrix);
}
else // absolute
{
matrix = _matrix;
}
return true;
}
PositionAttibuteTransform 灝辨槸浣嶇疆濮挎佽妭鐐?.鍗蟲垜浠彧鍙互璋冩暣璇ヨ妭鐐圭殑鎵鏈夊瀛愮殑浣嶇疆浠ュ強濮挎?,鎴戜滑涔熷厛鏉ョ湅涓涓嬪畠鐨勭煩闃靛彉鎹?
![]()
Positon
bool PositionAttitudeTransform::computeLocalToWorldMatrix(Matrix& matrix,NodeVisitor*) const

{
if (_referenceFrame==RELATIVE_RF)
{
matrix.preMultTranslate(_position);
matrix.preMultRotate(_attitude);
matrix.preMultScale(_scale);
matrix.preMultTranslate(-_pivotPoint);
}
else // absolute
{
matrix.makeRotate(_attitude);
matrix.postMultTranslate(_position);
matrix.preMultScale(_scale);
matrix.preMultTranslate(-_pivotPoint);
}
return true;
}
PositionAttibuteTransform 鐨勭煩闃靛彉鎹㈤『搴忕殑鍥哄畾鐨?鍙互璇存槸MatrixTransform鐨勪竴涓壒渚?,鎿嶄綔欏哄簭鎴戝氨涓嶅湪璇﹁皥浜?鍥犱負瀹冪殑鍔熻兘灝辨槸涓轟簡瀹炵幇濮挎佸拰浣嶇疆.榪樻湁緙╂斁絳?
鍥犳 setPivotPoint 灝嗕嬌寰椾箣鍚庣殑鍙樻崲灝嗕細鍩轟簬姝ゅ鉤縐繪搷浣滄墽琛?
閭d箞瀹炵幇涓涓緥瀛愭潵瑙傚療浠栦滑鐨勬晥鏋? 涓嬮潰鐨勪緥瀛愬垯鏄?br><1> 浣跨敤PositionAttitudeTransform 璁劇疆宸﹁竟鐨勭墰. 浣嶇疆浣嶄簬(-10,0,0) 濮挎佷負緇晍杞存棆杞?0搴?
<2> 浣跨敤MatrixTransform 璁劇疆鍙寵竟鐨勭墰, 鍏堟墽琛屽鉤縐繪搷浣?10,0,0) 鍦ㄧ粫z杞存棆杞?0搴?鍥犳浣垮緱榪欏彧鐗涘亸灞忓箷鍐呴儴涓鐐?(浣犵敾涓潗鏍囪醬 鎸夊叏灞鎬濊礬婕旂ず 鍒欏氨鐭ラ亾鐗涘湪涓婇潰浣嶇疆浜?!)
![]()
渚嬪瓙
osg::Node* createTrans()

{
/**//** declare a root node*/
osg::Group* root = new osg::Group;
/**//** declare a Position Node*/
osg::PositionAttitudeTransform* posCow = new osg::PositionAttitudeTransform;
root->addChild(posCow);
/**//** declare a Matrix Node*/
osg::MatrixTransform* matrixCow = new osg::MatrixTransform;
root->addChild(matrixCow);
osg::Node* cow = osgDB::readNodeFile("cow.osg");

/**//**
When use Position Node and the ReferenceFrame is RELATIVE_RF
the matrix is Compute Trans(-pivot) * scale * Rotate * Trans(Pos)
here the pivot and scale is default,so it means that make rotate firstly.
*/
posCow->addChild(cow);
osg::Quat quat;
quat.makeRotate(osg::PI_2,osg::Vec3(0.0,0.0,1.0));
posCow->setAttitude(quat);
posCow->setPosition(osg::Vec3(-10,0.0,0.0));

/**//**
when use Matrix Node you can set the matrix what you want.
here , it make trans firstly and then make rotate.
*/
matrixCow->addChild(cow);
quat.makeRotate(osg::DegreesToRadians(60.0),osg::Vec3(0.0,0.0,1.0));
matrixCow->setMatrix(osg::Matrixd::translate(osg::Vec3(10.0,0.0,0.0))*osg::Matrixd::rotate(quat));
return root;
}
渚嬪瓙涓嬭澆鍦板潃 : 婧愪唬鐮佷笅杞?/a>
]]>
鍦ㄧ湅浜嗕竴浜涗箣鍚?澶ф浜嗚В浜嗕竴浜涘叧浜嶰penGL娓叉煋綆$嚎鐨勭煡璇?鐪嬩簡榪欎釜涔嬪悗瀵逛簬OpenGL鐨勫涔犳垜鎯沖簲褰撴槸寰堟湁甯姪.鍏充簬榪欎箞涓綃囩殑鍘熸枃鍒欐槸GLSL-LIGHTSOURCE 鏁欑▼涓涓紑綃囬儴鍒?鍘熸枃鍦板潃:
鏄嫳鏂囩殑..鎴戝湪osgchina鏁欑▼璁哄潧涓婁篃瑙佸埌榪嘑reeSouth澶х墰鐨勪腑鏂囩炕璇?.
鍏充簬娓叉煋綆$嚎灝嗕粈涔堝憿?鏃犻潪灝辨槸鍦∣penGL鐨勭閬撳綋涓悇涓儴鍒嗙殑鍔熻兘浠ュ強濡備綍鍦ㄧ閬撳綋涓艦鎴愪簡鎴戜滑鎯寵鐨勬渶緇堢殑涓騫呭浘.(鍍忕礌).鑰岀綰垮綋涓殑鎿嶄綔鍙垎涓轟互涓嬪嚑涓儴鍒?
闃舵1. 鎸囧畾鍑犱綍瀵硅薄.
濡?鐐?nbsp;綰?涓夎褰?絳変竴浜涘嚑浣曞浘鍏?.OpenGL緇樺埗鍑犱綍鍥懼厓鐨勬柟娉曟湁浠ヤ笅涓夌:
<1> 涓嬈′竴涓《鐐?鍗充嬌鐢╣lBegin() glVertex() glEnd() 鎸囧畾鍑犱綍瀵硅薄.
<2> 浣跨敤欏剁偣鏁扮粍..濡俫lDrawArrays.glDrawElements.絳?涓嬈℃х殑緇樺埗澶ч噺鍥懼厓.
涓婇潰榪欎袱縐嶆ā寮忓垯鏄珛鍗蟲ā寮?鍗蟲寚瀹氬畬鍥懼厓涔嬪悗浼氳绔嬪嵆娓叉煋.鍗沖皢鎵鏈夋暟鎹彂寰娓叉煋綆$嚎鍚庣珛鍗寵娓叉煋.
<3>鏄劇ず鍒楄〃妯″紡.瀹冨瓨鍌ㄤ簬OpenGL鏈嶅姟绔?(鎺ユ敹OpenGL鍛戒護鐨勪竴绔?) glNewList glEndList glCallList .
闃舵2 欏剁偣澶勭悊鎿嶄綔:
涓嶇浠ヤ笂鐨勫嚑浣曞璞℃槸濡備綍鎸囧畾鐨?鎵鏈夌殑鍑犱綍鏁版嵁閮藉皢浼氱粡榪囪繖涓樁孌?榪欎釜闃舵璐熻矗鐨勫垯鏄愪釜欏剁偣鐨勬搷浣?
鍦ㄨ繖涓樁孌佃兘鍋氱殑宸ヤ綔鍒欐槸:
1. 欏剁偣鍙樻崲...鏍規嵁妯″瀷瑙嗗浘鍜屾姇褰辯煩闃靛彉鎹?br> 2. 鍏夌収璁$畻 娉曠嚎鍙樻崲(娉曠嚎鐭╅樀 鏄ā鍨嬬煩闃電殑宸︿笂瑙?*3鐨勯嗙煩闃?鍜屾硶綰胯鏍煎寲
3. 綰圭悊鍧愭爣鍙樻崲.(綰圭悊鐭╅樀)
4.鏉愯川鐘舵?綰圭悊鍧愭爣鐢熸垚?
鑰屾渶閲嶈鐨勫垯鏄彉鎹互鍙婂厜鐓? 姣忎釜欏剁偣鍦ㄨ繖涓樁孌靛垎鍒槸鍗曠嫭澶勭悊鐨?
榪欎釜闃舵鎵鎺ユ敹鍒扮殑鏁版嵁鍒欐槸姣忎釜欏剁偣鐨勫睘鎬х壒寰?.杈撳嚭鍒欐槸鍙樻崲鍚庣殑欏剁偣鏁版嵁.
闃舵3 鍥懼厓緇勮
鍦ㄩ《鐐瑰鐞嗕箣鍚?欏剁偣鐨勫叏閮ㄥ睘鎬ч兘宸茬粡琚‘瀹?鍦ㄨ繖涓樁孌甸《鐐瑰皢浼氭牴鎹簲鐢ㄧ▼搴忛佸線鐨勫浘鍏冭鍒?
GL_POINTS GL_TRIANGLES 絳?灝嗕細琚粍瑁呮垚鍥懼厓
闃舵4 鍥懼厓澶勭悊(瑁佸壀 娑堥殣)
<1>榪欎釜姝ラ絎竴涓墍鍋氱殑搴斿綋鏄鍓搷浣?.浼氬皢鍥懼厓涓庣敤鎴峰畾涔夌殑瑁佸壀騫抽潰 鍗砱lClipPlane 鍜屾ā鍨嬫姇褰辯煩闃墊墍寤虹珛鐨勮鏅瘮杈? 榪欏皢浼氳鍓笖涓㈠純浣嶄簬瑙嗘櫙鍜岃鍓鉤闈㈠閮ㄧ殑鍥懼厓.涓嶅湪浜堜互澶勭悊.
<2> 鍏舵.鑻ユ槸閲囩敤閫忚鎶曞獎 閭d箞.灝嗕細瀵規瘡涓《鐐圭殑x,y z鍧愭爣鍒嗗埆闄や互w.
<3>绱ф帴鐫 鍒欐槸鐢辮鍙e彉鎹㈠皢欏剁偣鍧愭爣鍙樻崲鑷崇獥鍙e潗鏍?
<4> 鎵ц娑堥殣鎿嶄綔
闃舵5 鏍呮牸鍖栨搷浣?/span>
<1>鐢卞浘鍏冨鐞嗕紶閫掕繃鏉ョ殑鍥懼厓鏁版嵁.鍦ㄦ灝嗕細琚垎瑙f垚鏇村皬鐨勫崟鍏冨茍瀵瑰簲甯х紦鍐插尯鐨勫悇涓儚绱?榪欎簺鍗曞厓琚О涔嬩負 鐗囧厓. 涓涓墖鍏冨彲鑳藉寘鍚獥鍙e乏杈?娣卞害 棰滆壊 綰圭悊鍧愭爣絳夊睘鎬?
<2> 鐗囧厓鐨勫睘鎬у垯鏄浘鍏冧笂欏剁偣鏁版嵁絳?span style="COLOR: red">緇忚繃鎻掑?/span>鑰岀‘瀹氱殑..榪欓噷鐢熸垚鐨勭墖鍏冨皢浼氬寘鍚富棰滆壊鍜屾棰滆壊.
glShadeMode() 鍑芥暟鐨勪綔鐢ㄥ皢浼氳繖閲屼綋鐜?鍗充嬌鐢ㄦ彃鍊?騫蟲粦鐫鑹? 鎴栬呬嬌鐢ㄦ渶鍚庝竴涓《鐐歸鑹?騫抽潰鐫鑹?
<3> 鐐瑰 綰垮.澶氳竟褰㈡ā寮?姝i潰鑳岄潰絳変竴浜涚壒寰佷篃灝嗘槸榪欓樁孌靛彂鐢熶綔鐢?
<4> 鍙嶈蛋鏍蜂篃鏄繖涓樁孌佃搗浣滅敤.
闃舵6 鐗囧厓澶勭悊
<1>涓婄汗鐞?閫氳繃綰圭悊鍧愭爣鍙栧緱綰圭悊鍐呭瓨涓浉瀵瑰簲鐨勯鑹?br> <2> 闆懼寲 閫氳繃鐗囧厓璺濈褰撳墠瑙嗙偣浣嶇疆淇敼棰滆壊.
<3> 棰滆壊姹囨?.(榪欎釜涓庢販鍚堝畬鍏ㄤ笉鍚屾蹇?灝?綰圭悊,涓誨畾涔夌殑棰滆壊,闆懼寲鐨勯鑹?嬈¢鑹插厜鐓ч樁孌佃綆楃殑棰滆壊)姹囨諱竴璧?
闃舵7 閫愪釜鐗囧厓鐨勬搷浣?br> <1> 鎵鏈夌殑涓浜涙祴璇?鍍忕礌鎵鏈夋潈 鍓垏(glScissor) Alpha嫻嬭瘯(glAlphaFunc) 妯$増嫻嬭瘯(glStencilFunc)
娣卞害嫻嬭瘯 (glDephtFunc) 娣峰悎(glBlendFunc)
榪欎簺鎿嶄綔灝嗕細鏈鍚庡獎鍝嶅叾鍦ㄥ撫緙撳啿鍖虹殑棰滆壊鍊?
闃舵8 甯х紦鍐叉搷浣?/span>
<1>榪欎釜闃舵鎵ц甯х紦鍐茬殑鍐欏叆絳夋搷浣滅瓑..鏈鍚庝駭鐢熶簡鏄劇ず鍑烘潵鐨勫儚绱?
glColorMask glStrncilMask glDepthMask glClearDepht glClearStencil glClearColor 絳?灝嗗湪榪欎釜闃舵褰卞搷鍐欏叆鐨勫?
浠ヤ笂鍙槸璁ㄨOpenGL 鍥懼厓緇樺埗鐨勫熀鏈繃紼?閭d箞鍩轟簬鍍忕礌鍥懼儚緇樺埗.鍑犱箮褰㈠悓涔嬩笂..鍙槸鍦ㄥ厜鏍呭寲澶勭悊鍓嶇殑鎿嶄綔涓嶄竴鏍?鍗崇粡榪囧儚绱犺В鐮?鍍忕礌浼犺緭.鏍呮牸鍖?鏈鍚庡艦鎴愮墖鍏?..鐗囧厓涔嬪悗鐨勫鐞嗗畬鍏ㄤ竴鏍?.
鍥犳 鍦ㄧ潃鑹插櫒緙栫▼棰嗗煙..浣犲皢鍙疄鐜?br> Vertex Shader 鏇挎崲 欏剁偣澶勭悊闃舵
Fragment Shader 鏇挎崲 鐗囧厓澶勭悊闃舵
Geometry Shader 鏇挎崲 鍥懼厓緇勮闃舵..
鍥犱負榪欎笁涓樁孌墊墍鍐沖畾閮芥槸鏈閲嶈鏁堟灉鐨勯樁孌?.瀵逛簬榪欎簺鐨勫彲緙栫▼灝嗗甫鏉ラ潪甯稿ぇ鐨勫ソ澶勪互鍙婂彲鎺у埗鐨勬覆鏌?!
]]>
Drawable 鏁呭悕 鍙粯鍒剁殑.. 閭d箞浠涔堟墠鏄彲緇樺埗鐨?鎴戜滑鍙互鎯寵薄.甯鎬嬌鐢ㄧ殑鐐?綰?涓夎褰?鍥涜竟褰?絳?榪欎簺灝辨槸鍙粯鍒剁殑.OpenGL澶у彲鍙兘瀹炵幇緇樺埗鏈緇堜篃鍙槸榪欎簺..
緇忓父浣跨敤鐨勫満鏅浘鏄竴鑸兘鏄竴棰楁爲. 閭d箞鍦∣SG涔熶笉渚嬪.瀹冩槸涓棰楄妭鐐規爲.鍏舵渶鏈ⅱ鐨勮妭鐐規槸Geode.鍗沖彾瀛愯妭鐐? 涓涓狦eode鍙互鍖呭惈澶氫釜Drawable.鍥犳鍦∣SG涓垜浠兂瑕佺粯鍒惰濡備笁瑙掑艦絳?鏈緇堥渶瑕佷嬌鐢ㄧ殑鑲畾涔熸槸Geode鍙跺瓙鑺傜偣.鐒跺悗灝咲rawable鍔犲叆Geode涓?..
osg/Drawable 鍙槸涓涓娊璞$被.閭d箞瀹炵幇瀹冪殑綾繪湁澶氬皯鍛? 榪樻槸姣旇緝澶氱殑.
鑰岃繖涓棿鏈甯哥敤鐨勮帿灞濭eometry.鍑犱綍浣撶粯鍒?.鑰岃鍒板嚑浣曚綋.闇瑕佺殑鏃犻潪鏄偣..棰滆壊.浠ュ強濡備綍緇勬垚鍥懼厓<Primitive>..
鍥犳涓涓狦eometry闇瑕佹嫢鏈夌殑鏁版嵁澶у彲鏈夌偣.娉曠嚎鍧愭爣 綰圭悊鍧愭爣.绱㈠紩鍊?..浠ュ強PrimitiveSet.
鐐?娉曠嚎,棰滆壊絳?闇瑕佺敤鍒扮煝閲?鍗?osg::Vec2 osg::Vec3 osg::Vec4
PrimitiveSet.鍒欏寘鍚簡緇勬垚濡備綍緇勬垚涓涓浘鍏冪殑瑙勫垯..濡侴L_POINT GL_TRIANGLES.絳?
鐢ㄥ疄渚嬭鏄庡惂.濡備嬌鐢ㄤ笅闈㈣繖孌典唬鐮佸皢浼氬垱寤轟竴涓褰╃殑涓夎褰?鍜屼竴涓櫧鑹茬殑绔嬫柟浣?
![]()
Geode
osg::Node* create()

{
/**//**
geode is a leaf node,It must contain some drawables..
*/
osg::Geode* geode = new osg::Geode;

/**//** define a Geometry for draw a triangle.*/
osg::Geometry* triangle = new osg::Geometry;
geode->addDrawable(triangle);

/**//** triangle Vertexs */
osg::Vec3Array* Tvertex = new osg::Vec3Array;
triangle->setVertexArray(Tvertex);
Tvertex->push_back(osg::Vec3(-2.0,0.0,-1.0));
Tvertex->push_back(osg::Vec3( 0.0,0.0,-1.0));
Tvertex->push_back(osg::Vec3(-1.0,0.0, 1.0));

/**//** set the color */
osg::Vec3Array* Tcolor = new osg::Vec3Array;
triangle->setColorArray(Tcolor);
triangle->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
Tcolor->push_back(osg::Vec3(1.0,0.0,0.0));
Tcolor->push_back(osg::Vec3(0.0,1.0,0.0));
Tcolor->push_back(osg::Vec3(0.0,0.0,1.0));

/**//** set the normal*/
osg::Vec3Array* Tnormal = new osg::Vec3Array;
Tnormal->push_back(osg::Vec3(0.0,-1.0,0.0));
triangle->setNormalArray(Tnormal);
triangle->setNormalBinding(osg::Geometry::BIND_OVERALL);

/**//** set the Primitive use GL_TRIANGLES*/
osg::PrimitiveSet* Tprimitive = new osg::DrawArrays(GL_TRIANGLES,0,3);
triangle->addPrimitiveSet(Tprimitive);


/**//** now define a box(center,width)*/
osg::Box* boxtest = new osg::Box(osg::Vec3(1.5,0.0,0.0),1.0);
/**//** use the ShapeDrawable*/
osg::ShapeDrawable* box = new osg::ShapeDrawable(boxtest);
geode->addDrawable(box);
return geode;
}
榪欓噷鎴戝皢瑙i噴涓浜涗笢瑗?
1.Geometry榛樿鏄嬌鐢ㄦ樉紺哄垪琛ㄦ潵緇樺埗鍥懼厓鐨?浣犲ぇ鍙鐪嬫簮鐮佹垨鏂囨。鍘諱簡瑙?浣犲彲浠ヨ緗?br> setUseDisplayList(false) 紱佺敤瀹?鎴栬呰嫢鍦ㄧ粦瀹氭暟鎹殑鏃跺欎嬌鐢ㄤ簡BING_PER_PRIMITIVE涔熷皢浼氱鐢ㄦ樉紺哄垪琛?br> 2.ShapeDrawable 鍒欐槸鍐呯疆涓浜涘艦鐘剁殑鍥懼厓.璇稿 鍦嗘煴.鐞冧綋.鍦嗛敟絳?鑷繁瀹炵幇灝濊瘯涓涓?
3.BING_PER_VERTEX 鍒欐寚鐨勬瘡涓《鐐瑰搴斾簬涓縐嶅睘鎬?濡備緥瀛愪腑鐨勯鑹?.
4.BING_OVERALL 鍒欐槸鍏ㄩ儴欏剁偣浣跨敤涓鏍風殑灞炴?濡備緥瀛愪腑鐨勬硶綰?
瀹炰緥婧愪唬鐮佷笅杞? ..涓嬭澆鍦板潃
蹇樹簡璇存槑涓鐐?鍦∣SG褰撲腑鐨勫潗鏍囩郴鏄?z鏈濅笂.y鏈濋噷.x鏈濆彸..涓嶰penGL涓垰濂界粫x杞存棆杞簡90搴?.
榪樻湁涓鐐瑰垯鏄?鎴戜滑閫氬父鎯呭喌涓嬮粯璁や嬌鐢ㄨ鏅櫒鍏朵腑鐨勪竴涓叧浜庢憚鍍忔満婕父鍣ㄥ叾瀹為粯璁ゆ槸浣跨敤TrackballManipulator 鍥犳.瀹冧細灝嗚鐐逛腑蹇冩寚鍚戞暣涓満鏅殑鍖呭洿鐞冧腑蹇?..
鏈緇堢粨鏋滃浘:濡備笅:
]]>
]]>
Osg 鍗砄penSceneGraph鐨勭畝縐?鏄竴嬈懼紑婧愮殑鍦烘櫙鍥懼艦搴?鍚屾椂瀹冧篃鏄法騫沖彴鐨?.Osg瀹冨熀浜庡満鏅浘鐨勬蹇?鍒╃敤浜嗚蔣浠跺紑鍙戝綋涓殑璁捐妯″紡鐨勭悊蹇?璁捐騫舵彁渚涗簡涓涓熀浜嶰penGL搴曞眰鐨勯潰鍚戝璞$殑鍥懼艦寮鍙戞鏋?.
Osg鏄畬鍏ㄧ敱鏍囧噯C++鍜孫penGL鑰屽啓鐨?鍏呭垎鍒╃敤STL鍜岃璁℃ā寮忕殑鐗規?鍙互璇存槸鍏鋒湁楂樻ц兘,鍙墿灞?鍙Щ妞嶇殑鐗規?灝辯洰鍓嶆潵璁蹭技涔庢槸瓚婃潵瓚婃祦琛岃搗鏉ョ殑涓嬈鵑潪甯告鐨勫満鏅浘褰㈠簱.浠嶉渶瑕佹洿璇︾粏鐨勮В閲婃柟鍙幓瀹樻柟緗戠珯絳夋煡鐪?gt;_<..
浜?鍏充簬OSG鐨勫涔?
1.鐢變簬OSG鏄紑婧愮殑,鐜板湪宸茬粡鍙戝睍鍒頒簡2.9鐗堟湰浜?浠g爜閲忎篃鏃ヨ秼閫掑鐨勮秼鍔?鑰岀己灝戝畬鍠勭殑鏂囨。.鎵浠ヨ閫氳浠g爜宸茬粡鏄歡闈炲父鐥涜嫤鐨勫涔犺繃紼?浣嗘槸榪欎緷鐒舵槸涓渶涓昏鐨勬柟寮忎箣涓.浠諱綍鐨勮В閲婁綘閮藉彲鑳藉湪浠g爜涓緱鍒拌В絳?
2.鍏舵 鑻辨枃鐗堢殑瀹樻柟緗戠珯 鍜屼腑鏂囩殑瀹樻柟璁哄潧涔熸槸涓涓涔犵殑鍦版柟.鍦╫sgchina璁哄潧甯鎬細寰楀埌array鍜宖lysky涓や綅鐗堜富鐨勮緇嗚В絳斿拰寤鴻..osg鑻辨枃瀹樻柟緗戠珯 osg涓浗瀹樻柟緗戠珯
3.閭歡鍒楄〃..鍒楄〃褰撲腑閮芥槸涓浜涘緢緇忓吀鐨勯棶棰?浣犲彲浠ラ氳繃閭璁㈤槄鏉ヨ幏寰?璇寸湡鐨?鎴戜篃娌℃庝箞緇嗙湅....鑻辨枃姘村鉤涓嶉珮>_<.鎵浠ュ憿榪樺湪鎭惰ˉ鐫鑻辮... 閭歡鍒楄〃鍦板潃
4.鏈変釜闈炲父钁楀悕鐨勬暀紼?.緹庡浗嫻峰啗鍏充簬OSG鐨勬暀紼?.NPS...鏁欑▼鍦板潃 .
娌℃兂鍒板眳鐒舵崲浜嗕釜鍦板潃瀹蟲垜鎵句簡鍗婂ぉ>_<..ofcourse English. 涓枃鐗堢殑璇戞枃浣犲彲浠ュ湪osgchina鐨勮鍧涢噷鎵劇殑鍒?浣嗗ソ鍍忎笉鍏ㄩ潰.
5. osg婧愪唬鐮佷腑鐨勬墍鏈変緥瀛?examples...
6. 鍏舵鍛?鎺屾彙涓瀹氱殑OpenGL鍩虹涔熸槸闈炲父濂界殑瀛︿範鍓嶆彁.鎴戝氨鏄繖涓や釜鍚屾椂涓璧峰鐨?gt;_<,
涓?鍏充簬OSG鐨勪竴浜涘唴瀹?
1.絎竴涓噸鐐瑰垯鏄満鏅鐞嗙殑鑳藉姏.鍙互鐞嗚В鎴愭槸涓棰楀満鏅爲.
2.osg鐨勫満鏅浘褰㈠崟綰跨▼/澶氱嚎紼?娓叉煋 (娓叉煋榪囩▼鍒嗕負:鐘舵佹爲鍜屾覆鏌撴爲)
3.osg涓疄鐜板緢澶氶潪甯稿疄鐢ㄧ殑宸ュ叿鍛,妯″瀷璇誨彇絳?騫朵笉闇瑕佹垜浠嚜宸卞啓寰堝浠g爜鍘誨疄鐜拌繖鏂歸潰鐨勫唴瀹?
4.osg闆嗘垚鎵鏈夌殑OpenGL鐨勭姸鎬佸拰Shader鐨勪竴浜涘唴瀹?.榪樻湁鐭╅樀榪愮畻絳?
榪樻湁璁稿鍐呭鎴戝茍娌℃湁璇寸殑鍒?gt;_< 鍥犱負鎴戝彧鏄湅浜嗕竴涓湀鐨勪唬鐮佸拰璧勬枡..涔熸病鏈夊畬鏁寸殑鍐欒繃寰堝紼嬪簭.鎵浠ユ垜渚濈劧榪樺湪瀛︿範褰撲腑.>_<
鍩轟簬浠ヤ笂鎴戜滑鍙互璁や負.OSG鏄竴涓潪甯稿疄鐢ㄧ殑楂樺眰鍥懼艦搴旂敤.
鍏充簬1.2涓ら儴鍒嗗唴瀹逛綘鍙弬鑰?Array鐗堜富鐨勬煇綃囧ぇ浣?<鏈闀跨殑涓甯?gt; 璇﹁堪浜哋SG褰撲腑涓甯у綋涓彂鐢熺殑鎵鏈変簨鎯?.
鍏充簬絎笁.閮ㄥ垎 涓昏鐨勯泦涓?osgDB鍜宱sgUtil 榪欎袱涓簱褰撲腑.
鍏充簬絎洓閮ㄥ垎 OpenGL鐘舵侀泦鍚堜富瑕佹槸 osg/StateSet 鍜?osg/StateAttribute osg/Shader osg/Matrix絳夎澶氱被褰撲腑闆嗘垚浜?
榪欐槸鎴戠洰鍓嶆墍鑳借鏄庣殑涓浜?gt;_< 姣曠珶鎴戜篃鍙槸鍒濆鑰?.
鎴戜細灝嗚繖浜涘ぉ浠ユ潵鐨勫涔犱互鍙婁唬鐮佺殑闃呰榪囩▼涓竴浜涙葷粨鐢氳嚦浣撲細鍐欎笅鏉?..
]]>
闄勪笂鏈榪戝NEHE 鍐欑殑1-24鐨勪唬鐮?gt;_< 鍐呴儴娉ㄦ湁璇︾粏娉ㄩ噴,濡傛湁浜涘嚱鏁板姛鑳藉彲璇︾湅opengl鏂囨。鍚?nbsp; :涓嬭澆鍦板潃
]]>
]]>
]]>
]]>
]]>
]]>
]]>
]]>
lesson_4鐨勫唴瀹瑰湪lesson_3鐨勫熀紜涓婃坊鍔犱簡閮ㄥ垎鍐呭鑰屽啓鎴愮殑.榪欒褰撲腑,灝嗕細浣跨敤鍒版ā鍨嬪彉鎹㈢殑鏃嬭漿鍙樻崲.
鍓嶅嚑嬈?鏇句嬌鐢ㄤ簡glTranslatef(d)鏉ョЩ鍔ㄦā鍨?榪欐灝嗕嬌鐢╣lRotatef 鏉ユ棆杞ā鍨?鑰屼負浜嗙湅鍒頒竴涓姩鐢葷殑鏁堟灉,灝嗘敞鍐屼竴涓┖闂插洖璋冨嚱鏁?浣垮緱瑙掑害涓嶆柇鑷.
#include "openglglut.h"

/**//*
** opengl 鏁欑▼絎洓璇懼唴瀹?br>
** 鍦ㄧ獥鍙g殑宸﹁竟閮ㄥ垎緇樺埗涓涓褰╃殑涓夎褰?瀹冨皢浣跨敤騫蟲粦鐫鑹?br>
** 鍦ㄧ獥鍙g殑鍙寵竟閮ㄥ垎緇樺埗涓涓摑鑹茬殑姝f柟褰?瀹冨皢浣跨敤鍗曡皟鐫鑹?br>
** 浣垮緱宸﹁竟鐨勪笁瑙掑艦緇昚杞翠笉鍋滄棆杞?br>
** 浣垮緱鍙寵竟鐨勬鏂瑰艦緇晉杞翠笉鍋滄棆杞?br>
*/
double yRot=0.0; //涓夎褰㈢粫y杞存棆杞殑瑙掑害
double xRot=0.0; //涓夎褰㈢粫x杞存棆杞殑瑙掑害
int main(int argc, char** argv)

{
/**//** 鍒濆鍖栫獥鍙?nbsp;騫跺垱寤虹獥鍙?/span>*/
createWindow("opengl lesson_4",&argc,argv);

/**//** 娉ㄥ唽glut鐨勪竴浜涘嚱鏁?nbsp;*/
glutReshapeFunc(glutResize); //紿楀彛璋冩暣鍑芥暟 浣垮緱璋冩暣鍚庡浘褰㈡樉紺轟笉鍙戠敓鏀瑰彉
glutIdleFunc(glutIdle); //絀洪棽鍥炶皟鍑芥暟 浣垮緱鍦ㄧ┖闂叉椂闂村唴榪涜涓浜涙搷浣?/span>
glutDisplayFunc(glutDisplay); //閲嶇粯鍑芥暟 浣垮緱鍙互鍦ㄧ獥鍙d腑緇樺埗鍥懼艦
glutSpecialFunc(glutSpecial); //鐗規畩鎸夐敭鍑芥暟 浣垮緱瀹炵幇鍏ㄥ睆/紿楀彛鍒囨崲
/**//** 鍒濆鍖杘pengl鐨勪竴浜涙搷浣?/span>*/
InitOpenGL();

/**//** 榪涘叆浠跨湡寰幆*/
glutMainLoop();
}
/**//** 瀹炵幇澶存枃浠跺綋涓畾涔夌殑緇樺埗鍑芥暟 緇樺埗涓夎褰㈠拰姝f柟褰?nbsp;**/
void glutDisplay(void)

{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity(); //灝嗗厛鍒濆鍖栧崟浣嶇煩闃?/span>
glPushMatrix(); //灝嗗綋鍓嶇煩闃靛鍒朵竴涓帇鍏ユ爤欏?騫朵繚鎸佸綋鍓嶇煩闃典笉鍙?/span>
glTranslatef(-1.5,0.0,-6.0);
glRotatef(yRot,0.0,1.0,0.0); //浣垮緱涓夎褰㈢粫y杞存棆杞瑈Rot瑙掑害
//鍐沖畾涓夎褰笁涓《鐐圭殑棰滆壊鍊?涓夎褰㈠唴閮ㄥ悇涓偣鐨勯鑹插皢浼氭槸綰挎ф彃鍊肩殑
glBegin(GL_TRIANGLES); // 緇樺埗涓夎褰?/span>
glColor3f(1.0f,0.0f,0.0f); //浣跨敤綰㈣壊緇樺埗涓婇《鐐?/span>
glVertex3f( 0.0f, 1.0f, 0.0f); //涓婇《鐐?/span>
glColor3f(0.0f,1.0f,0.0f); //浣跨敤緇胯壊緇樺埗宸︿笅欏剁偣
glVertex3f(-1.0f,-1.0f, 0.0f); //宸︿笅
glColor3f(0.0f,0.0f,1.0f); //浣跨敤钃濊壊緇樺埗鍙充笅欏剁偣
glVertex3f( 1.0f,-1.0f, 0.0f); //鍙充笅
glEnd();
glPopMatrix(); //鎭㈠褰撳墠鐭╅樀涓轟笂涓嬈ush鏃剁殑鐭╅樀
glTranslatef(1.5f,0.0f,-6.0f);
glRotatef(xRot,1.0,0.0,0.0); //浣垮緱姝f柟褰㈢粫x杞存棆杞瑇Rot瑙掑害
glColor3f(0.0f,0.0f,1.0f); //灝嗗綋鍓嶉鑹插艱緗負钃濊壊 緇樺埗鏁翠釜姝f柟褰?/span>
glBegin(GL_QUADS); // 緇樺埗姝f柟褰?/span>
glVertex3f(-1.0f, 1.0f, 0.0f); // 宸︿笂
glVertex3f( 1.0f, 1.0f, 0.0f); // 鍙充笂
glVertex3f( 1.0f,-1.0f, 0.0f); // 宸︿笅
glVertex3f(-1.0f,-1.0f, 0.0f); // 鍙充笅
glEnd();
glutSwapBuffers(); //寮哄埗緇樺浘鍛戒護鎵ц緇樺埗鍦ㄧ紦鍐插尯浜ゆ崲鍑烘潵
}
/**//** 瀹炵幇澶存枃浠跺綋涓0鏄庣殑絀洪棽鍥炶皟鍑芥暟*/
void glutIdle(void)

{
yRot+=0.2f; //澧炲姞涓夎褰㈡棆杞搴?/span>
xRot-=0.15f; //鍑忓皯姝f柟褰㈠噺灝戣搴?/span>
glutPostRedisplay(); //浣垮緱鎵ц瀹岃鍑芥暟鍚庤皟鐢ㄩ噸緇樺嚱鏁?/span>
}
鏈緇堢殑緇撴灉鏄?
鏈熬鎬葷粨:
glRotatef(angle,x,y,z) 灝嗕負浣垮緱妯″瀷緇曚換鎰忚醬鏃嬭漿angle瑙掑害.瀹冨皢浼氫駭鐢熶竴涓棆杞煩闃靛彸涔樺綋鍓嶇煩闃?鎵浠ユ敼鍙樹簡褰撳墠鐭╅樀.鑰屼負浜嗕嬌寰楃粯鍒剁殑鏃跺欏乏杈圭殑涓夎褰笉褰卞搷鍒板彸杈規鏂瑰艦鐨勫彉鎹㈢煩闃墊晠鍦ㄧ粯鍒朵笁瑙掑艦涔嬪墠浣跨敤glPushMatrix()淇濆瓨褰撳墠鐭╅樀,緇樺埗瀹屾垚涔嬪悗浣跨敤glPopMatrix() 鎭㈠涔嬪墠鐨勭煩闃?褰撶劧涔熷彲浠ヤ嬌鐢╣lLoadIdentity()璁劇疆褰撳墠鐭╅樀涓哄崟浣嶇煩闃電殑鏂規硶鏉ュ疄鐜板畠..
鍏舵,榪欐澶氫簡浠ヤ釜glIdleFunc() 娉ㄥ唽絀洪棽鍥炶皟鍑芥暟.鍗沖湪緋葷粺娌℃湁鍏朵粬浜嬩歡澶勭悊鐨勬椂鍊欏皢澶勭悊榪欎釜鍑芥暟,浣垮緱鏃嬭漿鐨勮搴︿笉鏂敼鍙?
glPostRedisplay() 浣垮緱褰撳墠紿楀彛灝嗕細榪涜閲嶇粯..鏍規嵁瑙掑害鐨勬敼鍙?浠庤屼嬌寰楁垜浠湅鍒扮殑鏄竴涓棆杞綋涓殑鍔ㄧ敾鏁堟灉
鏈鍚庡皢璇存槑涓鐐圭殑鏄?鎴戞浘鍦ㄧ孩瀹濅功鐪嬪埌涓孌靛唴瀹?鏈夋椂鍊欎負浜嗗疄鐜拌繛緇殑鏃嬭漿,鎴戜滑鍙兘浼氭兂鍒伴噸澶嶅簲鐢ㄤ竴涓煎緢灝忕殑鏃嬭漿鐭╅樀,榪欎釜浼氬瓨鍦ㄤ竴涓棶棰?灝辨槸璇樊,浣垮緱鍙樻崲绱Н緇撴灉.鎴戜滑搴旇鎽掑純榪欑鍋氭硶.鍗充嬌鐢ㄤ竴涓柊鐨勮搴︽潵鍙樻崲.灝卞皢浣跨敤濡備笅鐨勬柟娉?
glLoadIdentity();
glRotatef(new_angle,x,y,z);
鍙new_angle=old_angle+offset
]]>
lesson_2涓?鐭ラ亾浜嗗浣曠畝鍗曠殑緇樺埗鍩烘湰鍥懼艦鐨勫悗,榪欐灝嗚瀛︿範濡備綍浣跨敤glColor3d(f)鏉ヨ緗畂pengl鐘舵佹満涓殑棰滆壊.浣垮緱緇樺埗鏃跺欏皢閲囩敤鑷畾涔夌殑棰滆壊鍊?
#include "openglglut.h"

/**//*
** opengl 鏁欑▼絎笁璇懼唴瀹?br>
** 鍦ㄧ獥鍙g殑宸﹁竟閮ㄥ垎緇樺埗涓涓褰╃殑涓夎褰?瀹冨皢浣跨敤騫蟲粦鐫鑹?br>
** 鍦ㄧ獥鍙g殑鍙寵竟閮ㄥ垎緇樺埗涓涓摑鑹茬殑姝f柟褰?瀹冨皢浣跨敤鍗曡皟鐫鑹?br>
*/
int main(int argc, char** argv)

{
/**//** 鍒濆鍖栫獥鍙?nbsp;騫跺垱寤虹獥鍙?/span>*/
createWindow("opengl lesson_3",&argc,argv);

/**//** 娉ㄥ唽glut鐨勪竴浜涘嚱鏁?nbsp;*/
glutReshapeFunc(glutResize); //紿楀彛璋冩暣鍑芥暟 浣垮緱璋冩暣鍚庡浘褰㈡樉紺轟笉鍙戠敓鏀瑰彉
glutDisplayFunc(glutDisplay); //閲嶇粯鍑芥暟 浣垮緱鍙互鍦ㄧ獥鍙d腑緇樺埗鍥懼艦
glutSpecialFunc(glutSpecial); //鐗規畩鎸夐敭鍑芥暟 浣垮緱瀹炵幇鍏ㄥ睆/紿楀彛鍒囨崲

/**//** 鍒濆鍖杘pengl鐨勪竴浜涙搷浣?/span>*/
InitOpenGL();

/**//** 榪涘叆浠跨湡寰幆*/
glutMainLoop();
}
void glutDisplay(void)

{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity(); //灝嗗厛鍒濆鍖栧崟浣嶇煩闃?/span>
glPushMatrix(); //灝嗗綋鍓嶇煩闃靛鍒朵竴涓帇鍏ユ爤欏?騫朵繚鎸佸綋鍓嶇煩闃典笉鍙?/span>
glTranslatef(-1.5,0.0,-6.0);
//鍐沖畾涓夎褰笁涓《鐐圭殑棰滆壊鍊?涓夎褰㈠唴閮ㄥ悇涓偣鐨勯鑹插皢浼氭槸綰挎у樊鍊肩殑
glBegin(GL_TRIANGLES); // 緇樺埗涓夎褰?/span>
glColor3f(1.0f,0.0f,0.0f); //浣跨敤綰㈣壊緇樺埗涓婇《鐐?/span>
glVertex3f( 0.0f, 1.0f, 0.0f); //涓婇《鐐?/span>
glColor3f(0.0f,1.0f,0.0f); //浣跨敤緇胯壊緇樺埗宸︿笅欏剁偣
glVertex3f(-1.0f,-1.0f, 0.0f); // 宸︿笅
glColor3f(0.0f,0.0f,1.0f); //浣跨敤钃濊壊緇樺埗鍙充笅欏剁偣
glVertex3f( 1.0f,-1.0f, 0.0f); // 鍙充笅
glEnd();
glPopMatrix(); //鎭㈠褰撳墠鐭╅樀涓轟笂涓嬈ush鏃剁殑鐭╅樀
glTranslatef(1.5f,0.0f,-6.0f);
glColor3f(0.0f,0.0f,1.0f); //灝嗗綋鍓嶉鑹插艱緗負钃濊壊 緇樺埗鏁翠釜姝f柟褰?/span>
glBegin(GL_QUADS); // 緇樺埗姝f柟褰?/span>
glVertex3f(-1.0f, 1.0f, 0.0f); // 宸︿笂
glVertex3f( 1.0f, 1.0f, 0.0f); // 鍙充笂
glVertex3f( 1.0f,-1.0f, 0.0f); // 宸︿笅
glVertex3f(-1.0f,-1.0f, 0.0f); // 鍙充笅
glEnd();
glutSwapBuffers(); //寮哄埗緇樺浘鍛戒護鎵ц緇樺埗鍦ㄧ紦鍐插尯浜ゆ崲鍑烘潵
}
#include "openglglut.h"

/**//*
** opengl 鏁欑▼絎簩璇懼唴瀹?br>
** 鍦ㄧ獥鍙g殑宸﹁竟閮ㄥ垎緇樺埗涓涓櫧鑹茬殑涓夎褰?br>
** 鍦ㄧ獥鍙g殑鍙寵竟閮ㄥ垎緇樺埗涓涓櫧鑹茬殑姝f柟褰?br>
*/
int main(int argc, char** argv)

{
/**//** 鍒濆鍖栫獥鍙?nbsp;騫跺垱寤虹獥鍙?/span>*/
createWindow("opengl lesson_2",&argc,argv);

/**//** 娉ㄥ唽glut鐨勪竴浜涘嚱鏁?nbsp;*/
glutReshapeFunc(glutResize); //紿楀彛璋冩暣鍑芥暟 浣垮緱璋冩暣鍚庡浘褰㈡樉紺轟笉鍙戠敓鏀瑰彉
glutDisplayFunc(glutDisplay); //閲嶇粯鍑芥暟 浣垮緱鍙互鍦ㄧ獥鍙d腑緇樺埗鍥懼艦
glutSpecialFunc(glutSpecial); //鐗規畩鎸夐敭鍑芥暟 浣垮緱瀹炵幇鍏ㄥ睆/紿楀彛鍒囨崲

/**//** 鍒濆鍖杘pengl鐨勪竴浜涙搷浣?/span>*/
InitOpenGL();

/**//** 榪涘叆浠跨湡寰幆*/
glutMainLoop();
}

/**//** 瀹炵幇澶存枃浠跺綋涓畾涔夌殑緇樺埗鍑芥暟 緇樺埗涓夎褰㈠拰姝f柟褰?nbsp;**/
void glutDisplay(void)

{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity(); //灝嗗厛鍒濆鍖栧崟浣嶇煩闃?/span>
glPushMatrix(); //灝嗗綋鍓嶇煩闃靛鍒朵竴涓帇鍏ユ爤欏?騫朵繚鎸佸綋鍓嶇煩闃典笉鍙?/span>
glTranslatef(-1.5,0.0,-6.0); //宸︾Щ鍔?.5騫跺悜灞忓箷鍐呴儴縐誨姩6.0 鍦ㄩ偅鍖哄煙鐢諱笁瑙掑艦
glBegin(GL_TRIANGLES); // 緇樺埗涓夎褰?/span>
glVertex3f( 0.0f, 1.0f, 0.0f); // 涓婇《鐐?/span>
glVertex3f(-1.0f,-1.0f, 0.0f); // 宸︿笅
glVertex3f( 1.0f,-1.0f, 0.0f); // 鍙充笅
glEnd();
glPopMatrix(); //鎭㈠褰撳墠鐭╅樀涓轟笂涓嬈ush鏃剁殑鐭╅樀
glTranslatef(1.5f,0.0f,-6.0f); //鍙崇Щ鍔?.5騫跺悜灞忓箷鍐呴儴縐誨姩6.0 鍦ㄩ偅鍖哄煙鐢諱笁瑙掑艦
glBegin(GL_QUADS); // 緇樺埗姝f柟褰?/span>
glVertex3f(-1.0f, 1.0f, 0.0f); // 宸︿笂
glVertex3f( 1.0f, 1.0f, 0.0f); // 鍙充笂
glVertex3f( 1.0f,-1.0f, 0.0f); // 宸︿笅
glVertex3f(-1.0f,-1.0f, 0.0f); // 鍙充笅
glEnd();
glutSwapBuffers(); //寮哄埗緇樺浘鍛戒護鎵ц緇樺埗鍦ㄧ紦鍐插尯浜ゆ崲鍑烘潵
}
鍏跺疄浠婂ぉ鍦ㄦ葷粨榪欎釜鐨勬椂鍊欙紝騫朵笉鏄湪鐢╫pengl鑰屾槸鍦ㄤ嬌鐢╫sg璁捐涓涓」鐩漢鐗╂苯杞﹁濺絳夋極娓哥被銆婂彲鑳藉簲鐢ㄥ湪鎵嬫満錛屾苯杞﹀鑸笂銆嬬殑鏃跺欙紝鎯寵搗鎬葷粨榪欑殑銆傛垜鍏跺疄鏄兂鐢諱簺鍥炬潵鍐欒繖浠芥葷粨鍙兘浼氭洿瀹規槗鐞嗚В鐨?鐒惰屽疄鍦ㄦ噿...
鍦ㄥ浘褰㈠鐨勬樉紺烘祦紼嬶細
涓夌淮鍥懼艦->妯″瀷瑙嗗浘鍙樻崲->鎶曞獎鍙樻崲->涓夌淮瑁佸壀->瑙嗗彛->灞忓箷鍥懼艦鏄劇ず
涓夌淮->浜岀淮鐨勫彉鎹紝鎬葷殑鏉ョ悊瑙e彧鏄笁緇寸殑鐗╀綋鍦ㄤ竴緋誨垪鐨勫彉鎹箣鍚庡喅瀹氫簡灞忓箷涓婃煇浜涘儚绱犱綅緗殑棰滆壊鍊箋傛渶鍚庤繖浜涢鑹茬粍鎴愪簡涓騫呭浘鐢匯傚氨鏄垜浠墍鐪嬪埌寰楁渶緇堝睆騫曚簩緇村浘褰簡銆?/p>
鍦ㄥぇ姒備簡瑙h繖縐嶆祦紼嬩箣鍚庯紝妯″瀷瑙嗗浘鍙樻崲 鏃犵枒灝嗘垚涓哄喅瀹氭垜浠墍灝嗙湅鍒扮殑鍥懼儚鐨勮疆寤撱?/p>
妯″瀷瑙嗗浘鍙樻崲 搴旇鏉ヨ鏄寘鍚袱涓彉鎹㈢殑:妯″瀷鍙樻崲,瑙嗗浘鍙樻崲銆備負浠涔堝皢浠栦滑鍚堝湪涓璧峰憿錛?鍦ㄧ収鐩告満鎴愬儚緋葷粺涓?鑻ュ浐瀹氱浉鏈轟笉鍔ㄧЩ鍔ㄦā鍨嬩細 絳変環浜?/span> 鍥哄畾妯″瀷涓嶅姩縐誨姩鐩告満銆?/p>
鑰冪┒濡備笅鍐呭錛?/p>
glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //褰撳墠鐭╅樀璁劇疆涓哄崟浣嶇煩闃?/p>
glRotatef(45.0f,0.0,0.0,1.0); //鎸塠0.0,0.0,1.0]涓鴻醬鏃嬭漿45搴?/p>
glTranslatef(2.0,2.0,2.0); // 騫崇Щ鑷?[2.0,2.0,2.0] glBegin(...); // 鐢繪煇浜涗笢瑗?br> ... 鏈変袱縐嶆柟寮忕悊瑙o細涓縐嶆槸灞閮ㄥ潗鏍囩郴鐨勭悊瑙o紝涓縐嶆槸鍏ㄥ眬鍧愭爣緋葷殑鐞嗚В銆?/p>
濡傛灉鎸夌収涓婇潰閭d簺鍐呭浠庝笂鍒頒笅鐨勭悊瑙g殑鏂瑰紡灝辨槸灞閮ㄥ潗鏍囩郴鐨勭悊瑙?/span>銆俹pengl鍙樻崲涓婄殑瀹炵幇鍏跺疄鏄釜鐭╅樀鐨勪箻娉曘傛寜鐓у眬閮ㄥ潗鏍囩郴鐨勭悊瑙?涓婇潰浠g爜鐨勫彉鎹㈡槸鎸夌収榪欐牱鐨勯『搴忔墽琛岀殑: 鍏堝皢灞閮ㄥ潗鏍囩郴緇晍杞存棆杞?5搴︼紝鍦ㄥ皢灞閮ㄥ潗鏍囩郴鐨勫師鐐瑰鉤縐昏嚦[2.0,2.0,2.0]錛岀劧鍚庡湪灞閮ㄥ潗鏍囩郴鍐呯敾鐗╀綋銆?/p>
鍋囪 鏃嬭漿姝ラ鐨勭煩闃典負R錛屽鉤縐婚儴鍒嗙殑鐭╅樀涓篢 褰撳墠鐭╅樀涓篊銆?/p>
new_C=old_C*R*T 榪欐槸涓涓煩闃靛彸涔樻搷浣?/p>
鐞嗚涓婃潵璁?榪欏氨鏄竴涓潗鏍囩郴鐨勫彉鎹㈣繃紼嬶紝R*T 榪欎釜鐭╅樀鍏跺疄灝辨槸灝嗗師鍏堢殑鍧愭爣緋誨彉鎹㈠埌鐜板湪鐨勫潗鏍囩郴錛岃繖涓椂鍊欏師鍏堝潗鏍囩郴鐨勭偣p灝嗗彉鎹㈡垚p1,p1=(R*T)*p銆?/p>
鑰屾寜鐓у叏灞鍧愭爣緋葷殑鐞嗚В錛屽畠鐨勫彉鎹㈣繃紼嬪垯鏄浉鍙嶇殑錛岃繖涔熸槸鐩稿綋鐨勫ソ鐞嗚В鐨?鍦ㄥ綋鍓嶄笘鐣屽潗鏍囩郴涓敾濂借鐗╀綋涔嬪悗錛屾垜蹇呴』灝嗗畠縐誨姩鍒版紜殑浣嶇疆銆傞偅蹇呴』寰楀厛騫崇Щ鐗╀綋鍒癧2.0,2.0,2.0],鐒跺悗灝嗙墿浣撶粫z杞存棆杞?5搴︺傝繖鏄竴涓浉鍙嶇殑鍙樻崲榪囩▼錛岀劧鑰岃繖涓笌鍓嶉潰鐨勬槸絳変環鐨?涓轟粈涔堬紵 鑰冭檻涓栫晫鍧愭爣緋諱笅鐐筽錛岀粡榪囧鉤縐繪搷浣滃悗 p11=T*p; 鍦ㄧ粡榪囨棆杞搷浣滃悗 p1=R*P11=R*(T*p) 榪欐槸鐭╅樀鐨勪竴涓乏涔樻搷浣?鍏堝彉鎹㈢殑鍦ㄥ悗闈? 鎵浠ヨnew_C=(old_c*(R*(T))) 宸︿箻 鎵浠ヨ榪欐槸涓涓瓑浠風殑榪囩▼. 涓鑸潵灝嗭紝鎴戜滑鑰冭檻鐨勬椂鍊欐繪槸涓栫晫鍧愭爣緋昏冭檻鏃嬭漿騫崇Щ絳夋搷浣滅殑.鎵浠ュ湪鍐欏彉鎹㈢殑鏃跺欐渶濂界殑鏂瑰紡灝辨槸灝?鍙樻崲姝ラ涓鐩村乏涔橈紝鑰屼唬鐮佷腑鍒欐寜宸︿箻鍚庣粨鏋滅煩闃電殑欏哄簭鍐欎唬鐮併?/p>
鍏舵鍦ㄧ悊瑙d互涓婄殑鍙樻崲榪囩▼涓ā鍨嬪彉鎹㈢殑鍘熺悊錛屾垜浠彲浠ュ緢濂界殑鐞嗚ВgluLookAt(eye,center,up)鐨勮鍥懼彉鎹㈢殑榪囩▼錛岀幇鍦ㄥ彧鑰冭檻妯″瀷涓嶅姩錛岀収鐩告満縐誨姩鐨勮繃紼嬶紝涓旀槸鍦ㄥ叏灞鍧愭爣緋諱笅鐨勭Щ鍔ㄨ繃紼? opengl榛樿鐓х浉鏈烘鏋?鏄鐐瑰湪鍘熺偣 y杞翠負鍚戜笂鏂瑰悜 z杞磋礋鏂瑰悜涓鴻綰挎柟鍚?/span> gluLookAt鐨勭洰鐨勫湪浜庝嬌寰楄鐐圭Щ鍔ㄥ埌eye浣嶇疆 騫剁湅鍚慶enter銆?/span> 鍒檊luLookAt鐨勮繃紼嬪厛騫崇Щ鑷砮ye,鑰宑enter->eye(center鎸囧悜eye)鍒欎負z鏂瑰悜璁句負z(Zx,Zy,Zz),Up鏂瑰悜涓簓杞存柟鍚戯紝y,z鐨勫弶縐垯涓簒杞存柟鍚?鍒欏彧闇灝嗗畠浠兘鏃嬭漿鍒頒綅灝辮浜?/span> 鎵浠ヨ繖涓椂鍊欐ā鍨嬪彉鎹㈢煩闃靛氨涓恒婄浉瀵逛簬妯″瀷鏉ヨ 鐩告満縐誨姩鍒癳ye絳変環浜庢ā鍨嬬Щ鍔ㄥ埌-eye. |Xx Xy Xz 0| |1 0 0 -eyex| |Yx Yy Yz 0| * |0 1 0 -eyey| |Zx Zy Zz 0| |0 0 1 -eyez| |0 0 0 1| |0 0 0 1 |
...
...
glEnd();
]]>

/**//** 
One workaround to this issue is requiring users to always link with
the same CRT as GLUT is compiled with. That requires users supply a
non-standard option. GLUT 3.7 has its own built-in workaround where
the executable's "exit" function pointer is covertly passed to GLUT.
GLUT then calls the executable's exit function pointer to ensure that
any "atexit" calls registered by the application are called if GLUT
needs to exit.
Note that the __glut*WithExit routines should NEVER be called directly.
To avoid the atexit workaround, #define GLUT_DISABLE_ATEXIT_HACK.
***/
/**//**
** That for why define below
**/
#define GLUT_DISABLE_ATEXIT_HACK 

#ifdef WIN32
#include <windows.h>
#endif
#include<gl/gl.h>
#include<GL/glut.h>
GLfloat angle=0.0;

/**//*
*鏄劇ず鍥炶皟鍑芥暟
*/
void display()

{
//clear the color buffer 鍗蟲瘡甯ф竻灞?/span>
glClear(GL_COLOR_BUFFER_BIT);
//璁劇疆妯″瀷瑙嗗浘鐭╅樀
glMatrixMode(GL_MODELVIEW);
//璁劇疆褰撳墠鐭╅樀涓哄崟浣嶇煩闃?/span>
glLoadIdentity();
//灝嗘鏂瑰艦鎸墇杞存棆杞?nbsp;angle瑙掑害
glRotatef(angle,0.0,0.0,1.0);
//鐢諱竴涓鏂瑰艦
glBegin(GL_QUADS);
glVertex3f(-0.5,-0.5,0.0);
glVertex3f(0.5,-0.5,0.0);
glVertex3f(0.5,0.5,0.0);
glVertex3f(-0.5,0.5,0.0);
glEnd();
//glFlush();
//鍙岀紦瀛?nbsp;鏄劇ず涓甯э紝涓嬩竴甯у凡緇忓湪緙撳啿鍖虹敾濂?浜ゆ崲鍑烘潵灝卞ソ
//鏈韓甯︽湁涓涓己鍒剁殑glFlush();
glutSwapBuffers();
}
/**//*
*絀洪棽鏃墮棿鍥炶皟鍑芥暟
*/
void idlefunc()

{
//瑙掑害鑷 瀹炵幇姝f柟褰㈢殑鏃嬭漿
angle+=1.0;
if(angle>=360.0f)
angle=0.0;
//浣垮緱鍑芥暟鎵ц瀹屾垚鍚庯紝璋冪敤閲嶇粯鍑芥暟
glutPostRedisplay();
}
/**//*
*win32 main鍑芥暟
*/
void main(int argc, char **argv)

{
//鍒濆鍖?nbsp;glut
glutInit(&argc, argv);
//鍒濆鍖栨樉紺烘ā寮忎負 RGB 鍜屽弻緙撳啿
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
//璁劇疆紿楀彛宸︿笂瑙掍綅緗?/span>
glutInitWindowPosition(100,100);
//璁劇疆紿楀彛鐨勫垵濮嬪寲澶у皬
glutInitWindowSize(512,512);
//鍒涘緩涓涓獥鍙f爣棰樹負 "瀛楃涓?
glutCreateWindow("3D Tech- GLUT Tutorial");
//娉ㄥ唽鏄劇ず鍥炶皟鍑芥暟
glutDisplayFunc(display);
//娉ㄥ唽絀洪棽鏃墮棿鍑芥暟
glutIdleFunc(idlefunc);
//璁劇疆澶氳竟褰㈢粯鍒舵ā寮忎負姝i潰錛岀嚎妗嗗紡
glPolygonMode(GL_FRONT,GL_LINE);
//榪涘叆浠跨湡寰幆
glutMainLoop();
}



