TangentSpace的基向量計(jì)算方法資料_第1頁(yè)
TangentSpace的基向量計(jì)算方法資料_第2頁(yè)
TangentSpace的基向量計(jì)算方法資料_第3頁(yè)
TangentSpace的基向量計(jì)算方法資料_第4頁(yè)
TangentSpace的基向量計(jì)算方法資料_第5頁(yè)
已閱讀5頁(yè),還剩33頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Good is good, but better carries it.精益求精,善益求善。TangentSpace的基向量計(jì)算方法-HYPERLINK/uid-26651460-id-3061845.html不同基下的坐標(biāo)變換在3D中流水線中,在幾何部分,主要就是從不同坐標(biāo)系之間坐標(biāo)變換,這里主要介紹坐標(biāo)變換的理論。記,是兩個(gè)不同坐標(biāo)系的基向量,他們之間的過(guò)渡矩陣為T(mén)。即:*T=設(shè)點(diǎn)P在坐標(biāo)系中的坐標(biāo)為(x1,y1,z1),在中的坐標(biāo)為(x2,y2,z2)。則有:*(x1,y1,z1)=*(x2,y2,z2)(注:(x1,y1,z1)代表轉(zhuǎn)置)-*(x1,y1,z1)=*T*(x2,y2,z

2、2)(這里的必然是可逆的矩陣)-(x1,y1,z1)=T*(x2,y2,z2)(這里的T也必然是可逆矩陣)-Inv(T)*(x1,y1,z1)=(x2,y2,z2)(Inv(T)代表T的逆矩陣)上面的過(guò)程采用的是右手系,所以如果兩個(gè)坐標(biāo)系的過(guò)渡矩陣為T(mén)那么他們的坐標(biāo)相差的就是Inv(T)。而在DX中采用的是左手系,左手系和右手系就相差一個(gè)轉(zhuǎn)置,所以上面的過(guò)程為:T*=-(x1,y1,z1)*Inv(T)=(x2,y2,z2)在DX中,從ObjectSpace-WorldSpace-ViewSpace-ClipSpace,使用的D3DXMatrixXXX得到的Matrix都是Inv(T)這個(gè)矩陣

3、,注意不是兩個(gè)坐標(biāo)系的過(guò)渡矩陣。在進(jìn)行兩個(gè)坐標(biāo)系之間的坐標(biāo)變換的時(shí)候,只要找到那個(gè)過(guò)渡矩陣T就可以解決了。而求T主要就用*T=這個(gè)公式。而通常在3D中兩個(gè)坐標(biāo)系的基向量都是標(biāo)準(zhǔn)正交基,所以他們相差的就是一個(gè)平移和旋轉(zhuǎn),注意是先平移,再旋轉(zhuǎn)。平移:將前一個(gè)坐標(biāo)系的坐標(biāo)原點(diǎn)移動(dòng)到另一個(gè)坐標(biāo)系的原點(diǎn)旋轉(zhuǎn):當(dāng)兩個(gè)坐標(biāo)系的原點(diǎn)對(duì)齊后,旋轉(zhuǎn)移動(dòng)過(guò)來(lái)的坐標(biāo)系,使他們的x,y,z軸對(duì)齊所以:在右手系情況下是右乘基向量,T=平移M*旋轉(zhuǎn)M在左手系情況下是左乘基向量,T=旋轉(zhuǎn)M*平移M如果是單位基向量,即E矩陣。那么T=,而如果是標(biāo)準(zhǔn)正交基,則InvT=T。這里舉一個(gè)從WorldSpace到ViewSpace的變

4、換過(guò)程(采用左手系)WorldSpace中的基向量為E。EyePosition為(1,2,3)Up向量為(1,0,0)Right向量為(0,0,1)Look向量為(0,1,0)則有|1,0,0|0,0,1|Trotate*(a1,a2,a3)=Trotate*|0,1,0|=|1,0,0|0,0,1|0,1,0|在上面這個(gè)等式中是不能包含平移矩陣的,因?yàn)橄蛄恐g是沒(méi)有位置關(guān)系的,只有方向。而平移矩陣=|1,0,0,0|0,1,0,0|0,0,1,0|1,2,3,1|在3D中平移矩陣要在第四維來(lái)體現(xiàn),所以這里的是4x4的矩陣。T=旋轉(zhuǎn)矩陣*平移矩陣=|0,0,1,0|1,0,0,0|1,0,0,

