計算機(jī)圖形學(xué)報告_第1頁
計算機(jī)圖形學(xué)報告_第2頁
計算機(jī)圖形學(xué)報告_第3頁
計算機(jī)圖形學(xué)報告_第4頁
計算機(jī)圖形學(xué)報告_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、2成都理工大學(xué)計算機(jī)圖形學(xué)課程設(shè)計三維真實感圖形設(shè)計與繪制學(xué)生姓名: 郭耀中 學(xué) 號: 201108030309年級專業(yè):軟件工程4班學(xué) 院:信息科學(xué)與技術(shù)學(xué)院四川成都提交日期:2014年4月目錄一、簡要說明3二、實驗題目31.題目內(nèi)容說明:32.技術(shù)要點說明3三、需求分析41.課題設(shè)計思路4四、三維圖形的設(shè)計過程51.三維圖形設(shè)計的過程如下:52.設(shè)計過程說明:6五、三維圖形的主程序71.部分源碼7六、設(shè)計結(jié)果14七、設(shè)計小結(jié)21 2計算機(jī)圖形學(xué)三維圖形設(shè)計與繪制一、 簡要說明OpenGL(Open Graphic Library) 是由SGI公司的 IRIS GL 圖形庫發(fā)展而來的三維真實

2、感圖形生成工具, 鑒于它的跨平臺、高質(zhì)量、高效率、功能等特點,已經(jīng)成為各種平臺下的三維圖形制作及交互式場景處理的工業(yè)標(biāo)準(zhǔn),被廣泛地運用于科學(xué)計算可視化、計算機(jī)動畫和虛擬現(xiàn)實等計算機(jī)圖形學(xué)熱點問的解決之中。在 Windows 平臺下,OpenGL 和 DirectX 是兩個開發(fā)三維圖形應(yīng)用程序的標(biāo)準(zhǔn),OpenGL 提供了二維和三維建模、 變換、 光線處理、 色彩處理、 紋理映射、 運動模糊、 動畫和實時交互等功能,是繪制真實感三維圖形、建立三維交互場景、實現(xiàn)虛擬現(xiàn)實的高性能圖形開發(fā)工具軟件包。與 DirectX 相比,用 OpenGL 來繪制三維地形具有圖形質(zhì)量高、程序可移植性好等優(yōu)點。本文充分

3、利用三維圖形庫 OpenGL 卓越的渲染能力,在 Visual C+ 6.0環(huán)境下開發(fā)了一種基于 OpenGL 的三維真實感圖形顯示和渲染的工具二、 實驗題目三維真實感圖形設(shè)計與繪制1. 題目內(nèi)容說明:(1)題目內(nèi)容說明:本題目要求應(yīng)用OpenGL的光照技術(shù)和紋理技術(shù)實現(xiàn)一個簡單的三維真實感圖形的程序設(shè)計。程序功能要求: 1)用對話方式實現(xiàn)交互式的光照、材質(zhì)模型參數(shù)設(shè)計。 2)交互式的模型紋理映射功能 3)用鼠標(biāo)跟蹤球方法實現(xiàn)三維模型的空間旋轉(zhuǎn)2. 技術(shù)要點說明 1)三維模型顯示場景樹 所謂三維場景樹是指將三維可視化模型場景內(nèi)容分解用一種樹或表數(shù)據(jù)結(jié)構(gòu)描述。 2) 建立一個合理程序設(shè)計類結(jié)構(gòu)三

4、、 需求分析真實感圖形的設(shè)計與繪制,是計算機(jī)圖形學(xué)中的一個重要研究領(lǐng)域,也是三維實體造型系統(tǒng)和特征造型系統(tǒng)的重要組成部分。一般地,三維實體在計算機(jī)顯示屏上有三種表現(xiàn)形式:簡單線框圖、線框消隱圖和真實感圖形。其中,簡單線框圖能夠粗略表達(dá)實體的形狀,但由于簡單線框圖的二義性,從而導(dǎo)致表達(dá)其的實體形狀具有不確定性。而線框消隱圖雖然能反映實體各表面間的相互遮擋關(guān)系,從而達(dá)到消除簡單線框圖產(chǎn)生的二義性的目的,但是這兩者一樣地只能反映實體的幾何形狀和實體間的相互關(guān)系,而不能反映實體表面的特征,如表面的顏色、材質(zhì)、紋理等。所以,只有真實感圖形才能表現(xiàn)實體的這些特征,因此,在三維實體造型中,生成三維實體的光照

