3d圖形渲染中的三角函數計算方法
2023-05-27 03:18:26 2
專利名稱::3d圖形渲染中的三角函數計算方法
技術領域:
:本發明涉及3D圖形渲染技術,特別涉及一種3D圖形渲染中的三角函數計算方法。技術背景在3D圖形程序中,經常用到三角函數求值的運算,例如粒子系統、Billboard算法、場景內草體生成、骨骼動畫模塊等。三角函數的運算效率會影響圖形的效果,提高三角函數運算效率有助於程序流暢運行,增強粒子效果的表現等。在現有技術中,根據DirectXSDK工具包中的數學庫XNAMath實現三角函數的計算,詳細介紹如下DirectXSDK是微軟的多媒體接口方案的軟體開發工具包,其中最重要的部分便是圖形渲染接口,DirectXSDK工具包提供了數學庫XNAMath,數學庫XNAMath對3D圖形的算法作了很多效率優化。例如,XNAMath實現了SSE指令優化的三角函數算法,該算法利用正弦和餘弦的冪級數展開式,展開到12項來近似計算三角函數的值。其中,正弦函數的計算公式如下sin(V)=V-V"3/3!+V"5/5!-V"7/7!+V"9/9!-V"ll/ll!+V"13/13!-V'15/15!+V"17/17!-V"19/19!+V"21/21!-V"23/23!,餘弦函數的計算公式如下cos(V)=l-V"2/2!+V"4/4!-V"6/6!+V"8/8!-V"10/10!+V"12/12!-V"14/14!+V"16/16!-V"18/18!+V"20/20!-V"22/22!。而其他三角函數可通過正弦函數和餘弦函數的計算轉換而得到,例如正切函數等於正弦函數值除以餘弦函數值,餘切函數等於餘弦函數值除以正弦函數值。可見,現有技術中主要通過12項的冪級數展開式實現三角函數的計算,由於冪級數展開式的項數過多,因此運算效率比較低。
發明內容有鑑於此,本發明提供一種3D圖形渲染中的三角函數計算方法,能夠提高3D圖形渲染中的三角函數運算效率。為解決上述技術問題,本發明的技術方案是這樣實現的一種3D圖形渲染中的三角函數計算方法,該方法包括根據弧度r計算與r對應的臨時數據m=押256/(2*π),然後對臨時數據m取整數部分作為與r對應的序號n,根據序號η計算與r對應的大角t=η*2*π/256,並計算與r對應的小角k=r-t;預先建立每一序號與該序號所對應的大角的正弦函數值的一一對應關係,以及每一序號與該序號所對應的大角的餘弦函數值的一一對應關係,根據所述對應關係、以及大角t所對應的序號η查找大角t的正弦函數值sin(t)和餘弦函數值COs(t);計算小角k的正弦函數值sin(k)和餘弦函數值cos(k),其中,cos(k)=1-0.5*k*k,sin(k)=k-(l/6.0)*k*k*k;計算弧度r的正弦函數值sin(r)和餘弦函數值cos(r),其中,sin(r)=sin(t+k)=sin(t)*cos(k)+cos(t)*sin(k),cos(r)=cos(t+k)=cos(t)*cos(k)-sin(t)*sin(k)。所述建立每一序號與該序號所對應的大角的正弦函數值的一一對應關係的方法為建立序號0和sin(0*2*π/256)的對應關係、序號1和sin(1*2*π/256)的對應關係、序號2和sin(2*2*π/256)的對應關係、...以及序號255和sin(255*2*π/256)的對應關係。所述建立每一序號與該序號所對應的大角的餘弦函數值的一一對應關係的方法為建立序號0和cos(0*2*π/256)的對應關係、序號1和cos(1*2*π/256)的對應關係、序號2和cos(2*2*π/256)的對應關係、.··以及序號255和cos(255*2*π/256)的對應關係。該方法進一步包括根據所計算的正弦函數值sin(r)和餘弦函數值cos(r)計算正切函數值tg(r)=sin(r)/cos(r)。該方法進一步包括根據所計算的正弦函數值sin(r)和餘弦函數值Cos(r)計算餘切函數值ctg(r)=cos(r)/sin(r)。根據本發明所提供的技術方案,將弧度r分解為大角t和小角k,根據預先建立的每一序號與該序號所對應的大角的正弦函數值的一一對應關係,以及每一序號與該序號所對應的大角的餘弦函數值的一一對應關係查找大角t的正弦函數值sin(t)和餘弦函數值cos(t),再利用兩項的冪級數展開式計算小角k的正弦函數值sin(k)和餘弦函數值cos(k),最後根據三角函數和差公式計算弧度r的正弦函數值sin(r)和餘弦函數值cos(r)。可見,本發明採用查表法計算大角t的正弦函數值sin(t)和餘弦函數值cos(t),採用冪級數法計算小角k的正弦函數值sin(k)和餘弦函數值cos(k),從而最終得到弧度r的正弦函數值sin(r)和餘弦函數值cos(r),計算方法簡單,避免了採用現有技術中項數過多的冪級數展開式,能夠提高3D圖形渲染中的三角函數運算效率。圖1為本發明所提供的一種3D圖形渲染中的三角函數計算方法的流程圖。具體實施方式為使本發明的目的、技術方案及優點更加清楚明白,以下參照附圖並舉實施例,對本發明所述方案作進一步地詳細說明。本發明的核心思想為將弧度r分解為大角t和小角k,根據預先建立的每一序號與該序號所對應的大角的正弦函數值的一一對應關係,以及每一序號與該序號所對應的大角的餘弦函數值的一一對應關係查找大角t的正弦函數值sin(t)和餘弦函數值cos(t),再利用兩項的冪級數展開式計算小角k的正弦函數值sin(k)和餘弦函數值cos(k),最後根據三角函數和差公式計算弧度r的正弦函數值sin(r)和餘弦函數值cos(r)。圖1為本發明所提供的一種3D圖形渲染中的三角函數計算方法的流程圖。如圖1所示,該方法包括以下步驟步驟101,根據弧度r計算與r對應的臨時數據m=r*256/(2*π),然後對臨時數據m取整數部分作為與r對應的序號n,根據序號η計算與r對應的大角t=η*2*π/256,並計算與r對應的小角k=r-t。在本步驟中,r、t、k的單位都為弧度。對本步驟的方法舉例說明假設弧度r等於π/2,則m=r*256/(2*π)=64,對m取整數部分得到η為64,則得到大角t=η*2*π/256=π/2,則得到小角k=r_t=0。需要說明的是,當m沒有整數部分,則視為整數部分為0,類似地,當m沒有小數部分,則視為小數部分為0。步驟102,預先建立每一序號與該序號所對應的大角的正弦函數值的一一對應關係,以及每一序號與該序號所對應的大角的餘弦函數值的一一對應關係,根據所述對應關係、以及大角t所對應的序號η查找大角t的正弦函數值sin(t)和餘弦函數值COs(t)。由於弧度r的值大於等於0且小於2π(弧度0與弧度2π視為相等,則弧度的最大值必定小於2π),則臨時數據的值小於256,臨時數據所取的整數部分得到的序號的最大值為255,因此,序號的可能取值為0、1、2···255。當序號為0時,與該序號對應的大角的正弦函數值為sin(0*2*π/256),當序號為1時,對該序號對應的大角的正弦函數值sin(1*2*π/256),當序號為2時,對該序號對應的大角的正弦函數值sin(2*2*π/256),...,當序號為255時,對該序號對應的大角的正弦函sin(255*2*π/256)ο基於上述分析,可知建立每一序號與該序號所對應的大角的正弦函數值的一一對應關係的方法如下建立序號0和sin(0*2*π/256)的對應關係、序號1和sin(1*2*π/256)的對應關係、序號2和sin(2*2*π/256)的對應關係、...以及序號255和sin(255*2*π/256)的對應關係。類似地,當序號為0時,與該序號對應的大角的正弦函數值為cos(0*2*π/256),當序號為1時,對該序號對應的大角的正弦函數值cos(1*2*π/256),當序號為2時,對該序號對應的大角的正弦函數值cos(2*2*π/256),...,當序號為255時,對該序號對應的大角的正弦函數值cos(255*2*π/256)。基於上述分析,可知建立每一序號與該序號所對應的大角的餘弦函數值的一一對應關係的方法如下建立序號0和cos(0*2*π/256)的對應關係、序號1和cos(1*2*π/256)的對應關係、序號2和cos(2*2*π/256)的對應關係、.··以及序號255和cos(255*2*π/256)的對應關係。另外,也可根據同一弧度的正弦函數值的平方與餘弦函數值的平方和等於1,或者當弧度a小於π/2時,弧度a的正弦函數值等於π/2與a的差的餘弦函數值,以及現有技術中正弦和餘弦函數的其他互相轉換的法則,對所建立的每一序號與該序號所對應的大角的正弦函數值的一一對應關係進行轉換,從而得到每一序號與該序號所對應的大角的餘弦函數值的一一對應關係。對查找的方法舉例說明假設步驟101所計算的η為64、且大角t=η*2*π/256=n/2,則在所述對應關係中查找與序號64對應的大角η/2的正弦函數值為sin(64*2*π/256),以及與序號64對應的大角π/2的餘弦函數值為cos(64*2*π/256)。步驟103,計算小角k的正弦函數值sin(k)和餘弦函數值cos(k),其中,cos(k)=1-0.5*k*k,sin(k)=k-(l/6.0)*k*k*k。上述正弦函數值sin(k)和餘弦函數值cos(k)是根據現有技術中的冪級數展開式而得到的,因為k<(2*π/256),因此只要展開兩項就可以達到單精度的需求。需要說明的是,上述步驟102和103的執行先後順序沒有特別的限定,可先執行步驟102,後執行步驟103,也可先執行步驟103,後執行步驟102,也可並行執行步驟102和步驟103。步驟104,計算弧度r的正弦函數值sin(r)和餘弦函數值cos(r),其中,sin(r)=sin(t+k)=sin(t)*cos(k)+cos(t)*sin(k),cos(r)=cos(t+k)=cos(t)*cos(k)-sin(t)*sin(k)。上述計算的依據為現有技術中的三角函數和差公式。進一步地,還可依據所計算的正弦函數值sin(r)和餘弦函數值cos(r)計算正切函數值tg(r)=sin(r)/cos(r)、餘切函數值ctg(r)=cos(r)/sin(r)。至此,本流程結束。下面通過幾個實施例對上述方法舉例說明。例如,下述代碼用於建立每一序號與該序號所對應的大角的正弦函數值的一一對應關係enum{c_sincos_shift=8,c—sincos_size=1c_sincos_shift,};floats_sincos_m=float((c_sincos—size/2)/M—PI);floats_sincos_r=float(M_PI/(c_sincos_size/2));floats_sincos[c_sincos_size];const—ml28sone={l.Of,l.Of,l.Of,l.Of};const_m128s—half={0.5f,0.5f,0.5f,0.5f};6voidtable一init{for(inti=0;i<c_sincos_size;++i){s_sincos[i]=(float)sin(i*2.0*MPI/c_sincos_size);再例如,下述代碼採用C++實現了如下步驟第一,根據對應關係、以及大角t所對應的序號η查找大角t的正弦函數值sin(t)和餘弦函數值cos(t),第二,計算小角k的正弦函數值sin(k)和餘弦函數值cos(k),第三,計算弧度r的正弦函數值sin(r)和餘弦函數值cos(r)。其中,下述代碼中的a相當於cos(k),b相當於sin(k),χ相當於sin(t),y相當於cos(t),s相當於sin(r),c相當於cos(r)voidcpp_sincos(floatr,float&s,float&c){floatt—.r*s_sincos_m;inti=int(t);floatk=(t-i)*s_sincos_r;floatb=k-(l/6.0f)*k*k*k;floata=I-OJPk*^floatχ=s_sincos[i&(c_sincos_size-l)];floaty=s_sincos[(i+c_sincos_size/4)&(c一sincos—size-1)];s=x*a+y*b;c=y*a-x*b;}再例如,下述代碼採用SSE指令實現了和上述代碼相同的功能,只不過下述代碼的運行速度更加快捷voidxmm—sincos(floatr,float&s,float&c){一ml28t=_mm_mul_ss(_mm_set_ss(r),_mm_set_ss(s_sincos_m));inti二_mm_cvt_ss2si(t);—ml28k;k=_mm_mul_ss(_mm_sub_ss(t,—mm—cvt—si2ss(k,i)),_mm_set_ss(s_sincos_r));—ml28k2=_mm_mul_ss(k,k);—ml28b=—mm—sub—ss(k,_mm_mul_ss(_mm_mul_ss(k,_mm_set_ss(1.0f/6.0f)),k2));—ml28a=_mm—sub—ss(s—one,—mm—mul_ss(k2,s_hali));—ml28χ二—mm—load—ss(s_sincos+(i&(c—sincos_size-l)));—ml28y=—mm—load—ss(s—sincos+((i+c_sincos—size/4)&(c—sincos—size-1)));_mm_store—ss(&s,_mm_add_ss(_mm_mul_ss(x,a),_mm_mul_ss(y,b)));—mm—store—ss(&c,_mm_sub_ss(_mm_mul—ss(y,a),_mm_mul_ss(x,b)));}在實際的3D圖形渲染中,本發明所提供的三角函數計算方法具備廣泛的應用場旦ο例如,在現有技術中,Billboard技術能夠使得在3D場景中始終朝向鏡頭繪製圖形。結合本發明,步驟如下首先,根據Billboard貼片相對於變換後的坐標軸的偏轉角度,計算偏轉角度的三角函數值,具體計算三角函數值的方法可參考上述步驟101和104以及實施例,根據所計算的三角函數值確定Billboard貼片的朝向,其次,根據所確定的朝向,計算Billboard貼片四個頂點的坐標,並且投放到渲染模塊進行渲染。再例如,本發明在隨機生成對象中也具有廣泛的應用,例如,粒子發射器、場景中的草體等。以粒子發射器為例結合本發明,步驟如下首先,根據觸發條件生成被發射的子物件,然後隨機獲得子物件的初始角度,並計算初始角度的三角函數值,以確定初始發射方向,具體計算三角函數值的方法可參考上述步驟101和104以及實施例,最後根據所確定的初始發射方向定時計算子物件位置並且渲feο總之,本發明所提供的三角函數計算方法在3D圖形渲染中能夠具有廣泛的應用場景,凡是涉及三角函數計算的步驟均可採用本發明的方法,上述實施例以及應用場景的描述並非用於限定本發明,僅為舉例說明。綜上,在本發明中,將弧度r分解為大角t和小角k,根據預先建立的每一序號與該序號所對應的大角的正弦函數值的一一對應關係,以及每一序號與該序號所對應的大角的餘弦函數值的一一對應關係查找大角t的正弦函數值sin(t)和餘弦函數值cos(t),再利用兩項的冪級數展開式計算小角k的正弦函數值sin(k)和餘弦函數值cos(k),最後根據三角函數和差公式計算弧度r的正弦函數值sin(r)和餘弦函數值cos(r)。可見,本發明採用查表法計算大角t的正弦函數值sin(t)和餘弦函數值cos(t),採用冪級數法計算小角k的正弦函數值sin(k)和餘弦函數值cos(k),從而最終得到弧度r的正弦函數值sin(r)和餘弦函數值cos(r),計算方法簡單,避免了採用現有技術中項數過多的冪級數展開式,能夠提高3D圖形渲染中的三角函數運算效率。採用本發明的方案,與C函數相比,運算效率提升為原來的4倍,與XNAMath相比,運算效率提升為2.4倍。而且,本發明的運算精度接近7位有效數字,比XNAMath的6位有效數字也有提升。以上所述,僅為本發明的較佳實施例而已,並非用於限定本發明的保護範圍。凡在本發明的精神和原則之內,所作的任何修改、等同替換、改進等,均應包含在本發明的保護範圍之內。權利要求1.一種3D圖形渲染中的三角函數計算方法,其特徵在於,該方法包括根據弧度r計算與r對應的臨時數據m=押256/(2*π),然後對臨時數據m取整數部分作為與r對應的序號n,根據序號η計算與r對應的大角t=η*2*π/256,並計算與r對應的小角k=r-t;預先建立每一序號與該序號所對應的大角的正弦函數值的一一對應關係,以及每一序號與該序號所對應的大角的餘弦函數值的一一對應關係,根據所述對應關係、以及大角t所對應的序號η查找大角t的正弦函數值sin(t)和餘弦函數值COs(t);計算小角k的正弦函數值sin(k)和餘弦函數值cos(k),其中,cos(k)=1-0.5*k*k,sin(k)=k-(l/6.0)*k*k*k;計算弧度r的正弦函數值sin(r)和餘弦函數值cos(r),其中,sin(r)=sin(t+k)=sin(t)*cos(k)+cos(t)*sin(k),cos(r)=cos(t+k)=cos(t)*cos(k)-sin(t)*sin(k)。2.根據權利要求1所述的方法,其特徵在於,所述建立每一序號與該序號所對應的大角的正弦函數值的一一對應關係的方法為建立序號0和sin(0*2*π/256)的對應關係、序號1和sin(1*2*π/256)的對應關係、序號2和sin0*2*π/256)的對應關係、...以及序號255和sin055*2*π/256)的對應關係。3.根據權利要求2所述的方法,其特徵在於,所述建立每一序號與該序號所對應的大角的餘弦函數值的一一對應關係的方法為建立序號O和cos(0*2*π/256)的對應關係、序號1和cos(1*2*π/256)的對應關係、序號2和cos(2*2*π/256)的對應關係、...以及序號255和cos(255*2*π/256)的對應關係。4.根據權利要求1所述的方法,其特徵在於,該方法進一步包括根據所計算的正弦函數值sin(r)和餘弦函數值cos(r)計算正切函數值tg(r)=sin(r)/cos(r)。5.根據權利要求4所述的方法,其特徵在於,該方法進一步包括根據所計算的正弦函數值sin(r)和餘弦函數值cos(r)計算餘切函數值ctg(r)=cos(r)/sin(r)。全文摘要本發明公開了一種3D圖形渲染中的三角函數計算方法,將弧度r分解為大角t和小角k,根據預先建立的每一序號與該序號所對應的大角的正弦函數值的一一對應關係,以及每一序號與該序號所對應的大角的餘弦函數值的一一對應關係查找大角t的正弦函數值sin(t)和餘弦函數值cos(t),再利用兩項的冪級數展開式計算小角k的正弦函數值sin(k)和餘弦函數值cos(k),最後根據三角函數和差公式計算弧度r的正弦函數值sin(r)和餘弦函數值cos(r)。採用本發明公開的方法能夠提高3D圖形渲染中的三角函數運算效率。文檔編號G06T15/00GK102034260SQ201010621848公開日2011年4月27日申請日期2010年12月27日優先權日2010年12月27日發明者蔣黎申請人:北京像素軟體科技股份有限公司