国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

osg::Drawable類通過setDrawCallback函數(shù)設(shè)置回調(diào)函數(shù)的說明

這篇具有很好參考價值的文章主要介紹了osg::Drawable類通過setDrawCallback函數(shù)設(shè)置回調(diào)函數(shù)的說明。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

? ? ? ?osg::Drawable類可以通過該類的setDrawCallback函數(shù)設(shè)置回調(diào)函數(shù)類對象。被設(shè)置的回調(diào)類對象必須從osg::Drawable::DrawCallback類派生,并重寫drawImplementation函數(shù),以實現(xiàn)自己特定的需求。這個回調(diào)函數(shù)在每次幀事件中都會被調(diào)用(如:在幀的更新遍歷事件), 可以在該類的drawImplementation函數(shù)對可繪制對象進行屬性的更改,這樣可繪制對象就好像時刻在變化一樣,osgViewer::StatsHandler類實時幀率統(tǒng)計就是這么實現(xiàn)的。osg::Drawable::DrawCallback類定義如下:

struct DrawCallback : public virtual osg::Object
{
   DrawCallback() {}
   DrawCallback(const DrawCallback& org,const CopyOp& copyop):
                Object(org, copyop) {}

   META_Object(osg,DrawCallback);

  /** do customized draw code.*/
   virtual void drawImplementation(osg::RenderInfo& /*renderInfo*/,const osg::Drawable* /*drawable*/) const {}
};

? ? ? ? 這個類中最重要的就是虛函數(shù)drawImplementation,該函數(shù)參數(shù)說明如下:

  1. 第1個參數(shù)是類型為osg::RenderInfo的引用。osg::RenderInfo是渲染信息類。這個類負責保存和管理與場景繪制息相關(guān)的幾個重要數(shù)據(jù):當前場景的視景器、當前場景對應(yīng)的所有攝像機、以及當前osg::State對象。這些數(shù)據(jù)將在場景篩選和渲染時為 OSG 系統(tǒng)后臺的工作提供重要依據(jù),并從中取出跟蹤此圖形上下文的當前OpenGL狀態(tài)的State對象??梢哉f,需要涉及繪制有關(guān)的視景器、場景類、狀態(tài)類、攝像機類都可以從渲染信息類對象獲取到。
  2. 第2個參數(shù)就是指向被繪制對象的指針。

? ? ?下面舉例說明,如下代碼:

#include<osgViewer/Viewer>
#include<osg/ArgumentParser>
#include<osg/ShapeDrawable>
#include<osgText/Text3D>
#include<osg/Timer>
class CUpdateTextValue : public osg::Drawable::DrawCallback
{
public:
    CUpdateTextValue()
    {
        _lastTimer_t = osg::Timer::instance()->tick();
    }
    virtual void drawImplementation(osg::RenderInfo& renderInfo, const osg::Drawable* drawable) const
    {
        auto pText3D = (osgText::Text3D*)(drawable);

        osg::Timer_t tCurTick = osg::Timer::instance()->tick();
        double delta = osg::Timer::instance()->delta_m(_lastTimer_t, tCurTick);
       
        char szValue[10]{0};
        itoa(_value, szValue, 10);
        if (delta > 20)
        {
            ++_value;
        }
        else
        {
            --_value;
        }

        // 防止越界、溢出
        if (_value >= INT_MAX)
        {
            _value = INT_MAX;
        }
        if (_value <= INT_MIN)
        {
            _value = INT_MIN;
        }

        pText3D->setText(szValue);
        pText3D->drawImplementation(renderInfo);
        _lastTimer_t = tCurTick;
    }
private:

// 注意用mutable修飾符,因為函數(shù)是const函數(shù),否則不能對該值修改,下同。
    mutable  osg::Timer_t _lastTimer_t{ 0 };
    mutable  int _value{0};  
};

int main(int argc, char *argv[])
{
    osg::ArgumentParser arg(&argc, argv);
    osgViewer::Viewer viewer(arg);

    auto spRoot = new osg::Group;
    auto pGeode = new osg::Geode;
    
    auto pText3D = new osgText::Text3D;  
    pGeode->addDrawable(pText3D);

    pText3D->setFont("Verdana\\verdana.ttf");
    pText3D->setText(" 0");
    pText3D->setDrawCallback(new CUpdateTextValue);
    pText3D->setUseDisplayList(false); // 這個要最好設(shè)置為false,否則對某些可繪制幾何體如球體,drawImplementation函數(shù)只會調(diào)用一次
    spRoot->addChild(pGeode);
    viewer.setSceneData(spRoot);

    return viewer.run();
}