5、模型,進(jìn)行實體的真實感繪制與顯示占有重要的地位,是很有必要的,也是我做此設(shè)計的初衷。 在設(shè)計中,我主要使用Opengl繪制真實感圖形,它作為一種強(qiáng)大的三維圖形開發(fā)工具,通過便捷的編程接口提供了處理光照和物體材質(zhì)、顏色屬性等通用功能。真實感圖形學(xué)是計算機(jī)圖形的核心內(nèi)容之一,是最能直接反映圖形學(xué)魅力的分支。尋求能準(zhǔn)確地描述客觀世界中各種現(xiàn)象與景觀的數(shù)學(xué)模型,并逼真地再現(xiàn)這些現(xiàn)象與景觀,是圖形學(xué)的一個重要研究課題。很多自然景物難以用幾何模型描述,如煙霧、植物、水波、火焰等。本文所討論的幾種建模及繪制技術(shù)都超越了幾何模型的限制,能夠用簡單的模型描述復(fù)雜的自然景物。在計算機(jī)的圖形設(shè)備上實現(xiàn)真實感圖形必須

6、完成的四個基本任務(wù)。1. 三維場景的描述。三維造型。2. 將三維幾何描述轉(zhuǎn)換成為二維透視圖。透視變換。3. 確定場景中的所有可見面。消隱算法,可見面探測算法。4. 計算場景中可見面的顏色。根據(jù)基于光學(xué)物理的光照模型計算可見面投射到觀察者眼中的光亮度大小和色彩組成。1. 課題設(shè)計思路要設(shè)計一個良好的場景和優(yōu)秀的交互方式,現(xiàn)在虛擬現(xiàn)實場景十分繁多,各種交互方式也五花八門,我們要選擇特定的場景,場景要保證兩點:一是其新鮮性,讓人耳目一新,否則會讓人有過于老套的感覺;另外就是其真實度,這是本次課題的著重關(guān)注點;在選取選定的場景后,我們要定義各交互方式,在從現(xiàn)有可得到的交互方式案例中提取和創(chuàng)新,以保證開

7、發(fā)出來的交互方式可以最大程度的提高人機(jī)交互的效率。 場景的規(guī)模是必須考慮的,因為設(shè)計的時間和人員有限,必須限制場景規(guī)模,沒有時間和人力去開發(fā)過大的場景規(guī)模,但是如果場景規(guī)模過小,演示系統(tǒng)就無法給人帶來非常強(qiáng)烈的真實感沖擊,而且過小規(guī)模的場景也會限制交互方式的設(shè)計和開發(fā)。 三維圖形及動畫場景的顯示,就是把所建立的三維空間模型,經(jīng)過計算機(jī)的復(fù)雜處理,最終在計算機(jī)二維屏幕上顯示的過程,并且在顯示的過程要保證其真實感。一般,設(shè)計三維圖形軟件要經(jīng)過以下步驟:(1)圖元建立三維模型。(2)設(shè)置觀看物體的窗口和觀看點(視點)。(3)設(shè)定各物體的屬性(如色彩、光照、紋理映射等)(4)如果要物體動起來,還要進(jìn)行

8、圖形變換(如幾何變換、視窗變換和投影變換等)。(5)三維圖形的二維化。四、 三維圖形的設(shè)計過程1. 三維圖形設(shè)計的過程如下:(1) 建立三維模型建立三維模型,就是在三維坐標(biāo)系中畫三維場景。利用畫點(Point)、畫線(Line)、畫多邊形(Polygon)等函數(shù)可以建立復(fù)雜的空間模型。在表示三維空間時,一般用齊次坐標(biāo)(Homogeneous Coordinate)。在實際應(yīng)用時一般把一系列頂點(Vertex )組織起來以構(gòu)成物體或圖元。(2) 置窗口和視口 圖形顯示的區(qū)域稱為顯示窗口。流程順序為:定義一個窗口一般由以下步驟完成:設(shè)置窗口模式,設(shè)置窗口位置、大小,初始化窗口,窗口顏色設(shè)置清理窗口

