• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    三維動(dòng)態(tài)反演人物模型構(gòu)建與數(shù)據(jù)載入研究

    2014-08-25 02:55:56卜祥報(bào)卜凡亮
    關(guān)鍵詞:骨骼反演動(dòng)畫

    吳 琦,卜祥報(bào),卜凡亮

    (中國人民公安大學(xué)警務(wù)信息工程學(xué)院,北京 102623)

    0 引言

    偵查人員在進(jìn)行犯罪案件過程分析時(shí), 都是利用現(xiàn)場(chǎng)勘驗(yàn)采集的二維圖像信息與案件現(xiàn)場(chǎng)的描述文字,這種傳統(tǒng)的方法缺乏直觀性和形象性,不利于案件偵破。案件過程的動(dòng)態(tài)反演系統(tǒng)可以對(duì)案件過程進(jìn)行三維仿真,有助于偵查人員對(duì)案情的了解。動(dòng)態(tài)反演技術(shù)是20世紀(jì)末發(fā)展起來的新技術(shù),能夠?qū)崿F(xiàn)對(duì)某場(chǎng)景或某事件發(fā)生發(fā)展過程的動(dòng)態(tài)重現(xiàn),且能夠?qū)χ噩F(xiàn)的場(chǎng)景狀態(tài)進(jìn)行全視角觀察。在國外警務(wù)工作中,動(dòng)態(tài)反演技術(shù)已被應(yīng)用到現(xiàn)場(chǎng)勘驗(yàn)、案件偵破、災(zāi)害事故等的過程重現(xiàn)方面。國內(nèi)公安機(jī)關(guān)對(duì)動(dòng)態(tài)反演技術(shù)的開發(fā)與使用重視程度還不高。目前常用動(dòng)畫制作軟件主要有flash、maya、3ds max等,利用這些軟件雖然可以制作出形象逼真的人物動(dòng)畫,但這些軟件側(cè)重于模型的建立,對(duì)模型的運(yùn)動(dòng)控制相對(duì)薄弱[1],不能滿足公安工作的需求。因此,針對(duì)公安工作特點(diǎn)而開發(fā)的動(dòng)態(tài)反演系統(tǒng),需要綜合考慮模型建模與模型控制兩方面因素。人物模型是案件過程動(dòng)態(tài)反演系統(tǒng)中使用最多的三維模型,因其結(jié)構(gòu)的復(fù)雜性又使它成為最難構(gòu)建的一類模型。

    本文重點(diǎn)研究案件過程動(dòng)態(tài)反演中人物骨骼模型的構(gòu)建與數(shù)據(jù)載入。結(jié)合公安工作現(xiàn)實(shí)需求,利用專業(yè)建模軟件3ds max構(gòu)建人物骨骼模型,并將其載入到基于OpenGL繪制的三維案件場(chǎng)景中,實(shí)現(xiàn)案件過程的動(dòng)態(tài)反演。

    1 人物骨骼模型的分析與構(gòu)建

    人體骨骼是一個(gè)十分復(fù)雜的結(jié)構(gòu),由200多塊骨骼組成。骨骼與肌肉、皮膚等組織共同完成人的行為動(dòng)作[2]。人物骨骼模型的組織結(jié)構(gòu)根據(jù)使用領(lǐng)域的不同而各有特點(diǎn),但都是參照人體骨骼運(yùn)動(dòng)原理,構(gòu)造一副骨骼層次架構(gòu)。驅(qū)動(dòng)骨骼,實(shí)現(xiàn)三維人物模型運(yùn)動(dòng)。

    1.1 骨骼模型特點(diǎn)

    在能夠說明案件人物基本行為動(dòng)作,重現(xiàn)案件發(fā)生發(fā)展過程的情況下,動(dòng)態(tài)反演系統(tǒng)中使用的人物骨骼模型層次架構(gòu)應(yīng)盡可能簡(jiǎn)單。圖1所示為本文所使用的人物骨骼模型結(jié)構(gòu)。人物的動(dòng)作大多集中在四肢,身體主軀干的運(yùn)動(dòng)在案件分析時(shí)可以忽略。為了簡(jiǎn)化模型構(gòu)建與縮小數(shù)據(jù)量,將模型頭部、胸部、腹部合為一體,形成所示的“士”字結(jié)構(gòu),此結(jié)構(gòu)為人物模型的根骨骼節(jié)點(diǎn),決定了模型的位置與朝向。其上連接四個(gè)子骨骼鏈,分別為左、右上肢和左、右下肢。模型上、下肢骨骼鏈為方向相反的同一結(jié)構(gòu),由圖2可以看出,每個(gè)子骨骼鏈由三個(gè)互為子父的骨骼組成,手與腳的結(jié)構(gòu)則簡(jiǎn)化為一個(gè)節(jié)點(diǎn)。

    圖1 簡(jiǎn)化骨骼模型

    圖2 骨骼模型層次結(jié)構(gòu)

    1.2 骨骼模型構(gòu)建

    根據(jù)簡(jiǎn)化的骨骼模型結(jié)構(gòu),利用3ds max中骨骼建模工具對(duì)簡(jiǎn)化的骨骼模型進(jìn)行構(gòu)建,步驟如下:

    首先,建立人物模型主軀干結(jié)構(gòu),并將其組合為一體,如圖3(a)所示。其次,創(chuàng)建四肢骨骼鏈結(jié)構(gòu),為其添加反向運(yùn)動(dòng)學(xué)的“HI IK解算器”,如圖3(b)所示。最后,將四肢骨骼鏈與模型主軀干相鏈接,完成人物骨骼模型的構(gòu)建,如圖1所示。

    圖3 人物骨骼模型構(gòu)建

    1.3 骨骼模型動(dòng)畫設(shè)置

    在案件過程的動(dòng)態(tài)反演系統(tǒng)中,所需人物骨骼模型動(dòng)作簡(jiǎn)單,不追求其觀賞性與藝術(shù)性,能夠正確演示人物普通動(dòng)作即可,如:行走、跳躍、射擊、跌倒等。在3ds max中,選擇使用“設(shè)置關(guān)鍵點(diǎn)”模式對(duì)人物骨骼模型進(jìn)行動(dòng)畫設(shè)置,手動(dòng)調(diào)整每個(gè)關(guān)鍵點(diǎn),根據(jù)案件動(dòng)態(tài)反演需求控制當(dāng)前幀模型的動(dòng)畫形態(tài)[3]。如圖4所示,為同一模型設(shè)置不同的運(yùn)動(dòng)數(shù)據(jù)。

    圖4 人物骨骼模型的動(dòng)畫設(shè)置

    2 動(dòng)態(tài)反演模型數(shù)據(jù)載入

    數(shù)據(jù)載入的基本思路是將3ds max、maya之類的工具以直觀的方式建立的物體模型保存成特定的文件格式,再用專門的解碼工具將模型轉(zhuǎn)換成一系列的節(jié)點(diǎn)(node),使OpenGL能夠正確顯示。解碼工具有三類:插件、工具軟件、程序庫[4]。為了使動(dòng)態(tài)反演系統(tǒng)各功能模塊更易于開發(fā)利用,本文使用程序庫的方法,創(chuàng)建模型數(shù)據(jù)載入模塊,人物骨骼模型為.3ds格式文件,該格式能夠存儲(chǔ)模型的動(dòng)畫數(shù)據(jù),且易于讀取。

    2.1 3ds格式文件

    3ds文件格式是由塊組成的樹形層次結(jié)構(gòu),每個(gè)塊結(jié)構(gòu)由兩部分組成,塊信息(占用6個(gè)字節(jié))與塊內(nèi)容(大小由所載內(nèi)容而定)。塊信息又分為兩部分,塊ID(占用2個(gè)字節(jié))和塊長度(占用4個(gè)字節(jié))。根據(jù)塊ID確定了一個(gè)層次結(jié)構(gòu),又根據(jù)塊的長度可以確定下一個(gè)塊的起始位置(塊的長度減去6就是塊內(nèi)容的長度)。正因?yàn)閴K的這種結(jié)構(gòu)特點(diǎn),在讀取模型數(shù)據(jù)過程中可以跳過那些不需要的塊,直接獲取所需的模型信息,提高工作效率[5]。由表1可以看出各個(gè)塊結(jié)構(gòu)所含的模型信息。

    2.2 數(shù)據(jù)載入方法

    (1)自定義模型文件數(shù)據(jù)格式。

    struct Lib3dsFile {

    表1 各塊ID代表信息

    Lib3dsDword mesh_version; ∥網(wǎng)格版本

    Lib3dsWord keyf_revision; ∥關(guān)鍵幀版本

    char name[12+1]; ∥文件名

    Lib3dsFloat master_scale; ∥比例值

    Lib3dsVector construction_plane; ∥頂點(diǎn)

    Lib3dsRgb ambient; ∥顏色信息

    Lib3dsShadow shadow; ∥陰影信息

    Lib3dsIntd frames; ∥動(dòng)畫幀信息

    Lib3dsIntd segment_from; ∥由上層結(jié)構(gòu)獲取的數(shù)據(jù)

    Lib3dsIntd segment_to; ∥向下層結(jié)構(gòu)傳遞的數(shù)據(jù)

    Lib3dsIntd current_frame; ∥當(dāng)前動(dòng)畫幀信息

    Lib3dsMaterial *materials; ∥材質(zhì)信息

    Lib3dsMesh *meshes; ∥網(wǎng)格信息

    Lib3dsNode *nodes; ∥節(jié)點(diǎn)信息

    };

    (2)對(duì)人物模型數(shù)據(jù)進(jìn)行讀取操作,使其存儲(chǔ)在(1)中定義的格式。

    ∥載入3ds數(shù)據(jù)文件,filename為文件存儲(chǔ)路徑。

    Lib3dsFile* lib3ds_file_load(const char *filename){

    FILE *f;

    Lib3dsFile *file;

    Lib3dsIo *io;

    ∥以讀寫的方式打開模型文件。

    f=fopen(filename,"rb");

    ∥如果未能正常打開模型文件,則返回?cái)?shù)值0。

    if (!f) {

    return(0);

    }

    ∥創(chuàng)建并返回一個(gè)自定義結(jié)構(gòu)的文件格式,如果未能創(chuàng)建返回NULL。

    file = lib3ds_file_new();

    ∥如果未能正確創(chuàng)建,則關(guān)閉文件。

    if (!file) {

    fclose(f);

    return(0);

    }

    ∥創(chuàng)建一系列用于輸入輸出的函數(shù),io為指向這些函數(shù)的指針。

    io = lib3ds_io_new(

    f,

    fileio_error_func,

    fileio_seek_func,

    fileio_tell_func,

    fileio_read_func,

    fileio_write_func

    );

    ∥如果未能正確創(chuàng)建,則釋放模型文件對(duì)象及其所有資源,關(guān)閉文件。

    if (!io) {

    lib3ds_file_free(file);

    fclose(f);

    return(0);

    }

    ∥讀取模型文件數(shù)據(jù)進(jìn)入自定義格式對(duì)象中,如果成功返回真,失敗則執(zhí)行if語句。

    if (!lib3ds_file_read(file, io)){

    free(file);

    lib3ds_io_free(io);

    fclose(f);

    return(0);

    }

    ∥釋放io指向的輸入輸出函數(shù)。

    lib3ds_io_free(io);

    ∥關(guān)閉文件。

    fclose(f);

    ∥返回讀取的文件。

    return(file);

    }

    (3)應(yīng)用顯示列表在OpenGL的場(chǎng)景中繪制模型。

    ∥因?yàn)?ds數(shù)據(jù)結(jié)構(gòu)為樹形結(jié)構(gòu),所以遞歸調(diào)用render_node函數(shù),循環(huán)繪制每個(gè)節(jié)點(diǎn)。

    render_node(Lib3dsNode *node){

    ASSERT(file);{

    Lib3dsNode *p;

    for (p=node->childs; p!=0; p=p->next) {

    render_node(p);

    }

    }

    ……

    ∥調(diào)用顯示列表

    if (mesh->user.d) {

    Lib3dsObjectData *d;

    glPushMatrix();

    d=&node->data.object;

    glMultMatrixf(&node->matrix[0][0]);

    glTranslatef(-d->pivot[0], -d->pivot[1], -d->pivot[2]);

    glCallList(mesh->user.d);

    glPopMatrix();

    if( flush )

    glFlush();

    }

    (4)關(guān)鍵幀數(shù)據(jù)的調(diào)用

    timer_cb(int value){

    ∥標(biāo)記當(dāng)前窗口需要重新繪制

    glutPostRedisplay();

    ∥控制模型動(dòng)畫幀循環(huán),超出后返回第0幀

    if (!halt) {

    current_frame+=1.0;

    if (current_frame>file->frames) {

    current_frame=0;

    }

    ∥計(jì)算當(dāng)前幀下模型節(jié)點(diǎn)的數(shù)量

    lib3ds_file_eval(file, current_frame);

    ∥定時(shí)器的回調(diào)函數(shù)

    glutTimerFunc(10, timer_cb, 0);

    }

    }

    3 實(shí)驗(yàn)與分析

    在3ds max中設(shè)計(jì)制作完成骨骼動(dòng)畫后,將其載入動(dòng)態(tài)反演系統(tǒng)框架中進(jìn)行演示。為了提高模型的重復(fù)利用率,不在模型制作階段進(jìn)行骨骼蒙皮,而是在最終制作案件過程動(dòng)態(tài)反演時(shí)根據(jù)需求為模型綁定蒙皮。因此,本文只進(jìn)行骨架層次結(jié)構(gòu)與動(dòng)畫數(shù)據(jù)的載入。

    在Visual Studio 2010中建立Win32控制臺(tái)應(yīng)用程序,用OpenGL圖形接口創(chuàng)建案件三維場(chǎng)景。根據(jù)案件重建需求,在場(chǎng)景中選擇添加地面以及全景圖。載入模型數(shù)據(jù),通過鼠標(biāo)與鍵盤的操作,可以控制不同視口觀察模型的運(yùn)動(dòng)過程。系統(tǒng)運(yùn)行仿真結(jié)果如圖5所示。

    仿真結(jié)果表明,創(chuàng)建的人物骨骼層級(jí)模型結(jié)構(gòu)簡(jiǎn)單,易于讀取和顯示。模型動(dòng)畫流暢真實(shí),在程序中加入計(jì)算幀率的代碼,顯示動(dòng)畫每秒達(dá)到60幀,且沒有出現(xiàn)一般模型動(dòng)畫中人物在地面滑行的情況。模型與案件場(chǎng)景融合較好,能夠正確、直觀地分辨出模型動(dòng)作,完全可以滿足案件偵查人員對(duì)案件分析、匯報(bào)等工作的需求。本實(shí)驗(yàn)仿真中對(duì)模型的控制操作較少,僅能實(shí)現(xiàn)對(duì)攝像機(jī)視角的控制,不能隨意切換模型動(dòng)作,設(shè)定模型初始載入點(diǎn)與朝向。實(shí)驗(yàn)程序只能載入一個(gè)模型,還不能滿足對(duì)于多人作案、有受害人等情形的案件過程重現(xiàn)。本文的數(shù)據(jù)載入是將所有模型數(shù)據(jù)作為一個(gè)整體載入到場(chǎng)景中,且是在Win32控制臺(tái)應(yīng)用程序中實(shí)現(xiàn)的。創(chuàng)建案件過程動(dòng)態(tài)反演系統(tǒng)中的模型數(shù)據(jù)載入模塊,還需要進(jìn)一步將其與MFC應(yīng)用程序框架相結(jié)合,優(yōu)化操作界面,增加系統(tǒng)交互性,并將數(shù)據(jù)載入細(xì)分為靜態(tài)模型與模型動(dòng)畫兩部分,添加更多的案件資料,充實(shí)動(dòng)態(tài)反演系統(tǒng)。

    圖5 動(dòng)態(tài)反演人物骨骼模型顯示

    4 結(jié)論

    本文主要討論了公安領(lǐng)域所需動(dòng)態(tài)反演人物骨骼模型的結(jié)構(gòu)特點(diǎn)、制作方案,以及模型數(shù)據(jù)的載入方法。創(chuàng)建了特點(diǎn)鮮明的人物骨骼模型,并為其設(shè)定了基本人物特征動(dòng)作,實(shí)現(xiàn)了在動(dòng)態(tài)反演系統(tǒng)窗口的顯示。本文提出的方法與思路,能夠初步滿足案件過程的動(dòng)態(tài)反演系統(tǒng)需求,為科學(xué)辦案提供技術(shù)支撐。但該方法還存在一些不足,以后的研究主要集中在正確讀取與顯示綁定蒙皮的人物骨骼動(dòng)畫模型,多個(gè)動(dòng)態(tài)模型多次添加,以及對(duì)載入的人物模型進(jìn)行運(yùn)動(dòng)控制等方面。

    [1]和平鴿工作室.OpenGL高級(jí)編程與可視化系統(tǒng)開發(fā) 系統(tǒng)開發(fā)篇[M].北京:中國水利水電出版社,2005:1.

    [2]王曉.角色動(dòng)畫在游戲中的設(shè)計(jì)及實(shí)現(xiàn)[D].上海:上海交通大學(xué),2012.

    [3]王珂.全視頻3ds Max動(dòng)畫設(shè)計(jì)與制作深度剖析[M].北京:清華大學(xué)出版社,2013: 2-5.

    [4]游資網(wǎng). OpenGL 入門教程(七)[EB/OL].(2006-04-13).[2014-03-31].http:∥dev.gameres.com/Program/Visual/3D/OpenGLTutorial/OpenGL_7.htm.

    [5]The Labs. Com. 3D Studio File Format (3ds) [EB/OL].(2013-10-11).[ 2014-03-31]. http:∥www.the-labs.com/Blender/3dsspec.html.

    猜你喜歡
    骨骼反演動(dòng)畫
    反演對(duì)稱變換在解決平面幾何問題中的應(yīng)用
    做家務(wù)的女性骨骼更強(qiáng)壯
    中老年保健(2021年5期)2021-12-02 15:48:21
    三減三健全民行動(dòng)——健康骨骼
    中老年保健(2021年5期)2021-08-24 07:06:28
    做個(gè)動(dòng)畫給你看
    動(dòng)畫發(fā)展史
    我的動(dòng)畫夢(mèng)
    文苑(2019年22期)2019-12-07 05:28:56
    基于低頻軟約束的疊前AVA稀疏層反演
    基于自適應(yīng)遺傳算法的CSAMT一維反演
    骨骼和肌肉
    小布老虎(2017年1期)2017-07-18 10:57:27
    我是動(dòng)畫迷
    久治县| 且末县| 抚宁县| 海南省| 焉耆| 固始县| 镇康县| 济南市| 阜宁县| 建湖县| 尉氏县| 金坛市| 旬邑县| 始兴县| 松原市| 南陵县| 稻城县| 七台河市| 清丰县| 建阳市| 宣汉县| 枞阳县| 桐乡市| 建阳市| 磐安县| 永平县| 黄浦区| 乐平市| 河源市| 玛曲县| 开原市| 公安县| 新绛县| 罗源县| 涪陵区| 甘南县| 灌阳县| 南和县| 区。| 曲沃县| 新巴尔虎右旗|