骨骼的演算法
1. 骨架大小到底如何算
手量法。
用手指的食指和大拇指圈住左手腕骨頭突起的地方,就可以大約判斷骨架的大小。如果食指和拇指的指尖能碰觸到說明骨架中等。兩指有交疊說明骨架小。兩手指互相碰不到,說明骨架大。
2. 人體骨骼排列的概率,進化的理論能成立嗎
生命起源、概率,與彩票。
假設某個傢伙買了一個中獎概率為千萬分之一的單注彩票,結果是他真的中了特等獎。在巨大的精神沖擊下他開始胡思亂想:千萬分之一的概率是如此之低,一個人買上一輩子彩票都不可能中,這個特等獎要麼是幻覺,要麼是陷阱,於是乎他拒絕去領獎。如果某個彩民真這樣做了,所有人都會嘲笑他腦子秀逗,但與此類似的思維方法卻累見不鮮,比如反對生命自然起源的人常干這樣的事。
我們再回到那個拒絕領獎的彩民,他的主要錯誤就是只從單人的視角認為中獎是個極小概率事件,因此傾向於判斷其不可能真實發生。但從整個彩票發行規模的尺度來看,假如當期彩票真賣了一千萬注,且只有他一個人獲得特等獎,那麼這個中獎事件從整體的角度來看是合理的。假如每期彩票只賣了十萬注,但已經累計100期沒有任何人中獎,那麼這一期有人中特等獎,同樣也是可以接受的。因此我們考慮一個極小概率事件的發生可能是否存在,除了他本身的「單次」概率,還要考慮事件在空間和時間上延續的尺度。
對於一個在地球上自然起源生命的概率有多小?無論是生命自然起源的支持者或反對者都不能給出過分樂觀的數字。但道金斯的《盲眼鍾表匠》中有個很有意思和說服力的思考:對於生命起源的可能性的討論,必須考慮整個宇宙的廣度和時間延伸。由於我們目前尚未在宇宙其他地方發現任何的生命現象,那麼最極端的情況就是整個宇宙在近200億年的時間歷程中,只有地球誕生了一次生命,類比剛才的彩票邏輯,彩票發行的范圍非常之廣(全宇宙),發行時間如此之長(200億年),而目前看來中獎的只有地球這一注,即使生命自然起源是一個極極極極低的概率事件,那麼從整體上來看,他的發生也是完全可能的。為什麼大多數人無法接受這個可能性?因為「一般人」的思維尺度是有局限性的,他們對「可能性」定義的最大極限,是他們在自己區區幾十平方公里的生活范圍,短短100年的生涯中可能發生的事情,而任何超越這個廣度和時間太多的(比如恐怖的宇宙尺度范圍)思維命題,對於一般人就顯得尤其困難。
另有一個假設:這個世界中有無數個平行宇宙,只有誕生生命的那個宇宙,才可能有智能生命對生命起源問題進行思考並產生疑惑,而我們所在的宇宙恰好是誕生了生命的那個。呵呵,這個假設實際上將彩票發行注數擴展到無限,需要多大就多大,且無法證偽,很強大但也很無賴,基本上和全知全能的大神是一路貨色。在此提起這個假設,僅供思維游戲,不可當作嚴謹的科學假說。
盡管嚴謹的生命科學家不能任意擴大生命彩票的發行數,不敢逾越現有天文學和宇宙生命的觀測結果。但反對生命自然起源的人卻不用管這些科學思維的「規矩」,在多年來的反進化宣傳中,不斷地給生命自然起源的低概率加碼。最本源表述的靈感來自威廉·培利(William Paley)主教,大概意思是:「生命自然起源的概率,相當於一陣風刮過一堆零件,產生了一個裝配正確的鍾表」。鍾表只怕是當時能想到的最復雜的東西。隨著科技的進步,該責難也能與時俱進,一陣風刮出個火車頭,一陣風刮出個波音747,反正從1百多年前到現在,雖然談論都是生命的自然起源概率這一件事,但用來類比的東西卻越來越復雜,究竟復雜到什麼程度,他們自己也沒有一個譜,反正盡往最復雜的東西上靠就對了。
不過我至少可以肯定世界上不可思議的事情就是:一陣風刮出來一個全知全能至善至美的大神。有些人相信這個,卻斷然否定大風可以刮出一個波音747,他們的邏輯標准還真是和他們的大神一樣神秘而不可琢磨。
3. 古代動物骨頭的計算方法
1.1 骨結構力學指標的選擇和計算方法 三點彎曲力學試驗中骨結構力學指標主要 有最大載荷,最大橈度,彈性載荷,彈性橈度及 能量吸收(載荷變形曲線下的面積)前4 標可直接從載荷一變形曲線上獲得或從儀器上直接給出.能量吸收可從儀器計算機上給出.有 時由於儀器等級的限制,不能給出載荷變形 曲線(指載荷最大或斷裂變形曲線)下的面 積,此時可人工計算載荷彈性變形曲線下的 面積,其方法是將該圖形做成直角三角形,計算 該三角形面積即可.上述骨結構力學指標主要 反映骨結構力學特性的變化,其變化主要受骨 尺寸的大小和骨幾何形狀的影響.當骨的幾何 形狀和尺寸大小發生變化時,上述指標將發生 變化,例如在單純給予氟化物對抗OVX 大鼠 骨丟失過程中,由於該制劑使骨的幾何形狀,特 別是骨尺寸發生變化.使得該葯物對骨結構力 學特性無明顯影響,但使骨材料力學特性降低, 導致骨質量降低一根據骨結構力學特性的變 化可幫助判斷骨幾何形狀或尺寸的變化.
1.2 骨材料力學指標的選擇和計算方法 選擇任何一項骨材料力學特性指標的前 提,是首先要計算骨截面魄性矩廢項指標的計 算方法較多,這是囤為骨橫截面的形狀並不規 作者單位:1OOc94.航天醫學工程憲所 則.目前比較一致的觀點是將骨(指股骨)橫截 面看作為橢圓形,骨截面慣性 矩(1,)的計算公式為J 一(BH.--bh.)/64 中日:骨橫截面外層長軸,H:骨橫截面外層短軸.b:骨橫截面內層長軸,h:骨橫截面內層短 軸.根據每個骨樣品的l,,可選擇並計算如下指 長骨橢圓形橫截面1)骨應力 計算公式為:應力一 力方向外徑;l,:骨截面慣性矩2)骨應變 計算公式為:應變一12~7H/2 3)骨彈性模量(又稱內在硬度)計算公式為:彈性模量一 F:為彈性載荷值?
4)骨剛性系數(又稱外在硬度) 中國骨質疏杷雜志I9 計算公式為:剛性系數一式中為彈性載荷值 四點彎曲力學試驗2.1 骨結構力學指標的選擇與計算同三點彎 曲力學指標.
2.2 骨材料力學指標的選擇與計算 同三點彎曲力學試驗一樣,首先計算骨截 面慣性矩方法同三點彎曲力學試驗 I)骨應力 計算公式為:應力一 公式中為同側支中心到同側壓縮頭 中心點的距離.如圖2 所示 四彎睹力學試驗2)骨應變 計算公式為:應變一百
3)彈性模量 計算公式為:彈性模量ZAZL 一4_4) 應該指出的是,三點彎曲材料力學應變的 計算公式僅適用於彈性應變的計算由於在三 點彎曲力學試驗中有剪切應力誘導的骨變形存 在,該變形占骨整個變形值的l0~15%J 此計算的結果值要大於實際彎曲引起的變形值,而計算的彈性模量值要低於實際值,在實際 應用中應注意此差的存在由於四彎曲力 學試驗能克服三彎曲力學試驗的不足之處. 使剪座力為零.因此四電彎曲力學試驗中的 應變可適用於彈性應變和屈服點後應變的計 算要清楚的是.這些計算出的數據均是間接計 鍾仙來的.與儀器直接給出的數據相比.精確度 差(有一定誤差存在),這點也應注意到.
上述所介紹的是股骨彎曲試驗的計算方 法有時需用脛骨進行彎曲力學試驗,由於兩種 骨骼的幾何形狀有一定差異,因此其骨截面慣 性矩的計算公式應為: 在計算出和朋.應在骨的兩個支點處和中心點處分別測定和,取平均值其 它力學指標計算方法同三點和四點彎曲力學計 算公式 骨壓縮力學試驗的指標選擇和計算方法該試驗主要適用於椎骨,但也可將長骨制 備戚標准件後進行壓縮力學試驗.壓縮力學試 驗常選用如下力學指標對骨力學特陛進行綜合 評價.
1)最大壓縮載荷:它是對骨小梁的骨質,結 構連續性.皮質厚度,橫截面積和材料質量的綜 台反應可直接從載荷一變形曲線上獲得.
2)骨最大應變:可根據骨標本縮短的最大 長度與其初始長度的比值獲得.
3)骨最大應力:骨橫截面單位面積上所承 受的載荷值骨標本橫截面積的計算方法如下: 根據阿基米德定律計算骨體積,公式如下: 骨體積一量望重三警愛 計算出的骨體積與標本高度的比值為面積
4)彈性模量:應力一應變曲線上的最大斜 5)骨強度:骨最大截荷值與每1"171111標本長 度內礦鹽含量的比值(或與骨鹽密度rag/ram 比值) .4No.11998
6)骨最大硬度:載荷一應變曲線的最大斜 率與每mm 標本長度礦鹽含量或與骨礦鹽密 度的比值 7)能量最大吸收:骨應力一斷裂變形曲線 下的總面積(mJ/ram). 骨扭轉力學試驗指標的選擇及計算方法這是一項比較敏感的骨生物力學試驗,骨 組織對不同力學載荷耐受程度大小的順序依次 為壓縮載荷>彎曲載荷>扭轉載荷.由此可知, 骨組織對扭轉力學試驗是比較敏感的.
1)最大剪切應力 計算公式為:剪切應力一公式中丁:扭力矩,,:骨標本外層半徑: 極性截面慣性矩. 應該指出的是,該公式適用於標本橫截面 為圓形的圓柱體的扭轉應力計算.長骨的橫截 面積並不是標准圓形,因此在計算中,值應取 骨外層長軸半徑和骨外層短軸半徑的平均值. 值按三點彎曲力學實驗中的計算方法計 算,所得數值乘以2 即為極性截面慣性矩.或取 骨橫截面最大和最小部位的值之和為 JJ
4. 骨骼綁定 頂點 演算法
綁好骨骼的模型如果想保持某一個pose直接調骨骼就好了,但是要打開自動關鍵幀,這樣你調的pose才能被自動記錄下來,如果你是要把模型擺好pose後作場景里的一個雕塑用,在調好pose後,選擇模型直接塌陷掉蒙皮skin或者Physique,或者把模型再轉一次poly都可以,這時模型的姿勢就定格了,然後把骨骼刪掉,只保存模型就行了。
個步驟都影響著最終的動畫效果,甚至還有專門從事骨骼綁定的人員——骨骼綁定師。秒秒學MAYA角色骨骼綁定寶典主要從關節工具的使用,掌握修改關節屬性、創建下身骨架、脊椎骨骼和手部關節以及學習使用關節鏡像命令等方面介紹,讓初學者一步步了解綁定設置,掌握maya角色骨骼綁定。
5. 袁天罡的「稱骨演算法」究竟是什麼,如何計算
稱骨算命是算命方法的一種,和生辰八字算命、紫微斗數算命異曲同工,略有不同,雖然都是用出生的時間算命,但比較而言,稱骨算命將命運分的比較粗略,只是把命運分為五十一種,計算方法:從您農歷的出生年月日時辰來核算重量;據此再照命評命詩,稱骨算命是由袁天罡創立,根據每個人的生辰八字,年、月、日、時分別的重量計算總合。得出八字重量:稱骨重量。然後根據袁天罡稱骨演算法進行稱骨算命。
6. 骨重的計算方法是什麼
人體骨骼大約占人體20%重量,通常情況下男性骨重8.0kg、女性骨重5.4kg。
人骨中含有水、有機質(骨膠)和無機鹽等成分。其水的含量較其他組織少,平均約為20~25%。在剩下的固體物質中,約40%是有機質,約60%以上是無機鹽。
骨骼與人體的代謝關系十分密切。骨骼中含有大量的鈣、磷及其他有機物和無機物,是體內無機鹽代謝的參與者和調節者。
(6)骨骼的演算法擴展閱讀:
骨骼與肌肉、肌腱、韌帶等組織協同,共同完成人的運動功能。骨骼提供運動必須的支撐,肌肉、肌腱提供運動的動力。
骨骼的造血功能表現在人的幼年時期,骨髓腔內含有大量的造血細胞,這些細胞參與血液的形成。人到成年後,部分松質骨內仍存在具有造血功能的紅骨髓。
7. 骨頭重量算命
各種各樣的算命方法准嗎?比如八字、稱骨頭重量什麼的 算命嗎?有的講《易經》,有的說《冰鑒》.那我們就來談談什麼是命運:有人講人的命天註定,每個人都有各自的命運,是註定的不同的.那麼命運是註定的么?我告訴你:是註定的,然而註定它的並不是天,而是你的思想.卻切說是命運是由你在人生的眾多的選擇中決定的.假設你是只毛蟲,要爬上人生這顆大樹,那麼在每一個分叉的枝椏的選擇決定了你最終走到哪個樹梢,所以無數個選擇造就無數種命運.決定你如何選擇的是思想,要改變命運只能改變思想,如果不改變思想就算讓你重新活一遍你也必將走到今天,創立騰訊的依然是馬化騰,當總統的依然是奧巴馬.那麼命運可以預測嗎?可以,只要能相對客觀的解讀思想再佐以對規律的把握.例如一個人骨子裡爭勇鬥狠,暴躁無常,開車如飛,傷於車禍或斗毆就是必然的,要改變這些功要改變性格,而性格恰恰是思想決定的.
鬼穀子骨算命如何確定出生年重量 鬼穀子稱骨算命法
出生時辰的重量:
子時(23-1點):一兩六 丑時(1-3點):六錢
寅時(3-5點):七錢 卯時(5-7點):一兩
辰時(7-9點):九錢 巳時(9-11點):一兩六
午時(11-13點):一兩 未時(13-15點):八錢
申時(15-17點):八錢 酉時(17-19點):九錢
戌時(19-21點):六錢 亥時(21-23點):六錢
出生日的重量:
初一:五錢 初二:一兩 初三:八錢 初四:一兩五 初五:一兩六
初六:一兩五 初七:八錢 初八:一兩六 初九:八錢 初十:一兩六
十一:九錢 十二:一兩七 十三:八錢 十四:一兩七 十五:一兩
十六:八錢 十七:九錢 十八:一兩八 十九:五錢 二十:一兩五
廿一:一兩 廿二:九錢 廿三:八錢 廿四:九錢 廿五:一兩五
廿六:一兩八 廿七:七錢 廿八:八錢 廿九:一兩六 三十:六錢
出生月的重量:
一月:6錢 二月:7錢 三月:1兩8 四月:9錢
五月:5錢 六月:1兩6 七月:9錢 八月:1兩5
九月:1兩8 十月:8錢 十一月:9錢 十二月:5錢
出生年的重量:
1941:6錢 1942:8錢 1943:7錢 1944:5錢 1945:1兩5
1946:6錢 1947:1兩6 1948:1兩5 1949:7兩 1950:9錢
1951:1兩2 1952:1兩 1953:7錢 1954:1兩5 1955:6錢
1956:5錢 1957:1兩4 1958:1兩4 1959:9錢 1960:7錢
1961:7錢 1962:9錢 1963:1兩2 1964:8錢 1965:7錢
1966:1兩3 1967:5錢 1968:1兩4 1969:5錢 1970:9錢
1971:1兩7 1972:5錢 1973:7錢 1974:1兩2 1975:8錢
1976:8錢 1977:6錢 1978:1兩9 1979:6錢 1980:8錢
1981:1兩6 1982:1兩 1983:7錢 1984:1兩2 1985:9錢
1986:6錢 1987:7錢 1988:1兩2 1989:5錢 1990:9錢
1991:8錢 1992:7錢 1993:8錢 1994:1兩5 1995:9錢
1996:1兩6 1997:8錢 1998:8錢 1999:1兩9 2000:1兩2
2001:6錢 2002:8錢 2003:7錢 2004:5錢 2005:1兩5
2006:6錢 2007:1兩6 2008:1兩5
批註詩:
2兩1:短命非業謂大凶,平生災難事重重,凶禍頻臨限逆境,終世困苦事不成
2兩2:身寒骨冷苦伶仃,此命推來行乞人,勞勞碌碌無度日,中年打拱過平生
2兩3:此命推來骨輕輕,求謀做事事難成,妻兒兄弟應難許,別處他鄉作散人
2兩4:此命推來福祿無,門庭困苦總難榮,六親骨肉皆無靠,流到他鄉作老人
2兩5:此命推來祖業微,門庭營度似希奇,六親骨肉如水炭,一世勤勞自把持
2兩6:平生一路苦中求,獨自營謀事不休,離祖出門宜早計,晚來衣祿自無憂
2兩7:一生做事少商量,難靠祖宗作主張,獨馬單槍空作去,早年晚歲總無長
2兩8:一生作事似飄蓬,祖宗產業在夢中,若不過房並改姓,也當移徒二三通
2兩9:初年運限未曾亨,縱有功名在後成,須過四旬方可上,移居改姓使為良
3兩:勞勞碌碌苦中求,東走西奔何日休,若能終身勤與儉,老來稍可免憂愁
3兩1:忙忙碌碌苦中求,......>>
八字稱骨算命重量越大越好嗎?骨重輕的能化解嗎? 袁天罡鼎骨演算法:根據個人八字(即出生年月日和時辰),分別在後面所附內容中查出出生年的重量、出生月的重量、出生日的重量以及出生時辰的重量,將四個重量相加所得即為八字重量。根據八字重量去查相關的批註詩。一般說來,八字重的比較不容易振的住,也就是說不容易被邪物侵擾,當然玩招魂招仙的游戲也不容易成功。顯然不是絕對的八字越重越好,輕的也有比較好的,但從一般意義上說,八字重的普遍比輕的得到的批示要好,所以不用太擔心,主要還看你命理的主脈。
稱骨算命骨重越重越好嗎 袁天罡稱骨術,根據生辰判斷骨重,從分析表上看確實越重越好。
命運,骨稱輕的很差,骨稱越重的越好是不是 *** 的八字才三兩,具體要看八字結構的,才能知道命好與不好
稱骨頭算命男命2兩9 最不靠譜的。
生辰八字稱重查詢表 稱骨算命對照表骨重 稱骨算命表對應命運2.1 兩 短命非業謂大空,平生災難事重重;凶禍頻臨陷逆境,終世困苦事不成。 2.2 兩 身寒骨冷苦伶仃,此命推來行乞人;勞勞碌碌無度日,終年打拱過平生。 2.3 兩 此命推來骨格輕,求謀作事事難成;妻兒兄弟應難許,別處他鄉作散人。 2.4 兩 此命推來福祿無,門庭困苦總難榮;六親骨肉皆無靠,流浪他鄉作老翁。 2.5 兩 此命推來祖業微,門庭營度似稀奇;六親骨肉如冰炭,一世勤勞自把持。 2.6 兩 平生衣祿苦中求,獨自營謀事不休;離祖出門宜早計,晚來衣祿自無休。 2.7 兩 一生作事少商量,難靠祖宗作主張;獨馬單槍空做去,早年晚歲總無長。 2.8 兩 一生行事似飄蓬,祖宗產業在夢中;若不過房改名姓,也當移徒二三通。 2.9 兩 初年運限未曾亨,縱有功名在後成;須過四旬才可立,移居改姓始為良。 3 兩 勞勞碌碌苦中求,東奔西走何日休;若使終身勤與儉,老來稍可免憂愁。 3.1 兩 忙忙碌碌苦中求,何日雲開見日頭;難得祖基家可立,中年衣食漸無憂。 3.2 兩 初年運蹇事難謀,漸有財源如水流;到得中年衣食旺,那時名利一齊收。 3.3 兩 早年做事事難成,百年勤勞枉費心;半世自如流水去,後來運到始得金。 3.4 兩 此命福氣果如何,僧道門中衣祿多;離祖出家方為妙,朝晚拜佛念彌陀。 3.5 兩 生平福量不周全,祖業根基覺少傳;營事生涯宜守舊,時來衣食勝從前。 3.6 兩 不須勞碌過平生,獨自成家福不輕;早有福星常照命,任君行去百般成。 3.7 兩 此命般般事不成、弟兄少力自孤行;雖然祖業須微有,來得明時去不明。 3.8 兩 一身骨肉最清高,早入簧門姓氏標;待到年將三十六,藍衫脫去換紅袍。 3.9 兩 此命終身運不通,勞勞作事盡皆空;苦心竭力成家計,到得那時在夢中。 4 兩 平生衣祿是綿長,件件心中自主張;前面風霜多受過,後來必定享安康。 4.1 兩 此命推來自不同,為人能幹異凡庸;中年還有逍遙福:不比前時運來通。 4.2 兩 得寬懷處且寬懷,何用雙眉皺不開;若使中年命運濟,那時名利一起來。......>>
稱骨算命中,骨重越大越好嗎?謝謝。 對的,但是由於人的基數根不相同,又會導致不同結果,比如說一個基礎根很劣的人,出身貧寒,但是他如果過上中層的生活就是超越.相反亦同,所以這要綜場考量,樓主近日是否感覺遇事不通,其實還是應該放寬心,注意風水,保護好
稱骨算命是根據你的出生具體時間(理論上要求精確到秒)而判斷命運的好與壞。並不是越重越好,也不是越輕越好。它有一套完整的骨重命運表,你從網上應該能搜索到,自己去對應一下便知好壞。
稱骨算命法只是按你的出生年月日套算,這裡面的骨是一種稱喂,跟人身上的骨頭是完全2碼事.當然只是算命的話,當然是重量越大命就越好哦,這不過是迷信而已.
袁天罡秤骨算命解析 交友謹慎,老年衣食足用之命
忙忙碌碌苦中求,何日雲開見日頭,難得祖基家可立,中年衣食漸能周。
註解:此命推來敬重雙親,有福有祿,六親和睦,義氣高強,少年勤學有功名,忠孝雙 全,心中無毒,不貴則福,出外受人欽佩,四海聞名,老來榮華,限上無憂,一生安康 ,年輕欠利,末限安享福祿,白鶴先生雲:此命三限,有子孫旺相局,初限早成家計, 辛勤勞苦,中限漸漸生財重奔江山,夫妻少配無刑,末限榮華富貴,壽元八十三歲,死 於冬月之中。
稱骨算命詳解 六兩六錢: 大富大貴,堆金積玉之儲命 _評骨格重量歌訣_袁天罡稱骨
註解:此格人間一福人,堆金積玉滿堂春,從來富貴由天定,正笏垂紳謁聖君。
意思是,這樣的骨頭 是富貴命,錢財多多,是有福祿的命,是與上流社會接觸的上等命。
8. 骨骼化演算法是什麼
一種運用數學形態學運算的數字圖像處理演算法
9. 如何做人體骨架模型
本文提供一種將骨架動作矢量映射到人體骨架模型的一種方法,通過輸入各個骨骼的當前方向,反饋給骨架模型,這樣就實現了動畫的效果。實驗開發工具是VC6.0在OpenGL平台上開發完成。
閱讀對象:
假定讀者已經熟悉OpenGL編程,就算不熟悉,只要了解基本的旋轉,平移,堆棧操作就好。
假定讀者已經了解基本的c++編程,其中需要了解遞歸的演算法,遞歸的方法請參考一下數據結構吧。
製作過程:
第一步,3D模型准備
這一步驟的目的是提供分解的骨骼模型,它需要導出多個組成身體結構的文件,模型可以不用自己製作,只要到網上找找吧,應該很多,最好是是人體模型,如果用動物的模型也可以,不過需要自己定義映射骨架了,比如圖中的骷髏模型是我從人體動畫軟體poser 5.0找到的。然後使用3d max 將身體的各個部位導出為3ds文件,這個步驟很簡單,也不需要有什麼3d max的基礎。這里有一個小的技巧就是可以選中多個部分作為一個3ds模型導出,比如我需要將左右肩胛骨與脊椎骨肋骨作為同一個部分導出,這樣可以將它命名為身體軀干(body)。這樣我們就准備了各個3ds文件了,分別是:
身體軀干 BODY.3DS
頭部 HEAD.3DS
左臂 LSHOULDER.3DS
右臂 RSHOULDER.3DS
左小臂 LELBOW.3DS
右小臂 RELBOW.3DS
左大腿 LTHIGH.3DS
右大腿 RTHIGH.3DS
左小腿 LFEET.3DS
右小腿 RFEET.3DS
這樣這些組成部分就可以靈活的拼接出一個人體來了。
第二步,定義相關的核心數據結構
為了得到運動的各個身體部分數據信息,我們需要存儲一些運動信息,主要有:
骨骼ID
骨骼關節的當前位置;r_x,r_y,r_z
骨骼之間的關系,例如手臂是軀乾的延伸,而左小臂是左臂的延伸;PID,CID
我們可以通過下圖來了解骨骼之間的結構關系
存放3ds文件位置;file_name_3ds
3ds模型的初始化方向;這個是比較抽象一點的概念,它是指從父節點指向子節點的方向,例如左小臂的初始位置是平放向下,那麼對應的矢量就是 (-0.2,-1,0)
以下是數據結構部分:
class bone
{
public:
int y;
int x;
int r_z; //現實世界z坐標
int r_y;
int r_x;
int rotated_X; //旋轉後的坐標
int rotated_Y;
int is_marked; //是否已經標記
int PID; //父節點
int CID; //子節點,目前針對軸關節和膝蓋有效
float start_arc_x,end_arc_x; //相對父節點的x 左右方向轉動角度限制
float start_arc_y,end_arc_y; //相對父節點的y 上下方向轉動角度限制
float start_arc_z,end_arc_z; //相對父節點的z 前後方向轉動角度限制
double LengthRatio;
char name[80]; //名稱
char file_name_3ds[180]; //3ds文件名稱
int ID;
bone(int ID,char *name,int PID);
virtual ~bone();
float bone_init_x,bone_init_y,bone_init_z; //初始化骨骼的矢量方向,3d max 模型
};
第三步,初始化骨架結構
在定義了bone的結構以後,我們定義一個skeleton類來在第一次初始化時載入這些結構,
obone = bone (2,"head",1); //定義一個bone
strcpy(obone.file_name_3ds,"head.3DS"); //設置它的3ds文件名
obone.bone_init_x = 0; //初始化骨骼的矢量方向
obone.bone_init_y = 1;
obone.bone_init_z = 0;
bonevec.push_back (obone); //放入vector結構,這里用到了STL編程技術中的vector
以下是實現的部分代碼:
skelecton::skelecton()
{
float fy = 0.56f ;
float ftx = 0.19f;
float ffx = 0.08f;
bone obone = bone (1,"neck",0);
bonevec.push_back (obone);
obone = bone (2,"head",1);
strcpy(obone.file_name_3ds,"head.3DS");
obone.bone_init_x = 0;
obone.bone_init_y = 1;
obone.bone_init_z = 0;
bonevec.push_back (obone);
obone = bone (3,"rShoulder",1);
bonevec.push_back (obone);
obone = bone (4,"lShoulder",1);
bonevec.push_back (obone);
obone = bone (5,"rElbow",3);
strcpy(obone.file_name_3ds,"rShoulder.3DS");
obone.bone_init_x = fy;
obone.bone_init_y = -1;
obone.bone_init_z = 0;
obone.CID = 7;
bonevec.push_back (obone);
obone = bone (6,"lElbow",4);
strcpy(obone.file_name_3ds,"lShoulder.3DS");
obone.bone_init_x = -fy;
obone.bone_init_y = -1;
obone.bone_init_z = 0;
obone.CID = 8;
bonevec.push_back (obone);
//.............太長只給出部分的代碼..........................
}
第四步,學習3ds公共的類CLoad3DS,可以用來載入顯示模型
這個類是公用一個類,詳細的類CLoad3DS的介面信息可以到一個open source項目里參考。http://scourge.sourceforge.net
http://scourge.sourceforge.net/api/3ds_8h-source.html
實際上在使用這個類時候,我做了一些修改,加了得到最大頂點的方法。這個在第五步會說明。
我們定義一個OpenGL的類來做模型控制類,負責載入模型,
CLoad3DS* m_3ds;
int OpenGL::Load3DS(int ID, char *filename)
{
if(m_3ds!=NULL) m_3ds->Init(filename,ID);
return 0;
}
然後在顯示時候調用
int OpenGL::show3ds(int ID)
{
m_3ds->show3ds(ID,0,0,0,2);
return 0;
}
第五步,使用遞歸方法分層次載入模型
這里是重點的內容了,讓我們思考一些問題,實現骨骼會隨著輸入的方向而改變方向,需要做那些事情呢?
首先針對一塊骨骼來考慮:
第一,我們需要讓骨骼繞著它的節點旋轉到輸入的方向上
第二,我們需要知道骨骼目前節點的位置,才能旋轉。可是我們知道骨骼會跟著它的父骨骼轉動的,例如左小臂會跟著左臂轉動,當身體轉動時左臂也會跟著身體轉動的,這里看起來像是有一個父子連動的關系,所以當前節點的位置會與它的父骨骼有關,父骨骼轉動的角度,子骨骼也必須轉動,所以這里自然想到了遞歸模型了,至於如何存儲這些轉動過程呢,還好openGL提供了glPushMatrix();glPopMatrix();那麼所有的子骨骼必須包含在父骨骼的glPushMatrix();glPopMatrix();好了,這個變成
//遞歸實現3d現實
int skelecton::Render_skeleton_3D(int ID)
{
glPushMatrix(); //開始記錄堆棧
joint_point = pgl->get_joint_point(ID); //找到節點位置
glTranslatef(joint_point.x,joint_point.y,joint_point.z); //坐標移到節點位置
pgl->rotate_bone (vt1,vt2,vto); //旋轉骨骼到指定的方向
glTranslatef(-joint_point.x,-joint_point.y,-joint_point.z);//坐標移回來
pgl->show3ds(ID); //顯示模型
//遍歷子節點
for (theIterator = bonevec.begin(); theIterator != bonevec.end(); theIterator++)
{
pbone = theIterator;
if((pbone->PID == ID) )
{
Render_skeleton_3D(pbone->ID); //遞歸調用
}
}
glPopMatrix(); //退出記錄堆棧
}
剩下需要解決的問題就是如何找到節點位置。
尋找節點位置,我們看到上面代碼 get_joint_point(ID)就是找到節點了,其實如果不追求高的准確度,我們可以假設每個模型的最高的點即為骨骼的節點,當然這個假設前提是人體模型是正面站立的,手臂自然垂下,這樣可以近似認為每個模型的最高的點即為骨骼的節點,這樣函數就很簡單了,這個方法是修改了Cload3ds類的方法,如下:
Vector3f CLoad3DS::get_joint_point(int j0)
{
CVector3 LastPoint;
Vector3f vect;
LastPoint.y = -1000 ;
if(j0==2) LastPoint.y = 1000 ;//頭部節點朝下
// 遍歷模型中所有的對象
for(int l = 0; l < g_3DModel[j0].numOfObjects; l++)
{
if(g_3DModel[j0].pObject.size() <= 0) break;// 如果對象的大小小於0,則退出
t3DObject *pObject = &g_3DModel[j0].pObject[l];// 獲得當前顯示的對象
for(int j = 0; j < pObject->numOfFaces; j++) // 遍歷所有的面
{
for(int tex = 0; tex < 3; tex++) // 遍歷三角形的所有點
{
int index = pObject->pFaces[j].vertIndex[tex]; // 獲得面對每個點的索引
if(j0==2)
{
if(pObject->pVerts[index].y < LastPoint.y )
LastPoint = pObject->pVerts[index];
}
else
{
if(pObject->pVerts[index].y > LastPoint.y )
LastPoint = pObject->pVerts[index];
}
}
}
}
vect.x = LastPoint.x ;
vect.y = LastPoint.y ;
vect.z = LastPoint.z ;
return vect;
}
比較特殊的是頭部節點是通過脖子連接的,所以它是取最低的點。
現在解決最後的問題了,如何旋轉了,具體來講就是骨骼從原來自然的狀態旋轉到目前的方向,例如手臂從自然垂下變成抬起,垂下和抬起兩個狀態的矢量是不同的方向的,如何旋轉呢? 這里就要用到了空間幾何里的點積和叉積的概念了,簡單來講就是利用點積來求矢量夾角餘弦,利用叉積來求兩個矢量的法向量,如果你忘記了這些概念,可以回去參考一下高等數學書,這個連接也提供了一些資料,可以幫助理解http://www.gameres.com/Articles/Program/Visual/Other/shiliang.htm
然後呢,我們知道了兩個矢量的夾角與它們的法向量,下面的事情就變得簡單了,我們讓骨骼原來的矢量以法向量為旋轉軸,旋轉一定角度,這個角度就是兩個矢量的夾角,這樣問題就解決了,所以這里的代碼如下:
int OpenGL::rotate_bone(Vector3f vVector1, Vector3f vVector2, Vector3f vVectorOrgin)
{
Vector3f vt1 = Vector3f(vVector1.x,vVector1.y,vVector1.z);
Vector3f vt2 = Vector3f(vVector2.x,vVector2.y,vVector2.z);
Vector3f vt4 = vt2-vt1;
double arc12 = AngleBetweenVectors(vVectorOrgin,vt4);
double rarc12 = 180*arc12/pi;
float len= Distance(vt1,vt2);
Vector3f vt3 = Cross(vVectorOrgin,vt4);
glRotatef ((float)rarc12,vt3.x,vt3.y,vt3.z);
return 0;
}