9、是指把窗口清成某種顏色。要觀看場景,也需要一個窗口,即視口。通俗地講,視口變大,場景被放大;視口變小,場景被縮小。下面就是一個簡單視窗的代碼:void myDisplay(void)glClear(GL_COLOR_BUFFER_BIT);glRectf(-0.5f, -0.5f, 0.5f, 0.5f);glFlush();int main(int argc, char *argv)glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutIni

10、tWindowSize(400, 400);glutCreateWindow(第一個 OpenGL 程序);glutDisplayFunc(&myDisplay);glutMainLoop();return 0;該程序的作用是在一個黑色的窗口中央畫一個白色的矩形(3) 設(shè)置光照 要使物體具有真實感,就要對物體進(jìn)行光照處理。在計算機(jī)圖形學(xué)中,物體的真實感應(yīng)考慮兩種因素:光源和物體材質(zhì)。OpenGL 在處理光照時采用這樣一種近似:把光照系統(tǒng)分為三部分,分別是光源、材質(zhì)和光照環(huán)境。光源就是光的來源,可以是前面所說的太陽或者電燈等。材質(zhì)是指接受光照的各種物體的表面,由于物體如何反射光線只由物體表面決定

11、(OpenGL 中沒有考慮光的折射),材質(zhì)特點就決定了物體反射光線的特點。光照環(huán)境是指一些額外的參數(shù),它們將影響最終的光照畫面,比如一些光線經(jīng)過多次反射后,已經(jīng)無法分清它究竟是由哪個光源發(fā)出,這時,指定一個“環(huán)境亮度”參數(shù),可以使最后形成的畫面更接近于真實情況。(4)控制材質(zhì)材質(zhì)與光源相似,也需要設(shè)置眾多的屬性。不同的是,光源是通過 glLight*函數(shù)來設(shè)置的,而材質(zhì)則是通過 glMaterial*函數(shù)來設(shè)置的。glMaterial*函數(shù)有三個參數(shù)。第一個參數(shù)表示指定哪一面的屬性??梢允?GL_FRONT、GL_BACK 或者 GL_FRONT_AND_BACK。分別表示設(shè)置“正面”“ 背面

12、”的材質(zhì),或者兩面同時設(shè)置。(關(guān)于“正面”“ 背面”的內(nèi)容需要參看前些課程的內(nèi)容)第二、第三個參數(shù)與glLight*函數(shù)的第二、三個參數(shù)作用類似。2. 設(shè)計過程說明:首先,為了繪制三維分形圖形,我們先要建立數(shù)學(xué)模型。物體的三維模型的建立,需要向計算機(jī)輸入三維數(shù)據(jù),而在實際應(yīng)用中,三維數(shù)據(jù)的輸入是一個復(fù)雜的問題,需要用曲線、曲面擬合的方法建立模型。因此要根據(jù)不同的三維分形圖形的具體情況,尋找合適的方法來建立它們各自的數(shù)學(xué)模型。其次,要在計算機(jī)上進(jìn)行三維分形的算法實現(xiàn)。在顯示設(shè)備上逼真地顯示出建立的模型,需要對原始圖形數(shù)據(jù)進(jìn)行坐標(biāo)變換、隱藏面消除和明暗處理,最后生成所要顯示的真實感圖形。針對不同的

13、三維分形圖形,如何采取合適的方法在計算機(jī)上實現(xiàn),需要通過對問題的具體分析后進(jìn)行選取。五、 三維圖形的主程序1. 部分源碼main函數(shù)源碼:#include stdafx.h#include #include #include GLfloat xrot; / 繞X軸旋轉(zhuǎn)的角度。GLfloat yrot; / 繞Y軸旋轉(zhuǎn)的角度。GLuint texture6; / 存儲6個面。int LastXPos,LastYPos; /上次鼠標(biāo)點擊處x、y坐標(biāo)。BOOL IsLBDown = FALSE; /鼠標(biāo)左鍵是否按下。讀取紋理文件/加載失敗是返回nullAUX_RGBImageRec *LoadBMP

