Viewing 靜宜大學資工系 蔡奇偉 副教授 2003-2005.

Slides:



Advertisements
Similar presentations
素问 太阴阳明论 医学院 中医系 教师: 郭煜晖. 题 解 本篇讨论了足太阴脾、足阳明胃的生理功能、 病理变化,以及脾胃的相互关系。 故名: “ 太阴阳明论 ” 。
Advertisements

周围型肺癌 CT 征象 分 析 攀钢密地医院放射科. 周围型肺癌: 系指发生于段及 段支气管以远的肺癌,约占原发性 支气管肺癌的 1/4 ,以腺癌多见。 其发病主要和以下因素有关:吸烟、 职业致癌因子、空气污染、电离辐 射、饮食与营养等。值得注意的是, 美国癌症学会将结核列为肺癌发病 因素之一。尤其是结核瘢痕者,男.
结合实际解读藏獒标准 中国畜牧业协会犬业分会副主任 —— 张晓峰. 行业流行语 它的超群毛量震惊世人,高耸的头峰、丰密的 被毛、饱满的臀部饰毛以及飘逸的腿部绯毛皆 展露绝难匹敌的品质,骨量亦是不俗,一见难 忘,感受视觉上的无限震撼! 它拥有一副业界罕见的绝佳头版,方正之余又 不失圆浑饱满,超低的发毛点仿若起于那短方.
腹部损伤病人的护理.
自傳 82410陳信宏.
第1单元 操作系统概论 第一节 绪论 操作系统定义.
不治已病治未病 宋汉秋 焦作市中医院.
分解纤维素的微生物的分离.
肝损伤 中国医科大学附属盛京医院 林 艳.
针刀医学移位性颈椎病 的X线诊断 浙江省仙居县中医院 柴晓峰.
河南理工大学 计算机学院 徐文鹏 教学博客 Opengl.cnblogs.com
類別圖 方塊 (bricks) 背景 (bg) 技能 (skill) 位置 圖片 產生 移動 掉落 位置 圖片 儲存 消除 畫出 規則 效果
Canvas繪圖 Canvas簡介 2D繪圖工具 移動、選轉、縮放.
第 10 章 Linux的图形编程.
计算机图形学 授课教师:陈荣钦 短号: 单位:数信学院.
升學應選擇符合自己性向、興趣或能力的學校就 讀,有五專、高職、高中、綜合高中或進修學校, 可要多花些時間了解一下哦!
计算机图形学 讲 授:董兰芳 研究方向:科学计算可视化 图形、图像处理 模式识别 中国科学技术大学 视觉计算与可视化实验室
OpenGL常见问题.
OpenGL (7) 靜宜大學資工系 蔡奇偉 副教授
第二十四單元 柱面與球面座標.
Chapter 10 Three-Dimensional Viewing (三维观察)
OpenGL使用简介.
C語言簡介 日期 : 2018/12/2.
類別(class) 類別class與物件object.
(Machine Axes and Coordinate Systems)
Methods 靜宜大學資工系 蔡奇偉副教授 ©2011.
5-8 光遮斷器控制實習.
Visual Basic 物件導向程式設計簡介.
纹理映射.
Introduction to OpenGL (2)
PROGRAM 6 Earth E. Angel.
幾何變換 Geometry Transformations
Java 程式設計 講師:FrankLin.
JAVA 程式設計與資料結構 第四章 陣列、字串與數學物件.
第6章 图形几何变换.
Chap3 Linked List 鏈結串列.
網路安全技術 OSI七層 學生:A 郭瀝婷 指導教授:梁明章.
SDL – 1 簡介 靜宜大學資訊工程系 蔡奇偉副教授 ©
Chapter 5 Attributes of Output Primitives (图元的属性)
Module - pyopengl 應用於2d,3d圖形繪製.
OpenGL几何变换程序.
挑戰C++程式語言 ──第8章 進一步談字元與字串
3D Game Programming Projection
向量 (vector) 就是典型的一維陣列,而更高維的矩陣,例如矩陣 (matrix) 和張量 (tensor) 則分別是二維和三維的陣列。
Class & Object 靜宜大學資工系 蔡奇偉副教授 ©2011.
C qsort.
GLUT 事件處理函式 靜宜大學資管系 蔡奇偉 副教授
Video 影像 (VideoPlayer 影像播放器、Camcorder 錄影機) 靜宜大學資管系 楊子青
本节内容 引用类型 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
MiRanda Java Interface v1.0的使用方法
PROGRAM 7 SQUARE E. Angel.
陣列與結構.
OpenGL 基础 计算机科学与技术系.
OpenGL渲染管道与投影变换.
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
挑戰C++程式語言 ──第9章 函數.
第三章 正投影 3-2 正投影練習 3-2-1 前視圖 圖3-10 正投影三視圖.
Ch03 Layout.
坐標 →配合課本 P49~56 重點 在坐標平面上,以 ( m , n ) 表示 P 點的坐標,記為 P ( m , n ),m 為 P 點的 x 坐標,n 為 P 點的 y 坐標。 16.
1757: Secret Chamber at Mount Rushmore
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
小畫家教學 電子版儲存於 學校網頁/學科資訊/電腦科
What is “this”? 在物件導向程式設計中,類別的定義就是在說明如果創建了“這個物件”的話,它會具有那些屬性與功能,以及這些功能是如何實現的。 而所謂的“這個物件”就以 this 來表示。 當我們在JavaScript與jQuery中寫 script 程式(函式)時,“誰”呼叫這個函式,這個“誰”就是該函式中所謂的.
3D Game Programming Geometric Transformations
PROGRAM 1 Simple E. Angel, Interactive Computer Graphics A Top-Down Approach with OpenGL, Third Edition Addison-Wesley Longman, 2003.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
NFC (近場通訊, Near Field Communication) 靜宜大學資管系 楊子青
SQLite資料庫 靜宜大學資管系 楊子青.
C語言程式設計 老師:謝孟諺 助教:楊斯竣.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
Presentation transcript:

Viewing 靜宜大學資工系 蔡奇偉 副教授 2003-2005

大綱 簡介 端點座標的轉換

簡介 底下我們比較用 OpenGL 程式產生場景畫面和用相機拍照的過程: 相機 OpenGL 1. 選定相機位置和拍攝的角度 viewing transformation 2. 安排場景中物件的位置 modeling transformation 3. 選擇鏡頭或調整縮放度 projection transformation 4. 決定沖印的尺吋 viewport transformation

端點座標的轉換

Model/View Transformation 由於相機和物件的座標變換是彼此相對的,譬如:物件固定不動而相機往左移 10 單位等同於相機不動而物件往右移 10 單位,所以 OpenGL 把兩者合併在一起,稱為 Model/View Transformation。 由於 OpenGL 使用矩陣堆疊,因此我們應該按照下列順序來安排程式碼: 設定相機的位置、角度、與拍攝方向。 物件的座標變換,如平移、旋轉、或放大縮小。 建立物件模型(用物件座標系統) 經過這一道座標變換我們得到物件在相機座標系統下的座標,稱之為 eye coordinates。

Projection Transformation 若指定了剪裁面(clipping planes),OpenGL 先截除掉落在剪裁面以外的物件部分,然後再實施透視(perspective)投影或正交(orthogonal)投影的轉換。此外,落在視體( viewing volume)之外的物件部分也會自動地被截除。 經過這一道轉換所得的座標稱為 clip coordinates。

Perspective division 這一個階段把 clip coordinate 的齊次座標 (x, y, z, w) 改成三維座標 (x/w, y/w, z/w),稱之為 normalized device coordinates(正規化裝置座標)。

Viewport Transformation 所謂 viewport(視埠)是指視窗上的一塊矩形區域。透過 viewport transformation,normalized device coordinates 被轉換成視窗座標。 你可以設定 viewpot 的原點位置、寬度、和高度。調整寬和高之間的比例可以產生放大、縮小、壓扁、拉長的效果。

範例 /* * cube.c * This program demonstrates a single modeling transformation, * glScalef() and a single viewing transformation, gluLookAt(). * A wireframe cube is rendered. */ #include <GL/glut.h> void init(void) { glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT); }

up 方向 注視點的座標 相機位置的座標 void display(void) { glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); glLoadIdentity (); /* clear the matrix */ /* viewing transformation */ gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); /* modeling transformation */ glScalef (1.0, 2.0, 1.0); /* model */ glutWireCube (1.0); glFlush (); } up 方向 注視點的座標 相機位置的座標

void reshape (int w, int h) { glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity ();  /* perspective projection */ glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0); glMatrixMode (GL_MODELVIEW); }

int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowSize (500, 500); glutInitWindowPosition (100, 100); glutCreateWindow (argv[0]); init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0; }

OpenGL 相關的函式 矩陣類別 通用的矩陣函式 簡易的幾何變換函式 gluLookAt() 投影變換函式 glViewport glLoadIdentity ()、 glLoadMatrix{fd} () glMultMatrix{fd} () glPushMatrix() glPopMatrix() 簡易的幾何變換函式 glTranslate{fd} () glRotate{fd} () glScale{fd} () gluLookAt() 投影變換函式 透視投影:glFrustum() & gluPerspective() 正交投影:glOrtho() glViewport