上面的例子,繪制一個三維字符串,最開始時候,字符串是“0”,然后調(diào)用三維字符對象的setDrawCallback方法,安裝一個CUpdateTextValue繪制回調(diào)類對象,在回調(diào)類中的drawImplementation函數(shù),根據(jù)兩幀之間的時間間隔是否大于20ms,從而繪制不同值,效果如下:

osg::Drawable類通過setDrawCallback函數(shù)設(shè)置回調(diào)函數(shù)的說明

?說明:

?setUseDisplayList(false); // 這個要最好設(shè)置為false,否則對某些可繪制幾何體如球體,drawImplementation函數(shù)只會調(diào)用一次。

? ? ? 本例因為較簡單,第1個參數(shù)即渲染信息對象沒用上,現(xiàn)實中的業(yè)務(wù)比較復(fù)雜,會涉及到場景、視景器、相機等對象,這些都可以通過第1個參數(shù)表示的渲染信息對象獲取到。本例用到字體,需要編譯freetype到osg,作為osg的插件,否則字符串不會顯示。請從

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??FreeType Downloads

下載freetype。關(guān)于如何編譯字體作為osg的插件,請參照

osg第三方插件的編譯方法(以jpeg插件來講解)? ? ? 博文。文章來源地址http://www.zghlxwxcb.cn/news/detail-433552.html