14、(char *Filename) / 加載圖片。FILE *File=NULL; if (!Filename) / 確保的到了文件名。return NULL; / 如果沒得到就返回空。File=fopen(Filename,r); / 檢查文件是否存在。if (File) / 文件是否存在?fclose(File); / 關(guān)閉文件。return auxDIBImageLoad(Filename); / 加載圖片并返回指針。return NULL; / 加載失敗返回空。加載紋理設(shè)置紋理模式并綁定紋理int LoadGLTextures() / 加載圖片并貼在表面上。int i; char fil

15、ename128; /此處一次加載6個紋理AUX_RGBImageRec *TextureImage6; / 創(chuàng)建紋理的存儲空間。memset(TextureImage,0,sizeof(void *)*6); / 設(shè)置指針為空。/ 加載圖片,檢查錯誤,如果圖片不存在就退出。for(i=0;i6;i+)sprintf(filename,Data/%d.bmp,i+1);TextureImagei = LoadBMP(filename);if(!TextureImagei)char msg256;sprintf(msg,Cannot read the file : %s,filename);Me

16、ssageBox(NULL,msg,Error,MB_OK);return FALSE; glGenTextures(6,texture); for(i=0;isizeX, TextureImagei-sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImagei-data);if(TextureImagei-data)free(TextureImagei-data);free(TextureImagei);return TRUE; /返回狀態(tài)。響應(yīng)窗口發(fā)生變化事件GLvoid ReSizeGLScene(GLsizei width, GLsizei hei

17、ght) / 調(diào)整大小和初始化GL窗口。if (height=0) / 防止為0.height=1; / 為0是改為1.glViewport(0,0,width,height); / 設(shè)置當(dāng)前視口。glMatrixMode(GL_PROJECTION); / 選擇投影矩陣。glLoadIdentity(); / 復(fù)位投影矩陣。/ 計算窗口的縱橫比gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);glMatrixMode(GL_MODELVIEW); / 選擇的模型視圖矩陣。glLoadIdentity(); /重置

18、模型觀察矩陣。/場景初始化int InitGL(GLvoid) / 所有的設(shè)置。/加載紋理if (!LoadGLTextures() / 紋理加載程序。return FALSE; / 如果紋理不加載返回false。/啟用紋理貼圖glEnable(GL_TEXTURE_2D); / 使用紋理映射。glShadeModel(GL_SMOOTH); / 使光滑陰影。glClearColor(0.0f, 0.0f, 0.0f, 0.5f); / 黑色背景。 /深度檢測glClearDepth(1.0f); / 深度緩沖區(qū)設(shè)置, glEnable(GL_DEPTH_TEST); / 允許深度測試。glD

19、epthFunc(GL_LEQUAL); / 做深度測試的類型。glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); / 真實感的角度計算。/啟用光源GLfloat mat_ambient = 0.2f, 0.2f, 0.2f, 1.0f ;GLfloat mat_diffuse = 0.8f, 0.8f, 0.8f, 1.0f ;GLfloat mat_specular = 1.0f, 1.0f, 1.0f, 1.0f ;GLfloat mat_shininess = 50.0f ;GLfloat light0_diffuse = 1.0f,

