版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、這里(a,b,c,o)是坐標(biāo)基矩陣,右邊的列向量分別是向量v和點p在基下的坐標(biāo)。這樣,向量和點在同一個基下就有了不同的表達:點的第4個代數(shù)分量是1。像這種這種用4個代數(shù)分量表示3D幾何概念的方式是一種齊次坐標(biāo)表示?!褒R次坐標(biāo)表示是計算機圖形學(xué)的重要手段之一,它既能夠用來明確區(qū)分向量和點,同時也更易用于進行仿射(線性)幾何變換?!币灰?這樣,上面的(1,4, 7)如果寫成(1,4,7,0 ),它就是個向量;如果是(1,4,7,1),它就是個點。下面是如何在普通坐標(biāo) (Ordinary Coordinate)和齊次坐標(biāo)(Homogeneous Coordinate) 之間進行轉(zhuǎn)換:3D向量的第4個
2、代數(shù)分量是0,而3DF.S. Hill, JR從普通坐標(biāo)轉(zhuǎn)換成齊次坐標(biāo)時,透視投影是3D固定流水線的重要組成部分,是將相機空間中的點從視錐體(frustum)變換到規(guī)則觀察體(Canonical View Volume)中,待裁剪完畢后進行透視除法的行為。在算法中它是通過透視矩陣乘法和透視除法兩步完成的。透視投影變換是令很多剛剛進入3D圖形領(lǐng)域的開發(fā)人員感到迷惑乃至神秘的一個圖形技術(shù)。其中的理解困難在于步驟繁瑣,對一些基礎(chǔ)知識過分依賴,一旦對它們中的任何地方感到陌生,立刻導(dǎo)致理解停止不前。沒錯,主流的3D APIs如OpenGL D3D的確把具體的透視投影細節(jié)封裝起來,比如gluPerspec
3、tive()就可以根據(jù)輸入生成一個透視投影矩陣。而且在大多數(shù)情況下不需要了解具體的內(nèi)幕算法也可以完成任務(wù)。但是你不覺得,如果想要成為一個職業(yè) 的圖形程序員或游 戲開發(fā)者,就應(yīng)該真正降伏透視投影這個家伙么?我們先從必需的基礎(chǔ)知識著手,一步一步深入下去(這些知識在很多地方可以單獨找到,但我從來 沒有在同一個地方全部找到,但是你現(xiàn)在找到了)。我們首先介紹兩個必須掌握的知識。有了它們,我們才不至于在理解透視投影變換的過程中迷失方向(這里會使用到向量幾何、矩陣的部分知識,如果你對此不是很熟悉,可以參考可以找到一組坐標(biāo)(v1,v2,v3),使得v = v1 a + v2 b + v3 c(1)而對于一個點
4、p,則可以找到一組坐標(biāo)(p1,p2,p3 ),使得p - o = p1 a + p2 b + p3 c(2)從上面對向量和點的表達,我們可以看岀為了在坐標(biāo)系中表示一個點(如p),我們把點的位置看作是對這個基的原點o所進行的一個位移,即一個向量一一 p - o (有的書中把這樣的向量叫做位置向量-起始于坐標(biāo)原點的特殊向量),我們在表達這個向量的同時用等價的方式表達出了點p:p = o + p1 a + p2 b + p3 c (3)(1)(3)是坐標(biāo)系下表達一個向量和點的不同表達方式。這里可以看岀,雖然都是用代數(shù)分量的形式表達向量和點,但表達一個點比一個向量需要額外的信息。如果我寫岀一個代數(shù)分量
5、表達(1,4, 7),誰知道它是個向量還是個點!我們現(xiàn)在把(1)( 3)寫成矩陣的形式:如果(x,y,z)是個點,則變?yōu)?x,y,z,1);如果(x,y,z) 是個向量,則變?yōu)?(x,y,z,0)從齊次坐標(biāo)轉(zhuǎn)換成普通坐標(biāo)時,如果是(x,y,z,1),則知道它是個點,變成(x,y,z);如果是(x,y,z,0),則知道它是個向量,仍然變成(x,y,z)以上是通過齊次坐標(biāo)來區(qū)分向量和點的方式。從中可以思考得知,對于平移有位置概念,只有大小和方向,這可以通過下面的式子清楚地看岀:T、旋轉(zhuǎn)R、縮放S這3個最常見的仿射變換,平移變換只對于點才有意義,因為普通向量沒o 1 o o JI o-I y Z T
6、 T T l+r+K y z 1X y z TrT 1 o o 1 o o 1 o o -1 Av -o2)CVV裁剪完成后進行透視除法(一會進行解釋)而旋轉(zhuǎn)和縮放對于向量和點都有意義,你可以用類似上面齊次表示來檢測。從中可以看岀,齊次坐標(biāo)用于仿射變換非常方便。此外,對于一個普通坐標(biāo)的點P=(Px, Py, Pz),有對應(yīng)的一族齊次坐標(biāo) (wPx, wPy, wPz, w),其中w不等于零。比如,P(1,4, 7) 的齊次坐標(biāo)有(1,4, 7,1)、( 2, 8,14, 2 )、( -0.1, -0.4, -0.7, -0.1)等等。因此,如果把一個點從普通坐標(biāo)變成齊次坐標(biāo),給x,y,z乘上同
7、一個非零數(shù) w,然后增加第4個分量w;如果把一個齊次坐標(biāo)轉(zhuǎn)換成普通坐 標(biāo),把前三個坐標(biāo)同時除以第4個坐標(biāo),然后去掉第 4個分量。由于齊次坐標(biāo)使用了 4個分量來表達3D概念,使得平移變換可以使用矩陣進行,從而如F.S. Hill, JR 所說,仿射(線性)變換的進行更加方便。由于圖形硬件已經(jīng)普遍地支持齊次坐標(biāo)與矩陣乘法,因此更加促進了齊次坐標(biāo)使用,使得它似乎成為圖形學(xué)中的一個標(biāo)準(zhǔn)。簡單的線性插值這是在圖形學(xué)中普遍使用的基本技巧,我們在很多地方都會用到,比如2D位圖的放大、縮小,Tweening變換,以及我們即將看到的透視投影變換等等?;舅枷胧牵航o一個x屬于a, b,找到y(tǒng)屬于c, d,使得x與
8、a的距離比上ab長度所得到的比例,等于y與c的距離比上cd長度所得到的比例,用數(shù)學(xué)表達式描述很容易理解:x - ay - cb - ad - c這樣,從a到b的每一個點都與c到d上的唯一一個點對應(yīng)。有一個x,就可以求得一個y。此外,如果x不在a, b內(nèi),比如x b,則得到的y也是符合y d,比例仍然不變,插值同樣適用透視投影變換好,有了上面兩個理論知識,我們開始分析這次的主角一一透視投影變換。這里我們選擇OpenGL的透視投影變換進行分析,其他的 APIs會存在一些差異,但主體思想是相似的,可以類似地推導(dǎo)。經(jīng)過相機矩陣的變換,頂點被變換到了相機空間。這個時候的多邊形也許會被視錐體裁剪,但在這個
9、不規(guī)則的體中進行裁剪并非那么容易的事情,所以經(jīng)過圖形學(xué)前輩們的精心分析,裁剪被安排到規(guī)則觀察體(Canonical View Volume, CVV) 中進行,CVV是一個正方體,x, y, z 的范圍都是-1 ,1,多邊形裁剪就是用這個規(guī)則體完成的。所以,事實上是透視投影變換由兩步組成:1)用透視變換矩陣把頂點從視錐體中變換到裁剪空間的CVV中。-X y z o透視投影變換從上面可以看出,投影的結(jié)果z始終等于-N,在投影面上。實際上,z對于投影后的 P已經(jīng)沒有意義了,這個信息點已經(jīng)沒用了。但對于3D圖形管線來說,為了便于進行后面的片元操作,例如z緩沖消隱算法,有必要把投影之前的z保存下來,方
10、便后面使用。因此,我們利用這個沒用的信息點存儲z,處理成:我們一步一步來,我們先從一個方向考察投影關(guān)系上圖是右手坐標(biāo)系中 頂點在相機空間中的情形。設(shè) P(x,z)是經(jīng)過相機變換之后的點,視錐體由 eye眼睛位置,np近裁剪平面,fp 遠裁剪平面組成。N是眼 睛到近裁剪平面的距離,F(xiàn)是眼睛到遠裁剪平面的距離。投影面可以選擇任何平行于近裁剪平面的平面,這里我們選擇近裁剪平面作為投影平面。設(shè)P (x ,z )是投影之后的點,則有z = -N。通過相似三角形性質(zhì),我們有關(guān)系:同理,有這樣,我們便得到了 P投影后的點P這個形式最大化地使用了 3個信息點,達到了最原始的投影變換的目的,但是它太直白了,有一
11、點蠻干的意味,我感覺我們最終的結(jié)果不應(yīng)該是它,你說呢?我們開始結(jié)View Frustum變成o o b O o a-i一o N o o合CVV進行思考,把它寫得在數(shù)學(xué)上更優(yōu)雅一致,更易于程序處理。假入能夠把上面寫成這個形式:那么我們就可以非常方便的用矩陣以及齊次坐標(biāo)理論來表達投影變換:C-Nx/z -Ny/z -(az+b)/r 1哈,看到了齊次坐標(biāo)的使用,這對于你來說已經(jīng)不陌生了吧?這個新的形式不僅達到了上面原始投影變換的目的,而且使用了齊次坐標(biāo)理論,使得處理更加規(guī)范化。注意/Nx/z-Ny/z-(az+b)/z V的一步我們是使用齊次坐標(biāo)變普通坐標(biāo)的規(guī)則完成的。這一步在透視投影過程中稱為透
12、視除法(Perspective Division ),這是透視投影變換的第 2步,經(jīng)過這一步,就/ Nx Ny I az+b 丟棄了原始的z值(得到了 CVV中對應(yīng)的z值,后面解釋),頂點才算完成了投影。而在這兩步之間的就是CVV裁剪過程,所以裁剪空間使用的是齊次坐標(biāo)二-,主要原因在于透視除法會損失一些必要的信息(如原始z,第4個-z保留的)從而使裁剪變得更加難以處理,這里我們不討論CVV裁剪的細節(jié),只關(guān)注透視投影變換的兩步。矩陣就是我們投影矩陣的第一個版本。你一定會問為什么要把z寫成有兩個原因:1)P的3個代數(shù)分量統(tǒng)一地除以分母-z,易于使用齊次坐標(biāo)變?yōu)槠胀ㄗ鴺?biāo)來完成,使得處理更加一致、高效
13、。az + b2)后面的CVV是一個x,y,z的范圍都為-1,1的規(guī)則體,便于進行多邊形裁剪。而我們可以適當(dāng)?shù)倪x擇系數(shù)a和b,使得這個式子在z = -N的時候值為-1,而在z = -F的時候值為1,從而在z方向上構(gòu)建CVV接下來我們就求出a和b:下面要做的就是從這個新形式岀發(fā)反推岀下一個版本的透視投影矩陣。注意到/Nx/z-Ny/z-(az+b)/z 1警-leftx - (-1)right-left1 -(-1)zEr-bottomy -)top-bottom1 -)2Nx / _z right + leftright left right left2Ny / 7top - bottomto
14、p + bottomtop - botton則我們得到了最終的投影點:這樣我們就得到了透視投影矩陣的第一個版本:使用這個版本的透視投影矩陣可以從z方向上構(gòu)建CVV但是X和y方向仍然沒有限制在-1,1中,我們的透視投影矩陣的下一個版本就要解決這個問題。為了能在x和y方向把頂點從Frustum情形變成CVV情形,我們開始對x和y進行處理。先來觀察我們目前得到的最終變換結(jié)果:-Ix/z-Ny/z-(az+b)/z我們知道-Nx / z屬于left, right們解決掉它:的有效范圍是投影平面的左邊界值(記為left )和右邊界值(記為 right ),即left, right, -Ny / z _則
15、為bottom, top。而現(xiàn)在我們想把-Nx / z映射到x屬于-1,1中,-Ny / z屬于bottom, top 映射到y(tǒng)屬于-1,1中。你想到了什么?哈,就是我們簡單的線性插值,你都已經(jīng)掌握了!我/ffx Nyl az+b ,是-經(jīng)過透視除法的形式,而 P只變化了 x和y分量的形式,az+b和-z是不變的,則我們做透視除法的逆處理一一給P每個分量乘上-z,得到而這個結(jié)果又是這么來的:bottom則我們最終得到:2Nright -left2Ntop - bottom-2FKright 十 leftright - lefttop + bott OJILtop - bottomM就是最終的透
16、視變換矩陣。相機空間中的頂點,剪很有利。OpenGL在構(gòu)建透視投影矩陣的時候就使用了M的形式。注意到 M的最后一行不是(0 0 0 1)而是(0 0 -1 0)非線性的。另外一點你可能已經(jīng)想到,對于投影面來說,它的寬和高大多數(shù)情況下不同,即寬高比不為 這就造成了多邊形的失真現(xiàn)象,比如一個投影面上的正方形在之后,在歸一化的設(shè)備坐標(biāo) (Normalized Device Coordinates)如果在視錐體中,則變換后就在CVV 中。如果在視錐體外,變換后就在CVV外。而CVV本身的規(guī)則性對于多邊形的裁,因此可以看出透視變換不是一種仿射變換,它是1,比如640/480。而CVV勺寬高是相同的,即寬
17、高比永遠是CVV的面上可能變成了一個長方 形。解決這個問題的方法就是在對多變形進行透視變換、裁剪、透視除法上進行的視口 (viewport)變換中進行校正,它會把歸一化的頂點之間按照和投影面上相同的比例變換到視口中,從而解除透視投影變換帶來的失真現(xiàn)象。進行校正前提就是要使投影平面的寬高比和視口的寬高比相同。便利的投影矩陣生成函數(shù)2Nz2Ny:right leftaz這樣的函數(shù)為用戶提供快捷的透視3D APIs 都提供了諸如 gluPerspective(fov, aspect, near, far)或者 D3DXMatrixPerspectiveFovLH(pOut, fovY, Aspect
18、, zn, zf)矩陣生成方法。我們還是用OpenGL的相應(yīng)方法來分析它是如何運作的。L廠left -ri ght-bottom-aspectright = near x tantfov / 2)left = righttop = right / aspectbottom = -top-too-left -ri ght-bottom -righttoptop = near x tan(fov/2)toot tom = -topright = top s aspectleft = -rightgluPerspective(fov, aspect, near, far)fov即視野,是視錐體在 x
19、z平面或者yz平面的開角角度,具體哪個平面都可以。OpenGL和D3D都使用yz平面aspect即投影平面的寬高比。near是近裁剪平面的距離far是遠裁剪平面的距離。上圖中左邊是在xz平面計算視錐體,右邊是在 yz平面計算視錐體??梢钥吹阶筮叺牡?步top = right / aspect使用了除法(圖形程序員討厭的東西),而右邊第3步right = top x aspect使用了乘法,這也許就是為什么圖形APIs采用yz平面的原因吧!在上一篇文章中我們討論了透視投影變換的原理,分析了OpenGL所使用的透視投影矩陣的生成方法。正如我們所說,不同的 圖形API因為左右手坐標(biāo)系、行向量列向量矩
20、陣以及變換范圍等等的不同導(dǎo)致了矩陣的差異,可以有幾十個不同的透視投影矩陣,但它們的原理大同小異。這次我們準(zhǔn)備討論一下Direct3D (以下簡稱D3D以及J2ME平臺上的JSR184(M3G (以下簡稱 M3G的透視投影矩陣,主要出于以下幾個目的:(1)我們在寫圖形引擎的時候需要采用不同的圖形API實現(xiàn),當(dāng)前主要是 OpenGL和D3Q雖然二者的推導(dǎo)極為相似,但D3D的自身特點導(dǎo)致了一些地方仍然需要澄清。(2)DirectX SDK的手冊中有關(guān)于透視投影矩陣的一些說明,但并不詳細,甚至有一些錯誤,從而使初學(xué)者理解起來變得困難,而這正是本文寫作的目的。(3)M3G是J2ME平臺上的3D開發(fā)包,采
21、用了 OpenGL作為底層標(biāo)準(zhǔn)進行封裝。它的透視投影矩陣使用OpenGL的環(huán)境但又進行了簡化,值得一提。本文努力讓讀者清楚地了解 D3D與 M3G透視投影矩陣的原理,從而能夠知道它與 OpenGL的一些差別,為構(gòu)建跨API的圖形引擎打好基礎(chǔ)。需要指岀的一點是為了完全理 解本文的內(nèi)容,請讀者先理解上一篇文章深入探索透視投影變換的內(nèi)容,因為OpenGL和它們的透視投影 矩陣的原理非常相似,因此這里不會像上一篇文章從基礎(chǔ)知識講起,而是對比它們的差異來推導(dǎo)變換矩陣。我們開始!OpenGl與D3D的基本差異前面提到,不同API的基本差異導(dǎo)致了最終變換矩陣的不同,而導(dǎo)致OpenGL和D3D的透視投影矩陣不
22、同的原因有以下幾個:(1)OpenGL默認(rèn)使用右手坐標(biāo)系,而 D3D默認(rèn)使用左手坐標(biāo)系。D3D Rowr-V ector MultiplicaiionF是它到相OpenGL handed coordifLate system(2)OpenGL使用列向量矩陣乘法而 D3D使用行向量矩陣乘法b cyVef ShAij丘In o巧OpenGL CoimnnVec tor Multiplic ation(3)OpenGL的 CVV的 Z 范圍是-1, 1, D3D的 CVV的 Z 范圍是0, 1以上這些差異導(dǎo)致了最終 OpenGL和D3D的透視投影矩陣的不同。D3D的透視投影矩陣推導(dǎo)我們先來看最最基本
23、的透視關(guān)系圖(上一篇文章開始的時候使用的圖):這里我們考察的是xz平面上的關(guān)系,yz平面上的關(guān)系同理。這里 o是相機位置。np是近裁剪平面,也是投影平面,N是它到相機的距離。fp是遠裁剪平面,機的位置。p是需要投影的點,p是投影之后的點。根據(jù)相似三角形定理,我們有Agp?三 AqpS則有x1 z* N英彳ey=NG N一同理丿JVT7777注意到OpenGL使用右手坐標(biāo)系,因此應(yīng)該使用 -N (請參考上一篇文章的這一步),而D3D使用左手坐標(biāo)系,因此使用 N,這是二者的不同點之一。這樣,我們得到投影第三個信息點是變換之后的Fa = -F- N , NF b = _ 一-F-NPersp Pr
24、ojfN000N0000a120bJrf N000f、ryX0N00z00a1az + b0bk z J之后的點x yp= N- N- Nz在投影平面上的位置,也就是N,它已經(jīng)沒用了,我們把p寫成從而用第三個沒用信息點它來存儲 z (如果讀者對這一點不太了解,請參考上一篇文章)。接下來我們求出a和b,從而在z方向上構(gòu)建CVV請注意這里是 OpenGL和D3D的另一個不同點,OpenGL的CVV的z范圍是-1,1,而D3D的CVV的z范圍是0, 1。也就是說,D3D中在近裁剪平面上的點投影之后的點會處于 CVV的z=0平面 上,而在遠裁剪平面上的點投影之后的點會在 CVV的z=1平面上。這樣我們
25、的計算方程就是az-rb”-= OjZ = Nz A 亠= l,z= F從而我們得到了透視投影矩陣的第一個版本Fa -F _ N NF D =F-N這個時候第三個分量變換到 CVV情形了,CVV的z范圍是0,1。接下來根據(jù)上一篇文章所講到的,我們要把前兩個分量變成CVV情形,CVV的x和y范圍是-1,1,如下圖所示:使用線性插值,我們有:rightleft型/ bottomtop-bottom1-(-1)羅旳(1)1-(-1)這里left和right是投影平面的左右范圍,top和bottom是投影平面的上下范圍。xcvv和ycvv是我們需要算出的在 CVV情形中的x和y,也就是我們要計算出的結(jié)
26、果。 但在算岀它們之前,我們先把上面的式子寫成:right left際 二兀艸right left 2bottom vtopbottom top - bottom2121+ 2這里有一個需要注意的地方,如果投影平面在x方向上居中,則I叮t1right 一 left2那么第一個式子就可以銷掉等號兩邊的1/2,寫成M/right leftCVVr同理,如果投影平面在 y方向上居中,則第二個式子可以寫成top 一 bottom 2則我們現(xiàn)在分兩種情況討論:(1)投影平面的中心和x-y平面的中心重合(在 x和y方向上都居中)(2)一般情況我們分別討論:(1)特殊情況方程right left2Ny/_/
27、込 _ _幾叩top-bottom 2這組是特殊情況,方程比較簡單,但也是使用頻率最高的方式(這是D3DXMatrixPerspectiveFovRH四個方法所使用的情況)。我們導(dǎo)出它:D3DXMatrixPerspectiveLH 、D3DXMatrixPerspectiveRH 、D3DXMatrixPerspectiveFovLH2Nx(right - left )z2Nytop - bottom )z則我們反推岀透視投影矩陣:2屁(right 一-bottom)z az + b(right-left)2Ny(top - bottom)az + b其中2N2N m-0t-b0 a0 b
28、0F-N , NF b 而r-l和t-b可以分別看作是投影平面的寬w和高h。最后那個矩陣就是 D3D的透視投影矩陣之一。另外呢,如果我們不知道right、left、top以及bottom這幾個參量,也可以根據(jù)視野(FOV - Field Of View )參量來求得。下面是兩個平面的視野關(guān)系圖:2N=cot同理2N-cot其中必= i兩個方法所使right + leftright _ left2Ny/right lefttop + bottomtop 一 bottom top 一 bottom2N其中,兩個fov分別是在X-Z以及y-z平面上的視野。如果只給了一個視野,也可以通過投影平面的寬高
29、比計算出來:aspect _ ratio 二一h今 W =曲 X aspect _ mfi或者aspect _ ratio用一個視野算出w或者h,然后用寬高比算出h或者Wo(2)般情況的方程Nx/zlefi _ f 11right leftJi r/right left22bottomycvv1+ top bottom top - bottom22這組方程比較繁瑣,但更具一般性(和OpenGL一 般矩陣的推導(dǎo)一致,這也是 D3DXMatrixPerspectiveOffCenterLH 和 D3DXMatrixPerspectiveOffCenterRH用的情況)。我們導(dǎo)岀它:cot我們繼續(xù)反推岀透視投影矩陣:2N/z rights leftright - lejt right - left2鄉(xiāng)top + bottomIKVPDtop - bottom top - bottomaz-
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年成都租賃市場住宅裝修合同4篇
- 二零二五年度魚塘經(jīng)營承包金融服務(wù)合同3篇
- 2025年度瓷磚行業(yè)專業(yè)市場開發(fā)與運營合作協(xié)議4篇
- 二零二五年度大氣合同封面設(shè)計授權(quán)使用協(xié)議4篇
- 二零二五年度海洋資源開發(fā)合作出資協(xié)議書4篇
- 二零二五白酒灌裝委托加工與品牌營銷合作協(xié)議3篇
- 2025廠區(qū)節(jié)能減排及廢棄物處理合作協(xié)議3篇
- 成都市三診試卷數(shù)學(xué)試卷
- 二零二五年度環(huán)保項目代理人貸款合同3篇
- 二零二五年度木工材料采購與倉儲分包合同4篇
- 海外資管機構(gòu)赴上海投資指南(2024版)
- 山東省青島市2023-2024學(xué)年七年級上學(xué)期期末考試數(shù)學(xué)試題(含答案)
- 墓地銷售計劃及方案設(shè)計書
- 從偏差行為到卓越一生3.0版
- 優(yōu)佳學(xué)案七年級上冊歷史
- 鋁箔行業(yè)海外分析
- 紀(jì)委辦案安全培訓(xùn)課件
- 超市連鎖行業(yè)招商策劃
- 城市道路智慧路燈項目 投標(biāo)方案(技術(shù)標(biāo))
- 【公司利潤質(zhì)量研究國內(nèi)外文獻綜述3400字】
- 工行全國地區(qū)碼
評論
0/150
提交評論