5、0|*|0,1,0,0|0,1,0,0|0,0,1,0|0,0,0,1|1,2,3,1|Trotate是標(biāo)準(zhǔn)正交矩陣,所以Inv(Trotate)=Trotate而平移矩陣他的逆矩陣是在原來(lái)的方向反著平移的矩陣,所以就是Inv(平移矩陣)=|1,0,0,0|0,1,0,0|0,0,1,0|-1,-2,-3,1|而Inv(T)=Inv(旋轉(zhuǎn)矩陣*平移矩陣)=Inv(平移矩陣)*Inv(旋轉(zhuǎn)矩陣)=|0,1,0,0|0,0,1,0|1,0,0,0|-3,-1,-2,1|驗(yàn)證:WorldSpace*Inv(T)ViewSpace(1,2,3,1)(0,0,0,1)(1,3,4,1)(1,0,1,1)

6、HYPERLINK/uid-26651460-id-3127663.html不同基下的坐標(biāo)變換-續(xù)在前面的不同基下的坐標(biāo)變換對(duì)于不同坐標(biāo)系的變換不是一般的描述形式,在這里更進(jìn)一步考慮了坐標(biāo)系之間的關(guān)系,和描述形式。一個(gè)坐標(biāo)空間并不是只有基向量來(lái)刻畫(huà),還需要一個(gè)基點(diǎn)來(lái)描述這個(gè)坐標(biāo)空間的位置。也就是,(x0,y0,z0),這里為基向量,(x0,y0,z0)為基點(diǎn)。在一個(gè)空間里面,定義一個(gè)最基本的坐標(biāo)系。然后在這個(gè)空間里面定義兩個(gè)不同的坐標(biāo)系:如圖所示:在上面的圖中:BaseCoordinate為定義這個(gè)空間的基本坐標(biāo)系,Coordinate0和Coordinate1為衍生出的兩個(gè)坐標(biāo)系。對(duì)于基向量

7、:*T=這里T為基向量間的變換矩陣對(duì)于基點(diǎn)p0+Offset=p1現(xiàn)在在這個(gè)空間中取定一點(diǎn)p他在Coordinate0中的坐標(biāo)為(x0,y0,z0)他在Coordinate1中的坐標(biāo)為(x1,y1,z1)那么從上面的圖中可以得到關(guān)系式*x0+p0=*x1+p1y0y1z0z1這里面:*x0表示當(dāng)Coordinate0和BaseCoordinate基點(diǎn)重合的時(shí)候,在Coordinate0中p點(diǎn)在BaseCoordinatey0z0中的坐標(biāo),所以加上偏移過(guò)后就是在Coordinate0中點(diǎn)p在BaseCoordinate中的坐標(biāo)形式。這里記在Coordinate0中坐標(biāo)為C0,在Coordinat

8、e1中坐標(biāo)為C1,p0-p1=(px,py,pz)=Poff*C0+Poff=*C1而對(duì)于Poff相當(dāng)于對(duì)*C0的一個(gè)Translation變換,那么可以寫(xiě)成矩陣形式記|,0|=A0|,0|=A1,|0,0,0,1|0,0,0,1|TranslationMatrix=Tr=|1,0,0,px|0,1,0,py|0,0,1,pz|0,0,0,1|則有Tr*A0*C0=A0*T*C1Inv(A0)*Tr*A0*C0=T*C1|Inv(),0|*|,Poff|*C0=T*C1|0,0,0,1|0,0,0,1|而:|Inv(),0|*|,Poff|=|E3x3,Inv()*Poff|0,0,0,1|0

9、,0,0,1|0,0,0,1|最后得到Inv(T)*|E3x3,Inv()*Poff|*C0=C1|0,0,0,1|這和在沒(méi)有偏移的情況下多了中間這個(gè)矩陣,中間這個(gè)矩陣就是偏移矩陣。這里也說(shuō)明了在不同坐標(biāo)系情況下是先考慮1:偏移(將兩個(gè)基向量放到同一個(gè)基點(diǎn)考慮)2:再是基向量的變換矩陣對(duì)于|E3x3,Inv()*Poff|矩陣的說(shuō)明:|0,0,0,1|Inv()*Poff實(shí)際上是將BaseCoordinate中的Poff轉(zhuǎn)換得到在Coordinate0中的表達(dá)形式,因?yàn)镃0是在Coordinate0中的坐標(biāo),而偏移向量p0-p1是在BaseCoordinate中,所以先將p0-p1變換到Coo

