天天看點

OpenCASCADE Coordinate Transforms

<a href="mailto:[email protected]">[email protected]</a>

Abstract. The purpose of the OpenGL graphics processing pipeline is to convert 3D descriptions of objects into a 2D image that can be displayed. In many ways, this process is similar to using a camera to convert a real-world scene into a 2D print. To accomplish the transformation from 3D to 2D, OpenGL defines several coordinate spaces and transformations between those spaces. Each coordinate space has some properties that make it useful for some part of the rendering process. The transformations defined by OpenGL afford applications a great deal of flexiblity in defining 3D-to-2D mapping. So understanding the various transformations and coordinate spaces used by OpenGL is essential. The blog use GLUT to demenstrate the conversion between 3D and 2D point.

Key Words. OpenCASCADE, OpenGL, Coordinate Transform,

1. Introduction

互動式計算機圖形學的迅速發展令人興奮,其廣泛的應用使科學、藝術、工程、商務、工業、醫藥、政府、娛樂、廣告、教學、教育訓練和家庭等各方面均獲得巨大收益。與圖形互動的方式目前主要還是鍵盤和滑鼠或pad上的觸摸方式。互動的方式主要分為兩種,一是在二維的螢幕或視窗上對三維的模型進行控制;一是對三維視圖進行控制(在OpenSceneGraph中對應拖拽器和漫遊器)。這就需要對計算機圖形學中的坐标變換的原理有所了解。

三維場景視圖的計算機生成步驟有點類似拍一張照片的過程,但與使用照相機相比,利用圖形軟體生成的場景視圖有更大靈活性和更多的選擇。我們可以選擇平行投影或透視投影,還可以有選擇地沿視線消除一些場景等。

通過從三維模型到二維螢幕視窗的實作過程了解,友善了解計算機中對場景觀察的實作。場景的觀察即注重一個從三維世界轉換到二維螢幕的過程。假設場景的觀察者使用一台相機來全程記錄世界的變化,那麼相機位置的移動、角度偏轉、焦距變化及鏡頭類型的選用都會改變底片上呈現的内容,也就是觀察這個世界的方式。

通過從二維螢幕到三維場景中實作的了解,友善使用者通過二維的螢幕視窗的程式界面來操縱三維世界中的模型,如三維中模型的選擇及對選擇中的模型進行相關的變換,如移動、旋轉等。

本文結合OpenCASCADE中的類Graphic3d_Camera及GLUT來說明這兩個過程,進而對OpenCASCADE中可視化子產品的了解。通過對OpenGL中坐标變換原理的了解,為OpenCASCADE中對視圖的操作及拓樸模型(點、線、面和體)選擇的實作的了解打下基礎,良好的互動可以讓場景中的模型充滿生機。

2.From 3D to 2D

從三維的模型到二維螢幕,OpenGL的渲染管線分為以下幾個部分:

v 模型視點變換MODELVIEW TRANSFORMATION;

v 投影變換PROJECTION TRANSFORMATION;

v 視口變換VIEWPORT TRANSFORMATION;

OpenCASCADE Coordinate Transforms

Figure 2.1 OpenGL Vertex Transformation Pipeline

如上圖所示為從模型坐标系到裝置坐标系變換的管線,即模型經過這些變換後,最終才能顯示在裝置螢幕上。

OpenCASCADE Coordinate Transforms

Figure 2.2 Stages of Vertex Transformation(OpenGL Programming Guide)

在OpenGL中每個變換都對應了一個矩陣運算,如對模型視點的變換對應了模型視點矩陣,可以通過glMatrixMode(GL_MODELVIEW)來指定義目前的矩陣模式,再通過glLoadMatrix來指定這個變換矩陣。同理,對應投影變換的相關函數為glMatrixMode(GL_PROJECTION)。

OpenCASCADE Coordinate Transforms

Figure 2.3 The vertex transformation pipeline(OpenGL SuperBible)

2.1 模型視點變換Model-View Transformation

