OpenSG
節點核心一、變換核心1、變換核心 圖形的變換是通過變換核心實現的,先定義一個節點,將該節點的核心設為變換核心,在變換核心中放置變換矩陣,並將需要變換的圖形作為該變換節點的子節點,此時變換節點的所有位元組點均根據變換節點的核心中變換矩陣完成圖形變換。具體步驟如下:1、定義變換矩陣:Matrix m;2、對變換矩陣進行變換,使之滿足變換要求。3、定義變換核心:TransformPtr planetTransform;4、通過setMatrix()方法設定變換矩陣:planetTransform->setMatrix(m);5、定義變換節點:NodePtr planetTransformNode = Node::create();6、將變換核心作為變換節點的核心:planetTransformNode->setCore(planetTransform);7、定義需要變換的圖形:NodePtr planet = makeSphere(3, 3);8、添加需要變換的圖形節點作為該變換節點的位元組點planetTransformNode->addChild(planet); 整個變換樹的構造可以有不同種方法,其中之一為按照邏輯順序構建圖形變化樹,對需要變換多次的圖形經過多步變換完成,該種方法邏輯清晰,但效率不高,另一種是將變換的圖形均作為根節點的位元組點,所有的變換在一次變換中完成,該種方法可能與現實邏輯不符,但有較高的效率。 註:當我們需要通過多次變換才能得到最終變換結果時,我們必須將變換矩陣依次相乘,否則無法得到正確結果。2、變換矩陣變換矩陣式圖形變換中的重中之重,圖形變換是通過對象座標乘以變換節點的變換核心中的變換矩陣得到的,基本的圖形變換有平移變換、縮放變換,旋轉變換等,其他複雜變換通過基本圖形變換的組合得到。基本的矩陣變換操作如下:1、矩陣規格化:m.setIdentity()2、設定矩陣的平移變換:m.setTranslate(20,0,0,)3、設定矩陣旋轉變換:m.setRotate(planetRot) 註:參數planetRot為Quaternion類型 4、設定矩陣縮放變換:m.setScale()5、設定矩陣各種變換:m.setTransform() 該函數被重載多次,參數可以為:const VectorType3f &tconst QuaternionType &rconst VectorType3f &t, const QuaternionType &rconst VectorType3f &t, const QuaternionType &r, const VectorType3f &sconst VectorType3f &t, const QuaternionType &r, const VectorType3f &s,const QuaternionType &soconst VectorType3f &translation, const QuaternionType &rotation, constVectorType3f &scaleFactor, const QuaternionType &scaleOrientation, constVectorType3f ¢er5、矩陣相乘:r.mult(t) //在r中存放相乘結果5、矩陣賦值:m.setValue()6、矩陣轉置:m.transposed()二、綜合變換核心綜合變換核心完成了對圖形變換矩陣的封裝,它使得我們不用首先一次性構造完畢變換矩陣,再將最終變換矩陣添加到變換核心中去;而是在綜合變換核心中分別設定平移變換矩陣、旋轉變換矩、縮放變換矩陣等基本變換矩陣,該核心自動所有設定的變換矩陣的乘積作為最終變換矩陣。當我們需要改變某一個或幾個變換時我們僅需要對所需變換的相應變換矩陣進行設定,而不必重新構造整體變換矩陣。綜合變換核心的定義:ComponentTransformPtr ct = ComponentTransform::create()綜合變換核心的平移變換:ct->setTranslation(Vec3f(20,0,0))綜合變換核心的旋轉變換:ct->setRotation(Quaternion(0,1,0),PI/4)綜合變換核心的縮放變換:ct->setScale(Vec3f(1,3,1))beginEditCP(ct, ComponentTransform::TranslationFieldMask |ComponentTransform::RotationFieldMask);ct->setTranslation(Vec3f(20,0,0));ct->setRotation(Quaternion(Vec3f(0,1,0),PI/4));endEditCP(ct, ComponentTransform::TranslationFieldMask |ComponentTransform::RotationFieldMask);註:在綜合變換核心中三、材質1、材質屬性的設定材質是物體的固有屬性,包括物體對漫反射光、鏡面反射光、環境光線等光的反射程度以及物體的透明度、光澤度等特性。物體材質的定義:SimpleMaterialPtr m = SimpleMaterial::create()對物體的漫反射程度的設定:m->setDiffuse(Color3f(1,0,0))對物體的鏡面反射程度的設定:m->setAmbient(Color3f(0.2,0.2,0.2))對物體的鏡面反射指數的設定:m->setShininess(0.8)對物體透明度的設定:m->setTransparency(0.5)beginEditCP(m,SimpleMaterial::DiffuseColorFileMask| SimpleMaterial::AmbientColorFieldMask| SimpleMaterial::TransparencyFiledMask|SimpleMaterial::ShininessFieldMask) m->setDiffuse(Color3f(1,0,0)) m->setAmbient(Color3f(0.2,0.2,0.2)) m->setTransparency(0.5)endEditCP(m, SimpleMaterial::DiffuseColorFileMask|SimpleMaterial::AmbientColorFieldMask|SimpleMaterial::TransparencyFiledMask|SimpleMaterial::ShininessFieldMask) 2、材質的使用材質不可以直接作為核心添加到節點中,它的使用有兩種方式:第一種方式是通過定義材質組指標(可理解為材質類型的核心指標,與變換類型核心節點類似)來實現,通過setMaterial()方法設定材質組指標,再將材質組指標作為核心添加到節點中,此種方法可以設定多個物體的材質屬性,即對該節點以下的所有子節點進行材質屬性設定。具體實現步驟如下:1、定義材質組核心變數:MaterialGroupPtr mg = MaterialGroup::create() 2、為材質組核心變數賦值: beginEditCP(mg) mg->setMaterial(m) endEditCP(mg) 3、將材質組核心添加到節點中: NodePtr n = Node::create() beginEditPtr(n) n->setCore(mg) n->addChild(someNode) endEditPtr(n)第二種方式是直接對幾何體設定其材質屬性。該種方式只能對特定的幾何體的材質屬性進行設定,而對其子節點沒有影響。 GeometryPtr geo = Geometry::create() Geo->setMaterial(mg)四、選擇模式OpenSG中的選擇模式是通過選擇類型節點核心來實現的,我們定義一個選擇類型的節點核心放入選擇類型的節點中,將要顯示的多個圖形作為選擇節點的子節點,我們可以通過設定該選擇核心的setChoise()方法來選擇顯示該節點的那個子節點中的圖形。 定義選擇類型節點核心:SwitchPtr switch = switch::create() 設定要選擇的子節點:switchsetChoise(2)五、細節水平從不同的距離觀察物體,我們看到的物體是不同的,當距離近時,我們更能夠看清物體的細節,而當我們距離物體較遠時我們無法看清物體的細節,在OpenSG中能通過DistanceLOD來實現這種效果,當然可能以後還有可能推出其他的由於觀察者觀察物體的角度不同而產生的不同效果的實現,但現在我們只有距離細節水平類型的節點核心可用。 定義距離細節水平核心:DistanceLOD lod = DistanceLOD::create() 設定中心位置:lod->getSFCenter()->setValue(Pnt3f(0,0,0)) 設定距離:lod->getMFRange()->push_back(200)