10、rdinate0中,這樣C0就完成了偏移動(dòng)作。Inv(T)*|E3x3,Inv()*Poff|*C0=C1這個(gè)等式是一般情況下的表達(dá)式,通常情況下|0,0,0,1|Coordinate0就是BaseCoordinate,這樣Inv()是E,所以就直接在C0上施加p0-p1。補(bǔ)充:考慮向量的情況|E3x3,Inv()*Poff|*C0=T*C1|0,0,0,1|對(duì)于這個(gè)表達(dá)式,如果C0和C1是向量,即第四維為0,則|E3x3,Inv()*Poff|該矩陣不起作|0,0,0,1|用,則表達(dá)式退化為:C0=T*C1這也就是說(shuō)前面的p0和p1沒(méi)有作用,這個(gè)時(shí)候兩個(gè)坐標(biāo)系是同基點(diǎn)的。在考慮向量的情況下的

11、模型:這個(gè)時(shí)候任意的坐標(biāo)系都是同基點(diǎn)的。因?yàn)槭峭c(diǎn),那么這里面的不同基中的向量是同構(gòu)的。HYPERLINK/uid-26651460-id-3083223.htmlTangentSpace的基向量計(jì)算方法在CG中,基于Per-Pixel的算法經(jīng)常會(huì)涉及到TangentSpace的坐標(biāo)變換,比如BumpMapping,需要將ObjectSpace的LightVector轉(zhuǎn)換到TangentSpace,然后在和該P(yáng)ixel上的NormalVector進(jìn)行計(jì)算,因?yàn)镹ormalVector是在TangentSpace中的。像上面的BumpMapping,對(duì)于NormalTexture,如果Norm

12、alVector(這里的NormalVector不是指Vertex上的)是設(shè)計(jì)在Mesh的ObjectSpace中的話,一方面,Mesh的復(fù)雜度導(dǎo)致NormalVector不方便設(shè)計(jì);另外,如果Mesh的形狀發(fā)生改變,那么原來(lái)的NormalVector將不能夠適用。所以,將NormalVector的設(shè)計(jì)就放在統(tǒng)一的一個(gè)空間里面(TangentSpace)中,然后通過(guò)一個(gè)TriangleSurface上的幾何信息,進(jìn)行幾何變化,最后在同一個(gè)坐標(biāo)空間來(lái)使用。對(duì)于一個(gè)NormalTexture的圖示,他里面所有像素上的NormalVector都在u,v,n坐標(biāo)系上的,這也就是TangentSpace

13、:當(dāng)將一個(gè)NormalTexture貼到Mesh上后,單考慮一個(gè)Vertex,他對(duì)應(yīng)于NormalTexture上的一個(gè)點(diǎn)(具體在哪由這個(gè)Vertex的TextureAddressu-v指定),而他的法向量就對(duì)應(yīng)了TangentSpace中的n,經(jīng)過(guò)該Vertex,垂直于n可以構(gòu)造出TangentSpace中的u-v平面,這實(shí)際上也就在ObjectSpace中構(gòu)造出了TangentSpace。如圖所示,V1為該頂點(diǎn),淡藍(lán)色矩形框平面為對(duì)應(yīng)的u-v平面:在ObjectSpace和TangentSpace兩個(gè)坐標(biāo)系下進(jìn)行坐標(biāo)變換必須找到這兩個(gè)坐標(biāo)系之間的過(guò)渡矩陣。根據(jù)變換等式*T=:為Object