模型視點變換相當于調整要拍攝的物體的位置、姿态及調整相機使其對準景物的過程,前者稱為模型變換,後者稱為視點變換。在OpenGL中,模型變換和視點變換的結果被合并為模型視點變換矩陣(Model-View Matrix)。在繪制物體前可以使用glTranslate, glRotate等來實作模型的位置、姿态變換。與模型變換對應,我們還可以采用視點變換改變觀察點的位置和方向,即改變相機的位置和拍攝角度,進而改變最終拍攝的結果。可以将視點變換的行為視作模型變換的逆操作,如将相機在X方向移動N米,就相當于将整個場景在-X方向移動了N米。

經過模型視點變換後,即可認為場景從世界坐标系(World Coordinate System, WCS)轉換到了相機坐标系(Viewing Coordinate System, VCS)。對于世界坐标系中任意向量Vwcs将其變換到相機坐标系的公式為:

OpenCASCADE Coordinate Transforms

在VCS坐标系中,習慣用n,u,v三個分量來表示坐标基向量,如下圖所示為從世界坐标系變換到視點坐标系的變換:

OpenCASCADE Coordinate Transforms

Figure 2.4 From World Cooridante System to Viewing Coordinate System

其中模型視點變換矩陣内容如下所示:

OpenCASCADE Coordinate Transforms

2.2 投影變換Projection Transformation

投影變換相當于拍照時通過選擇鏡頭和調整焦距,将景物投射到二維底片的過程。主要操作對象是一個立方體或棱台形狀的視景體。在視景體之外的對象将被裁剪,因而不會投影到二維面上。

立方體的視景體稱為平行投影視景體,通過使用glOrtho()函數建立,其結果是生成一個正射投影矩陣,如下圖所示:

OpenCASCADE Coordinate Transforms

Figure 2.5 Orthographic Viewing Volume(OpenGL Programming Guide)

OpenCASCADE Coordinate Transforms

Figure 2.6 Orthogonal Projection View Volume to Normalized View Volume

由于螢幕坐标系經常指定為左手系,是以規範化觀察體也常指定為左手系統。正投影觀察體的規範化變換矩陣是:詳細推導請參考《Computer Graphics with OpenGL》。

OpenCASCADE Coordinate Transforms
OpenCASCADE Coordinate Transforms

Figure 2.7 Perspective Viewing Volume Specifiedc by glFrustum

一般的透視投影規範化變換矩陣如下所示:詳細推導請參考《Computer Graphics with OpenGL》。

OpenCASCADE Coordinate Transforms

相機坐标系的向量Vvcs變換到投影坐标系下(Clipping Coordinate System, CCS)的計算公式為:

OpenCASCADE Coordinate Transforms

2.3 視口變換 Viewport Transformation

這一步的意義是将投影變換得到的結果反映到指定的螢幕視窗上去,有點類似将底片沖洗到照片上。如果照片的大小與底片不相符,那麼将可能産生成像的放大或縮小。OpenGL中函數glViewport()指定了視口變換的結果區域。這一變換的同時還意味着場景最終變換到視窗坐标系(Device Coordinate System, DCS,又稱為裝置坐标系)。

OpenCASCADE Coordinate Transforms

Figure 2.8 Mapping the Viewing Volume to the Viewport

從規範化的視景體到螢幕坐标系的變換矩陣是:

OpenCASCADE Coordinate Transforms
OpenCASCADE Coordinate Transforms

這三個矩陣可以合并為一個,稱為MVPW矩陣,它決定了任意三維空間中的對象在二維螢幕上表達時的變換過程。

3.From 2D to 3D

在了解OpenGL的整個渲染管線後,再來了解将螢幕上一點轉換為世界坐标就比較容易了。從圖形渲染管線的開始到結束,一個模型坐标系中的坐标被變換到了螢幕坐标,那麼現在把整個過程倒過來的話,螢幕上一個二維點坐标也可轉換到世界坐标系中。即将MVPW矩陣求逆即可。如下圖所示為從螢幕坐标到世界坐标的變換過程:

OpenCASCADE Coordinate Transforms

Figure 3.1 Viewport cooridnate to World Coordinate(By Zhangci)