20、0.0f, 0.0f, 1.0f ;GLfloat light0_position = 0.0f, 0.0f, 21.0f, 0.0f ;glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);/指定材質(zhì)的環(huán)境反射光的反射系數(shù)。glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);/制定材質(zhì)的漫反射光反射系數(shù)。glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);/制定材質(zhì)的鏡面反射光反射系數(shù)。glMaterialfv(GL_FRONT, GL_SHININESS,

21、mat_shininess);/制定材質(zhì)的鏡面反射指數(shù)值。glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);/指定漫反射光成分。glLightfv(GL_LIGHT0, GL_POSITION, light0_position);/設(shè)置光源位置。glEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glEnable(GL_DEPTH_TEST);glClearColor(1.0f,

22、 1.0f, 1.0f, 1.0f);return TRUE; / 初始化成功。下面的代碼完成繪制網(wǎng)格線void drawPlane()glColor3f(1.0f, 1.0f, 1.0f);for (float u = -8.0; u = 8.0; u += 0.5f)glBegin(GL_LINES);glVertex3f(-8, 0, u);glVertex3f(8, 0, u);glVertex3f(u, 0, -8);glVertex3f(u, 0, 8);glEnd();void MyDisPlay(void)glPushMatrix();glRotatef(30, 9.0, -6

23、.0, 0.0);drawPlane(); /繪制網(wǎng)格。glPopMatrix();glTranslated(3.0f, -1.0f, 2.0f);glutSolidSphere(1.0f, 20, 20);/繪制球體。glPopMatrix();glTranslated(3.0f, 0.5f, 0.0f);glutSolidTeapot(1.0);/繪制茶壺。glPopMatrix();glTranslated(-2.5f, 1.5f,-7.0f);glRotatef(60, -1.0, 0.0, 0.0);glutSolidCone(1.0f, 3.0f, 99, 1);/繪制圓錐。glP

24、opMatrix();glDisable(GL_COLOR_MATERIAL);glPopMatrix();glFlush();繪制6面體,并響應(yīng)鼠標(biāo)的拖動旋轉(zhuǎn)void DrawGLScene(GLvoid) / 這里做所有的繪畫。glClearColor(0.0, 0.0, 255.0, 0.0);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); / 清除屏幕和深度緩沖區(qū)。glLoadIdentity(); glTranslatef(-3.0f,1.0f,-8.0f); /將場景向里面平移5個單位glRotatef(xrot,1.0f,0

25、.0f,0.0f); /沿x軸旋轉(zhuǎn)glRotatef(yrot,0.0f,1.0f,0.0f); /沿y軸旋轉(zhuǎn)/繪制6面體并分別進(jìn)行紋理綁定/前面。glBindTexture(GL_TEXTURE_2D, texture0); glBegin(GL_QUADS);glNormal3f( 0.0f, 0.0f, 1.0f);glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);glTexCoord2f(1.0f, 1.0f)

26、; glVertex3f( 1.0f, 1.0f, 1.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);glEnd(); / 后面。glBindTexture(GL_TEXTURE_2D, texture1);glBegin(GL_QUADS);glNormal3f( 0.0f, 0.0f,-1.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.

27、0f);glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);glEnd();/上面。glBindTexture(GL_TEXTURE_2D, texture2);glBegin(GL_QUADS);glNormal3f( 0.0f, 1.0f, 0.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);glTexCoord2f(0.0f, 0.0f);

28、 glVertex3f(-1.0f, 1.0f, 1.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);glEnd();/ 下面,glBindTexture(GL_TEXTURE_2D, texture3);glBegin(GL_QUADS);glNormal3f( 0.0f,-1.0f, 0.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f

29、);glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);glEnd();/ 右面。glBindTexture(GL_TEXTURE_2D, texture4);glBegin(GL_QUADS);glNormal3f( 1.0f, 0.0f, 0.0f);glTexCoord2f(1.0f, 0.0f);

30、glVertex3f( 1.0f, -1.0f, -1.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);glEnd();/ 左面。glBindTexture(GL_TEXTURE_2D, texture5);glBegin(GL_QUADS);glNormal3f(-1.0f, 0.0f, 0.0f

31、);glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);glEnd();MyDisPlay(); /xrot+=xspeed; /yrot+=yspeed; glutSwapBuffers();處理鼠標(biāo)按下事件void processMouse(int button, int state, int x, int y) /鼠標(biāo)左鍵按下 if (button = GLUT_LEFT_BUTTON & state=GLUT_DOWN)int xPos,yPos;xPos = x; yPos = y;LastXPos = xPos;LastYPos = yPos;IsLBDown = TRUE;/鼠標(biāo)左鍵彈起if(button = GLUT_LEFT_BUTTON & state=GLUT_UP)IsLBDown = FALSE;/處理鼠標(biāo)拖動事件void

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論