14、Space中的基向量,實(shí)際上就是一個(gè)單位矩陣T:過(guò)渡矩陣:為T(mén)angentSpace的基向量可見(jiàn)T=構(gòu)成的矩陣,所以這里要求的就是這三個(gè)基向量zt這里就是這個(gè)Vertex上的n。xt,yt分別對(duì)應(yīng)于u,v兩個(gè)基向量,這是后面要求的兩個(gè)向量。根據(jù)一個(gè)Triangle上面的貼圖,可以構(gòu)建這個(gè)模型:記:Vertex1:V1(x1,y1,z1),T1(u1,v1),N1(nx1,ny1,nz1)Vertex2:V2(x2,y2,z2),T2(u2,v2),N2(nx2,ny2,nz2)Vertex3:V3(x3,y3,z3),T3(u3,v3),N3(nx3,ny3,nz3)記:T21=T2-T1=(

15、u21,v21)T31=T3-T1=(u31,v31)V21=V2-V1V31=V3-V1則有V21_=V21-V21*N1*N1V21*N1*N1是V21在u-v平面上的投影向量(這里應(yīng)該是(V21N1)*N1是v21在法線上得投影向量)V31_=V31-V31*N1*N1V21_和V31_分別為V21和V31在u-v平面上的投影向量在圖中的v21=Len(V21)*Nor(V21_)v31=Len(V31)*Nor(V31_)Len()為計(jì)算對(duì)應(yīng)向量的長(zhǎng)度,Nor()為單位化對(duì)應(yīng)向量,v21和v31分別為將V21和V31拉到u-v平面上去的向量。根據(jù)在tangentspace和Object

16、Space兩個(gè)空間是同構(gòu)的,可以列出下面的等式:u*u21+v*v21=v21u*u31+v*v31=v31解該方程,得到u,v,并單位化兩個(gè)向量通過(guò)上面的過(guò)程也就得到了-過(guò)渡矩陣T。得到過(guò)渡矩陣T后,就可以任意的轉(zhuǎn)化兩個(gè)坐標(biāo)系中的坐標(biāo)。其他:1:并不一定是標(biāo)準(zhǔn)正交基,所以T的轉(zhuǎn)置矩陣并不一定等于T的逆矩陣。u,v的關(guān)系如何這要取決于上面的三個(gè)頂點(diǎn)的T1,T2,T3。2:上面的計(jì)算過(guò)程是基于Vertex的,可以采用基于一個(gè)Triangle的計(jì)算方法,過(guò)程和上面是一致的,不同點(diǎn)在于這個(gè)時(shí)候u,v平面和Triangle平面重合。3:在DirectX中有D3DXComputeTangentAPI對(duì)計(jì)

17、算這三個(gè)基向量的支持。但是在他的描述中使用的是TangentVector(也就是u),BinormalVector(也就是v)和NormalVector(也就是n),且B=NCrossTHYPERLINK/uid-26651460-id-3150789.htmlPipeline-GeometryTransformation本文主要描述在3D中,將一個(gè)點(diǎn)坐標(biāo)變換到屏幕坐標(biāo)的變換過(guò)程。首先對(duì)于這個(gè)過(guò)程為:ObjectSpace-WorldSpace-ViewSpace-ClipSpace-ScreenSpace.1:世界變換(WorldTransformation)對(duì)于一個(gè)模型,他自身的建模是根據(jù)

18、自己的一個(gè)坐標(biāo)系(ObjectSpace)來(lái)建立的,但是對(duì)于一個(gè)場(chǎng)景,整個(gè)場(chǎng)景是在統(tǒng)一的一個(gè)坐標(biāo)系(WorldSpace)之下建立的,那么模型從ObjectSpace到WorldSpace,通常需要縮放(Scaling),旋轉(zhuǎn)(Rotation),平移(Translation),最后到達(dá)WorldSpace。所以這個(gè)過(guò)程的變換矩陣通常是縮放矩陣,旋轉(zhuǎn)矩陣和平移矩陣的結(jié)合。注意:他們之間的順序代表了先經(jīng)過(guò)什么變換再經(jīng)過(guò)什么變換。2:視圖變換(ViewTransformation)在Pipeline中,ViewTransformation完成的工作是將WorldSpace變換到ViewSpace中

19、去,在ViewSpace中,EyePosition為該坐標(biāo)系的原點(diǎn),(LeftVec,UpVec,ViewVec)構(gòu)成了ViewSpace中對(duì)應(yīng)的(X,Y,Z)基向量。從WorldSpace到ViewSpace的過(guò)程:1:平移,將WorldSpace中的坐標(biāo)原地移到ViewSpace中的坐標(biāo)原點(diǎn)2:旋轉(zhuǎn),將WorldSpace中的(X,Y,Z)旋轉(zhuǎn)和ViewSpace中的(X,Y,Z)對(duì)齊所以這個(gè)過(guò)程的矩陣為:V=|1000|*|LeftVec.xUpVec.xViewVec.x0|0100|LeftVec.yUpVec.yViewVec.y0|0010|LeftVec.zUpVec.zVie