當了解從螢幕坐标變換到世界坐标後,也就可以友善了解Picking技術的實作了。即可以通過在二維的螢幕視窗中來選擇拓樸形狀的點、線和面等模型了。可以通過滑鼠直接拾取模型後,就可以友善地對模型的位置角度等進行編輯,如OpenSceneGraph中的Dragger:

OpenCASCADE Coordinate Transforms

Figure 3.2 OpenSceneGraph TranslateAxisDragger

如上圖所示,用滑鼠在任意一個軸上進行拖拽即可以對三維模型的位置進行編輯。

4.Code Example

結合OpenCASCADE的類Graphic3d_Camera和GLUT可以友善來驗證OpenGL中的坐标變換過程。其中類Graphic3d_Camera已經實作從世界坐标系到規範坐标系的變換,但還需要從規範坐标系到螢幕視窗變換的矩陣,根據計算公式實作如下代碼所示:

void BuildNorm2ViewportMatrix(GLsizei theWidth, GLsizei theHeight)

{

    // row 0

    theNorm2Viewport.ChangeValue(0, 0) = (theWidth - 0) / 2.0;

    theNorm2Viewport.ChangeValue(0, 1) = 0.0;

    theNorm2Viewport.ChangeValue(0, 2) = 0.0;

    theNorm2Viewport.ChangeValue(0, 3) = (0 + theWidth) / 2.0;

    // row 1

    theNorm2Viewport.ChangeValue(1, 0) = 0.0;

    theNorm2Viewport.ChangeValue(1, 1) = (0 - theHeight) / 2.0;

    theNorm2Viewport.ChangeValue(1, 2) = 0.0;

    theNorm2Viewport.ChangeValue(1, 3) = (theHeight + 0) / 2.0;

    // row 2

    theNorm2Viewport.ChangeValue(2, 0) = 0.0;

    theNorm2Viewport.ChangeValue(2, 1) = 0.0;

    theNorm2Viewport.ChangeValue(2, 2) = 0.5;

    theNorm2Viewport.ChangeValue(2, 3) = 0.5;

    // row 3

    theNorm2Viewport.ChangeValue(3, 0) = 0.0;

    theNorm2Viewport.ChangeValue(3, 1) = 0.0;

    theNorm2Viewport.ChangeValue(3, 2) = 0.0;

    theNorm2Viewport.ChangeValue(3, 3) = 1.0;

}

當用滑鼠點選直線的起點時,可以得到相應的螢幕坐标及世界坐标,如下圖所示:

OpenCASCADE Coordinate Transforms

Figure 4.1 Test Coordinate Transformation

其中世界坐标系中的坐标為坐标原點(0,0,0),轉換到螢幕坐标為(150,150),與滑鼠拾取的點一緻。再将滑鼠拾取的點轉換到三維世界坐标也為原點,隻是深度值Z不同。

5.Conclusion

綜上所述,在OpenGL中世界坐标系中的模型經過模型視點變換、投影變換和視口變換最終得到了二維視窗中的顯示圖像。而這個逆過程即從螢幕坐标到三維世界坐标系的變換對互動更有意義,即拾取技術的實作。

結合OpenCASCADE中的類Graphic3d_Camera和GLUT來試驗了這些變換過程,為了解拓樸形狀點、線和面等的選擇互動的實作打下基礎,進一步了解Visualization子產品。

6. References

1. Dave Shreiner. OpenGL Programming Guide(7th Edition). Addison-Wesley. 2010

2. Richard S. Wright Jr., Benjamin Lipchak. OpenGL SuperBible. Sams. 2004

3. Randi J. Rost. OpenGL Shading Language(2nd Edition). Addison-Wesley. 2006

4. Donald Hearn, M. Pauline Baker. Computer Graphics with OpenGL. 2004

5. Zhangci. OpenGL Rendering Pipeline&amp;Coordinate Transformation.

<a href="http://blog.csdn.net/zhangci226/article/details/5314184">http://blog.csdn.net/zhangci226/article/details/5314184</a>

6. 王銳, 錢學雷. OpenSceneGraph三維渲染引擎設計與實踐. 清華大學出版社. 2009

繼續閱讀