到了這里,關(guān)于osg::Drawable類通過setDrawCallback函數(shù)設(shè)置回調(diào)函數(shù)的說明的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • C++回調(diào)函數(shù) 匿名函數(shù),類中的方法做為回調(diào)函數(shù)

    C++中的回調(diào)函數(shù)和匿名函數(shù)都是函數(shù)指針或函數(shù)對象的使用形式。下面分別介紹它們的使用方法。 回調(diào)函數(shù)是一種函數(shù)指針,它允許將函數(shù)作為參數(shù)傳遞給另一個函數(shù),并在需要時調(diào)用它。這種技術(shù)通常用于事件處理、異步處理和狀態(tài)機等應(yīng)用中。 下面是一個簡單的示例,

    2024年02月01日
    瀏覽(23)
  • C/C++面向?qū)ο螅∣OP)編程-回調(diào)函數(shù)詳解(回調(diào)函數(shù)、C/C++異步回調(diào)、函數(shù)指針)

    C/C++面向?qū)ο螅∣OP)編程-回調(diào)函數(shù)詳解(回調(diào)函數(shù)、C/C++異步回調(diào)、函數(shù)指針)

    本文主要介紹回調(diào)函數(shù)的使用,包括函數(shù)指針、異步回調(diào)編程、主要通過詳細的例子來指導(dǎo)在異步編程和事件編程中如何使用回調(diào)函數(shù)來實現(xiàn)。 ??個人簡介:一個全棧工程師的升級之路! ??個人專欄:C/C++精進之路 ??CSDN主頁?發(fā)狂的小花 ??人生秘訣:學(xué)習的本質(zhì)就是極致

    2024年02月03日
    瀏覽(23)
  • 理解函數(shù)指針和回調(diào)函數(shù)

    理解函數(shù)指針和回調(diào)函數(shù)

    指向函數(shù)的指針。比如: 理解函數(shù)指針的偽代碼 比如,B把自己函數(shù)cbkFunc()的地址告訴A,A在運行過程中執(zhí)行cbkFunc()。則 回調(diào)函數(shù):指B的函數(shù)cbkFunc(); 注冊回調(diào)函數(shù):指B把函數(shù)cbkFunc()的地址告訴A; 回調(diào):指A在運行過程中執(zhí)行cbkFunc()。 無頭文件.h 為了方便模塊A和B寫在了一

    2023年04月20日
    瀏覽(21)
  • 函數(shù)指針和回調(diào)函數(shù) 以及指針函數(shù)

    函數(shù)指針(Function Pointer): 定義: 函數(shù)指針是指向函數(shù)的指針,它存儲了函數(shù)的地址。函數(shù)的二制制代碼存放在內(nèi)存四區(qū)中的代碼段,函數(shù)的地址它在內(nèi)存中的開始地址。如果把函數(shù)的地址作為參數(shù),就可以在函數(shù)中靈活的調(diào)用其它函數(shù)。 用途: 函數(shù)指針可以用來在運行

    2024年01月21日
    瀏覽(25)
  • 物聯(lián)網(wǎng)|按鍵實驗---學(xué)習I/O的輸入及中斷的編程|函數(shù)說明的格式|如何使用CMSIS的延時|讀取通過外部中斷實現(xiàn)按鍵捕獲代碼的實現(xiàn)及分析-學(xué)習筆記(14)

    物聯(lián)網(wǎng)|按鍵實驗---學(xué)習I/O的輸入及中斷的編程|函數(shù)說明的格式|如何使用CMSIS的延時|讀取通過外部中斷實現(xiàn)按鍵捕獲代碼的實現(xiàn)及分析-學(xué)習筆記(14)

    1 代碼的流程分析 2 代碼的實現(xiàn) 庫函數(shù)HAL_Init(void)分析: HAL_Delay()系統(tǒng)延時的步驟: 它的實現(xiàn)步驟如下: 1.用變量獲得系統(tǒng)時鐘源計數(shù)器的值 2.獲得要延遲時間的參數(shù)值 3.比較兩者大小,若時鐘計數(shù)器的值大于要實現(xiàn)延遲的值,就會困在循環(huán)里;反之,跳出循環(huán),延時完成。

    2024年02月14日
    瀏覽(24)
  • python回調(diào)函數(shù)

    回調(diào)函數(shù)在各種編程函數(shù)中都是比較常見的,回調(diào)函數(shù)的出現(xiàn)主要是為了降低函數(shù)之間調(diào)用的耦合性,從而實現(xiàn)解耦。 簡單來說,如果一個函數(shù)可以作為被傳遞就稱這個函數(shù)為回調(diào)函數(shù)。 比如:func1(func2()),那么func2就是回調(diào)函數(shù)。此時,只需要知道func2這個函數(shù)的功能是什

    2024年02月02日
    瀏覽(20)
  • 什么是函數(shù)回調(diào)

    函數(shù)回調(diào)是一種編程概念,它描述的是這樣一個過程:一個函數(shù)(稱為回調(diào)函數(shù))作為參數(shù)傳遞給另一個函數(shù)(稱為調(diào)用函數(shù)),當滿足一定條件或者在某個特定時刻,調(diào)用函數(shù)會調(diào)用傳遞過來的回調(diào)函數(shù)。這種機制允許程序員在編寫代碼時,能夠在不同的上下文中重用函數(shù),

    2024年03月13日
    瀏覽(18)
  • 回調(diào)函數(shù)

    之前導(dǎo)師讓寫一個拼幀回調(diào)函數(shù),里面需要用到一個函數(shù)作為參數(shù),當時直接把聲明傳了進去,結(jié)果報錯。然后就詳細了解了一些關(guān)于回調(diào)函數(shù)的知識。 回調(diào)函數(shù)本質(zhì)就在于一個函數(shù)作為另一個函數(shù)的參數(shù)。這樣可以將一個函數(shù)實現(xiàn)的方法直接在另一個函數(shù)中調(diào)用。回調(diào)函數(shù)

    2023年04月15日
    瀏覽(10)
  • 回調(diào)函數(shù)的簡單用例

    回調(diào)函數(shù)的簡單用例

    ①用MsgInterface_t定義一個結(jié)構(gòu)體s_Lin_MsgInterface,包含兩個回調(diào)函數(shù)成員: ②確定結(jié)構(gòu)體下的回調(diào)函數(shù)成員的參數(shù): ③傳入實參,確定結(jié)構(gòu)體下的回調(diào)函數(shù)成員的函數(shù)名: ④最終回調(diào)函數(shù)執(zhí)行的對應(yīng)函數(shù)如下:

    2024年02月14日
    瀏覽(11)
  • C# 中的回調(diào)函數(shù)

    引言 回調(diào)函數(shù)是一種在編程中常用的概念,它在 C# 中扮演著重要的角色。本文將介紹回調(diào)函數(shù)的概念、語法和應(yīng)用,并討論如何設(shè)計優(yōu)化和重用回調(diào)函數(shù),以及它們在并發(fā)編程中的用途。 回調(diào)函數(shù)是指將一個函數(shù)作為參數(shù)傳遞給另一個函數(shù),并在被調(diào)用函數(shù)執(zhí)行完畢后,再

    2024年02月20日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包