20、wVec.z0|-Ex-Ey-Ez1|0001|詳細(xì)過(guò)程可參見(jiàn)前面的不同坐標(biāo)系下的坐標(biāo)變換。圖示:3:投影變換(ProjectionTransformation)對(duì)于一個(gè)Camera而言,指定他的可視張角(在水平和垂直兩個(gè)方向的張角),那它看出去會(huì)形成一個(gè)金字塔形的視域,如果定義這個(gè)Camera的可見(jiàn)近平面(NearPlane)和遠(yuǎn)平面(FarPlane),這個(gè)視域就會(huì)構(gòu)成一個(gè)視見(jiàn)體(ViewFrustum)。如圖所示:而ProjectionTransformation的目的就是要將這個(gè)ViewFrustum變成一個(gè)方體形。對(duì)于討論X的過(guò)程圖示:在這個(gè)圖中:對(duì)于一點(diǎn)(x,y,z),需要求出在N

21、earPlane上EyeRay的交點(diǎn),注意:這里NearPlane實(shí)際上在最后就是要渲染的Screen。得到xn=x*N/z同理對(duì)于ynyn=y*N/z而圖中得到的一個(gè)方形,他的邊長(zhǎng)為2*Wn,需要將它變?yōu)?*1(即對(duì)于xn的范圍-1,1)的方形所以xc=xn/Wn=x/(z*tan(Ha/2)yc=yn/Hn=y/(z*tan(Va/2)對(duì)于zc,他代表了最后這個(gè)點(diǎn)的深度值,范圍為0,1,這個(gè)范圍的邊界分別代表了NearPlane和FarPlane。一種:zc=(z-N)/(F-N),但是這種方法不便于后面矩陣的表示所以:zc=F*(z-N)/(z*(F-N)即zc=(z-N)/(F-N)/

22、(z/F),可以證明z在N,F的范圍總是有(z-N)/(F-N)=z/F,在z=F時(shí)取等最后得到在ClipSpace中的坐標(biāo)形式xc=x/(z*tan(Ha/2)yc=y/(z*tan(Va/2)zc=F*(z-N)/(z*(F-N)=z*F/(z*(F-N)-F*N/(z*(F-N)w=1(w為后面統(tǒng)一化(HomogeneousNormalization)需要用到的一維,也就是x,y,z都除以w)將上面的變化一下xc=x*cot(Ha/2)yc=y*cot(Va/2)zc=z*F/(F-N)-F*N/(F-N)w=z所以現(xiàn)在構(gòu)造的矩陣P要滿足(x,y,z,1)*P=(xc,yc,zc,w)這

23、里(x,y,z,1)為在ViewSpace中的坐標(biāo)從上面的最后的結(jié)果可以得到PP=|cot(Ha/2)000|0cot(Va/2)00|00F/(F-N)1|00-F*N/(F-N)0|這就是最后需要投影變換的投影矩陣。對(duì)于最后得到的ClipSpace的坐標(biāo):處于Viewfrustum中的點(diǎn)一定滿足:-w=xc=w-w=yc=w0=zc=w當(dāng)經(jīng)過(guò)HomogeneousNormalization過(guò)后xc/w和yc/w分別處于-1,1的范圍。HomogeneousNormalization部分在Hardware中完成。4:視點(diǎn)變換(ViewpointTransformation)在Projecti

24、onTransformation過(guò)后(并經(jīng)過(guò)了HomogeneousNormalization)得到了ClipSpace中的坐標(biāo)(xc,yc,zc,1),這里面-1=xc=1,-1=yc=1,0=zc(0,0)-(W,0)|(-1,-1)-(1,-1)(0,H)-(W,H)W:WidthofthescreenH:Heightofthescreen直接根據(jù)上面的圖實(shí)際上就是x*0.5*W+0.5*W,y*(-0.5)*H+0.5*H即得到矩陣|0.5*W000|0-0.5*H00|0010|0.5*W0.5*H01|為了表示像素點(diǎn)的中間,則上面的結(jié)果x,y分別再加一個(gè)0.5/W,0.5/H最后得

25、到視點(diǎn)變換矩陣|0.5*W000|0-0.5*H00|0010|0.5*W+0.5/W0.5*H+0.5/H01|經(jīng)過(guò)上面的過(guò)程,則整個(gè)的幾何變換矩陣記為GG=W*V*P*VpG:GeometryMatrixW:WorldMatrixP:ProjectionMatrixVp:ViewpointMatrix注:本文采用的點(diǎn)與矩陣乘法形式為Vector*MatrixHYPERLINK/uid-26651460-id-3214495.htmlTriangletoTriangleIntersectionTestAlgorithm本文主要描述了一個(gè)三角形與三角形相交的一個(gè)測(cè)試算法,該算法主要利用前面計(jì)算

26、的結(jié)果來(lái)減少計(jì)算的消耗。這個(gè)相交測(cè)試算法的主要過(guò)程1:判斷一個(gè)三角形是否與另一個(gè)三角形所在的平面有交點(diǎn),如果沒(méi)有交點(diǎn)停止算法。返回為假2:判斷交點(diǎn)是否在三角形內(nèi),如果在,停止算法,返回為真3:這個(gè)時(shí)候問(wèn)題轉(zhuǎn)化為2D上的三角形與三角形(兩個(gè)三角形共面的情況),三角形和線段的檢測(cè)情況。這里采用了投影方法來(lái)判斷相交性。在整個(gè)過(guò)程中,前面的計(jì)算結(jié)果在后面的計(jì)算中得到重復(fù)的利用,以此來(lái)降低計(jì)算的消耗。Step1根據(jù)上面的圖,列寫(xiě)下面的等式,分別求出Q0Q1Q2三角形和V0V1V2所在面的交點(diǎn)V0+a0*p0+b0*p1=Q0+c0*q0V0+a1*p0+b1*p1=Q1+c1*q1V0+a2*p0+b2

27、*p2=Q2+c2*q2這里要求的就是c0,c1,c2轉(zhuǎn)化為AX=B的形式(p0,p1,q0)*a0=Q0-V0b0-c0-c0=|p0,p1,Q0-V0|/|p0,p1,Q1-Q0|同樣-c1=|p0,p1,Q1-V0|/|p0,p1,Q2-Q1|-c2=|p0,p1,Q2-V0|/|p0,p1,Q0-Q2|注意:這里討論兩個(gè)三角形的一般的情況上面的行列式中實(shí)際上只需要求|p0,p1,Q0|,|p0,p1,Q1|,|p0,p1,Q2|,|p0,p1,V0|這四個(gè),另外這四個(gè)行列式的前兩個(gè)列向量都是一樣的,那么有些共同的運(yùn)算是可以利用的。因?yàn)閨a0,a1,a2|=(a0Xa1).a2所以(a0

28、Xa1)只需要算一次,然后依次和Q0,Q1,Q2,V0點(diǎn)乘一下,可以計(jì)算出四個(gè)行列式,進(jìn)一步通過(guò)幾個(gè)加減法得到需要的六個(gè)行列式的值。如果兩個(gè)三角形相交,那么c0,c1,c2必須滿足0,1,所以如果三個(gè)值中沒(méi)有滿足條件的,則可以判定兩個(gè)三角形不想交。因此這一步是一個(gè)排斥檢測(cè)Step2如果存在滿足條件的ci,計(jì)算出對(duì)應(yīng)的交點(diǎn),因?yàn)樽疃嘀挥袃蓚€(gè)交點(diǎn),記為T(mén)0,T1現(xiàn)在判斷T0,T1是否在V0V1V2三角形內(nèi)可以列方程V0+a0*p0+b0*p1=T0V0+a1*p0+b1*p1=T1即a0*p0+b0*p1=T0-V0a1*p0+b1*p1=T1-V0這只需要在二維上面討論,因此(p0,p1)中要找

29、到滿足2x2行列式不為0的兩行來(lái)求解方程組。這里又可以利用p0Xp1的結(jié)果(p0Xp1的每一個(gè)部分分別是(p0,p1)中2x2行列式的值),所以這里可以分別求出(a0,b0),(a1,b1)如果Ti在三角形內(nèi),必有0=ai=10=bi=10=ai+bi=1所以這里可以判斷是否有相交的情況Step3如果Step2沒(méi)有停止,則這個(gè)時(shí)候表示這兩個(gè)點(diǎn)(如果是只有一個(gè)交點(diǎn)的情況在Step2中已經(jīng)停止)一定在三角形外,這個(gè)階段使用投影方法來(lái)判斷Step2中得到的(a0,b0),(a1,b1)實(shí)際上是一個(gè)在特殊的空間中的坐標(biāo),在這個(gè)空間中V0V1V2退化為一個(gè)特殊的三角形如圖所示先在V0V1V2三角形的邊上

30、投影比如對(duì)x邊x邊V0V2,需要投影到y(tǒng)軸上去如果b00&b11&b11那么這個(gè)線段T0T1與三角形無(wú)交點(diǎn),可以直接返回,否則繼續(xù)其他邊的投影特別的對(duì)于V1V2,這需要在(1,1)這個(gè)向量軸上投影,可以化簡(jiǎn)為a0+b00&a1+b11&a1+b11的條件判斷所以對(duì)于V0V1V2三角形的投影使用了Step2的計(jì)算結(jié)果如果三個(gè)邊都沒(méi)有停止,那么這個(gè)時(shí)候要對(duì)T0T1法向作為軸進(jìn)行投影T0T1=(a1-a0,b1-b0)則法向?yàn)?b1-b0,a0-a1)記為(an,bn)以T0為基點(diǎn)(0,0)的投影為(a0,b0)*(an,bn)(1,0)的投影為(a0-1,b0)*(an,bn)=(a0,b0)*(

31、an,bn)-an(0,1)的投影為(a0,b0-1)*(an,bn)=(a0,b0)*(an,bn)-bn對(duì)于這里計(jì)算出來(lái)的三個(gè)值,如果同時(shí)大于0或者小于0則表示沒(méi)有交點(diǎn)經(jīng)過(guò)所有的投影,都不能判定不相交的條件那么表示兩個(gè)三角形存在交點(diǎn)。特殊情況1:平行但是不共面如果|p0,p1,Q1-Q0|,|p0,p1,Q2-Q1|,|p0,p1,Q0-Q2|存在兩個(gè)為0的情況,那么兩個(gè)三角形是平行的如果在平行的情況下|p0,p1,Q0-V0|,|p0,p1,Q1-V0|,|p0,p1,Q2-V0|不存在0,那么兩個(gè)三角形平行不共面2:共面如果平行情況下,只需檢測(cè)|p0,p1,Q0-V0|是否為0,為0表

32、示共面在這種情況下,不妨記為有三個(gè)交點(diǎn),分別是Q0Q1Q2的三個(gè)頂點(diǎn),然后對(duì)三個(gè)頂點(diǎn)采用Step2和Step3的方法進(jìn)行判定,不同點(diǎn)在于Step3中需要對(duì)T0T1T2三角形的三個(gè)邊進(jìn)行投影判定該算法的性能數(shù)據(jù),測(cè)試環(huán)境:AMDAthlon(tm)64X2DualCoreProcessor4000+2.10GHz,1.96GB執(zhí)行10000000次總消耗時(shí)間:2.2178秒平均消耗:0.2178微秒相交次數(shù):6249996針對(duì)每一種情況的性能數(shù)據(jù)兩個(gè)三角形平行但不共面:0.0812微秒平行共面但不相交:0.1688微秒平行共面相交,有點(diǎn)在三角形內(nèi):0.1265微秒平行共面相交,三角形包含情況:0.2391微秒非平行不相交,另一個(gè)三角形與面無(wú)交點(diǎn):0.0968微秒非平行不相交,另一個(gè)三角形與面有一個(gè)交點(diǎn):0.1563微秒非平行不相交,另一個(gè)三角形與面有兩個(gè)交點(diǎn):0.1617微秒非平行相交,有點(diǎn)在三角形內(nèi):0.1539微秒非平行相交,沒(méi)有點(diǎn)在三角形內(nèi):0.2068微秒CodeAtHereHYPERLINK/attachment/attach/26/65/14/602665146074ef63993d80a63a059f8bdec335ad7a.txtt_bla

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論