矩陣類別 OpenGL 有三個矩陣堆疊,這些堆疊用來處理不同的操作模式。所以在操作矩陣之前,你必須使用 glMatrixMode() 函式來選取矩陣堆疊。 void glMatrixMode (Glenum mode) 參數 mode 可為下列的常數: GL_MODELVIEW: 矩陣操作應用在「模形和攝相」堆疊上。 GL_PROJECTION : 矩陣操作應用在「投影」堆疊上。 GL_TEXTURE : 矩陣操作應用在「紋理」堆疊上。

矩陣堆疊 C 矩陣堆疊最上面的矩陣稱為「目前矩陣(current matrix)」。 current matrix top C 目前矩陣是目前的幾何變換,會自動地應用在端點上,即端點 v 變成 Cv。

清除目前矩陣 void glLoadIdentity (void) 把目前矩陣設成 44 的單位矩陣 top C I top

C M void glLoadMatrix{fd} (Type *m) 把目前矩陣設成參數 m 所指定的 44 矩陣。通常 m 是 16 個元素的陣列:[m1, m2, …, m16],代表底下的 44 矩陣: top C top M

對 C/C++ 二維陣列 m[4][4] 而言,元素 m[i][j] 相當於上述矩陣的第 i 行和第 j 列,這樣的儲存順序並不同於 OpenGL 矩陣的元素順序。因此,我們最好用一維陣列 m[16] 而不用二維陣列 m[4][4] 來儲存 OpenGL 矩陣,以避免混淆或錯誤。

C CM void glMultMatrix{fd} (Type *m) 參數 m 是一個有 16 個元素的陣列代表 44 矩陣。若目前矩陣是 C 和 m 代表矩陣 M,則此函式把目前矩陣改成矩陣的乘積 CM。 top C top CM

C C C void glPushMatrix (void) 把矩陣堆疊最上層的矩陣往下推一層,並拷貝其值至新的最上層矩陣。這個函式通常用來儲存目前矩陣。 top C top C C

void glPopMatrix (void) 移除矩陣堆疊最上層的矩陣。這個函式通常用來恢復之前的目前矩陣。 C top C top

glPushMatrix() 和 glPopMatrix() 通常用來把定義在物件座標系統下的物件,轉換至世界座標系統中。 在右邊的程式碼中,我們用 glPushMatrix() 來儲存目前矩陣之後,呼叫 OpenGL 的幾何轉換函式來設定物件在世界座標系統中的位置、方向,與大小。DrawObject() 函式則是在物件座標系統中繪製物件。最後,我們用glPopMatrix() 恢復原來的目前矩陣。 glPushMatrix(); glTranslated(…); glRotated(…); glScaled(…); DrawObject(); glPopMatrix();

C CT void glTranslate{fd} (Type x, Type y, Type z) 把目前矩陣乘上平移矩陣 T(x, y, z)。 top C top CT

void glRotate{fd} (Type , Type x, Type y, Type z) 參數  是旋轉角度,參數 (x, y, z) 用來指定旋轉軸的方向,通常 (x, y, z) 是單位向量(即長度為 1)。 繞 x 軸  度: x y z  (x,y,z) glRotate{fd} (, 1.0, 0.0, 0.0) 繞 y 軸  度: glRotate{fd} (, 0.0, 1.0, 0.0) 繞 z 軸  度: glRotate{fd} (, 0.0, 0.0, 1.0)

C CS void glScale{fd} (Type x, Type y, Type z) 參數 x, y, 和 z 是在三個座標軸方向的放大或縮小的比例。此函式把目前矩陣乘上矩陣 S(x, y, z), top C top CS

void gluLookAT ( /* 相機位置 */ GLdouble eyex, GLdouble eyey, GLdouble eyez, /* 注視點位置 */ GLdouble cx, GLdouble cy, GLdouble cz, /* 相機朝上的方向 */ GLdouble upx, GLdouble upy, GLdouble upz, )

GLdouble left, GLdouble right, GLdouble bottom, void glFrustum ( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far ) 呈像面

GLdouble fovy, GLdouble aspect, GLdouble near, GLdouble far ) void gluPerspective ( GLdouble fovy, GLdouble aspect, GLdouble near, GLdouble far ) fovy: yz 平面上的視角。

void glOrtho ( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far )

GLint x, GLint y, GLsizei width, GLsizei height ) void glViewport ( GLint x, GLint y, GLsizei width, GLsizei height ) 視窗 (x, y) width height (0, 0)

viewport 的縮放效果