コンピュータグラフィックス2

1.OpenGLによる3次元グラフィックス (〜12月)

2.VRML(Vitual Reality Modeling Language)について (1月)

 
評価方法:出席,課題提出(3回程度を予定)
参考書:
 OpenGL Architecture Review Board,Jackie Neider, Tom Davis, Mason Woo,
        "OpenGL Programming Guide Second Edition", Addison-Wesley Developers Press, 1997.$46.95
  OpenGL Architecture Review Board,Jackie Neider, Tom Davis, Mason Woo,
      "OpenGL Programming Guide Release1", Addison-Wesley Developers Press, 1993.$34.95
 OpenGL Architecture Review Board,Jackie Neider, Tom Davis, Mason Woo,
      "OpenGL Programming Guide Release1", Addison-Wesley Developers Press, 1993.(日本語版11000円)
  クレイトン・ウォルナム著・松田晃一訳:Win32OpenGLプログラミング,プレンティスホール,1996.
 河西朝雄,河西雄一:VRML2.0,ナツメ社,1998.1600円+税
 ローラ・リメイ+ケリー・マードック,ジャスティン・コーチ著・松田晃一他訳:
  3DグラフィックスとVRML2.0,プレンティスホール,1998,4200円.

参考となるURL
 http://www.opengl.org
  http:http://tech.webcity.ne.jp/~andoh/
 
 

VisualBasicからOpenGLの利用

1.OpenGLとは何か

 アメリカにはシリコングラフィックスというコンピュータグラフィックス専門のワークステーションを開発している会社があります.任天堂の64ビットのファミコンの開発にも関わっているので,知っている人もいるかと思います.
シリコングラフィックスの機械は,1990年代前半のCGブームを支えてきました.またバーチャルリアリティなどの技術もシリコングラフィックス無くしてできなかったとも言えます.
 
 シリコングラフィックス社は,グラフィックス環境をサポートするためのライブラリとして,GLというライブラリを開発してきました.これを発展させ,その仕様を公開することによって,ソフトウェアとしてのグラフィックス技術を広めようとしました.これがOpenGLです.OpenGLの公開は1992年から1993年の頃だったと思います.(私はそれ以前のGLをちょっとだけ勉強しましたが...)
 
 このOpenGLに目をつけたマイクロソフトは,自社のOS上でOpenGLをサポートすることにしました(1995年から1996年頃).これによって,それまでシリコングラフィックス社の機械でしか動かなかったソフトウェアのWindowsあるいはWindowsNTへの移植が一気に加速しました.昨今では,WindowsNT上でCGを扱うプロも多くなったようです.
 OpenGLライブラリさえあれば,ノートパソコンでさえ,シリコングラフィックスと同様の機能を有することが可能になります.透視投影変換はもちろん,シェーディング,テクスチャマッピング,フォグなどさまざまな機能が容易に実現できます.

 逆にシリコングラフィックスはOpenGLを公開したばかりに,自社製品の販売力を失うというジレンマにあっています.しかしながら,昨今ではソフトウェア指向を強めており,既にマイクロソフト社と提携して次世代のグラフィックスライブラリ(Fahrenheitと呼ばれる)の開発を行なっています.また,これまでのUnixベースの機械から,今夏にはNTをOSとした機械を売り出すようです.

 コンピュータグラフィックスの授業では,シリコングラフィックス社の開発したOpenGLをVBから稼動することにより,3次元グラフィックスを習得してもらおうかと考えています.またVRMLなどの技術もシリコングラフィックス社が主導していることから,OpenGLさえ理解できれば,VRMLの構築も容易に行なえるのではと思います.
(VBとOpenGLとのリンクに関しては国内では参考となる書籍は存在しません.OpenGL自体についても,日本国内では参考書も数冊の難解な訳本が高額で売られている状況です.)

 なお,マイクロソフトはもうひとつグラフィックスライブラリとして,DirectXというライブラリを持っていますが,これはゲーム開発が主たる目的です.より高度なコンピュータグラフィックス(例えば科学技術分野やプロ用のCGソフトウェア)には,OpenGLが用いられています.

    別添資料参照.

    なお,OpenGLはSiliconGraphics社の登録商標です.
 

2.Windows95上でOpenGLを使うためには

以下のファイルが,C:\Windows\Systemの下にある必要がある.
 opengl32.dll
    Windows95のバージョンが, 4.00.950B以降のものであれば,標準で添付されている.
  (コントロールパネル>>システム>>情報で確認してみる)
  注)なお,opengl32.dllには,Silicon Graphics Inc.(以下SGIと記す)
    が開発した"Cosmo"OpenGLもある(高速化が図られている.)

 OpenGL関連ライブラリ
 Windows上では以下のライブラリファイルがフリーウェアとして提供されている.
   glu32.dll  (OpenGL Utility Library)
   ユーティリテイ(視界の方向,射影,レンダリング用の行列設定等を行う) 
   (接頭子:glu)
   glut32.dll  (OpenGL Programming Guide Auxiliary Library)
   ProgrammingGuide用に作成されたライブラリ(基本的な図形の描画などを容易に行うことができる)
   (接頭子:glut,ProgramingGuide上でのglauxと同じ)

3.VisualBasic上でOpenGLを使う

1)コントロール(OCX, を用いる方法

  例)
       TGS社:V3Space Control 2.0 version
   Softoholic ActiveX Control
      (シェアウェア,ただし学生は無料(レジスタは必要),http://www.softoholic.bc.ca/opengl/)

2)TypeLibraryを用いる方法

    いくつかのTypeLibraryがフリーウェアで提供されている.
  例)
   vbogl.tlb  (http://www.hk.super.net/~edx/)

 ここでは,2)TypeLibraryによる方法を用いる(OpenGLの文法等を理解しやすいため)
 そのため,パソコン上に vbogl.tlbをインストールする必要がある.


 

4.OpenGLの設定

1)必要ファイルのインストール

  http://www.sp.myu.ac.jp/~makanae/opengl/(学内)
  http://www.myu.ac.jp/opengl/ (学外)
 より以下のファイルを入手し,c:\windows\systemの中に保存する.
    opengl32.dll  (windows95 4.00.950B以降は不要)
    glu32.dll
    glut32.dll
    vbogl.tlb
 保存したら,再起動する.

2)VisualBasicでの設定方法

 a)VisualBasicを起動する.
 b)プロジェクト>>参照設定>>参照 で,C:\Windows\Systemの下のvbogl.tlbを選択し,OK.
 c)参照可能なライブラリファイルとして,VB OpenGLAPI 1.2 (ANSI)が表示され,チェックが入って
  いればOK

 (注意)新規にプログラムを作成する場合には,プロジェクト>>参照設定で,
      VB OpenGL API 1.2を選択(チェック)する必要がある.

3)インストールの確認

  http://www.sp.myu.ac.jp/~makanae/opengl/(学内)
  http://www.myu.ac.jp/opengl/ (学外)
  より,smallest.vbp及びsmallest.frmをダウンロードし,VisualBasicで読み込み実行してみる.

4)OpenGLを用いたプログラムの例

    http://www.sp.myu.ac.jp/~makanae/opengl/または
    http://www.myu.ac.jp/makanae/opengl/内の
    robotcar.vbp及びrobot.frm

4.OpenGLプログラムの例(smallest.vbp及びsmallest.frm)

  OpenGLに関する命令はすべて gl を接頭子としてもつ.

     'Form上にPicture1を貼る.
 

Dim m_hGLRC As Long
Private Type Axis
    x As Double
    y As Double
    z As Double
End Type

Dim tr As Axis
Dim rot As Axis
Dim sc As Axis

Private Sub Form_Initialize()
    Initialize
End Sub
 

Private Function Initialize() As Boolean
    Dim pfd As PIXELFORMATDESCRIPTOR
    Dim R As Long
    Picture1.ScaleMode = vbPixels


    'set standard parameters
    pfd.nSize = Len(pfd)
    pfd.nVersion = 1
    pfd.dwFlags = PFD_SUPPORT_OPENGL Or PFD_DRAW_TO_WINDOW Or PFD_DOUBLEBUFFER Or PFD_TYPE_RGBA
    pfd.iPixelType = PFD_TYPE_RGBA
    pfd.cColorBits = 24
    pfd.cDepthBits = 16
    pfd.iLayerType = PFD_MAIN_PLANE


    R = ChoosePixelFormat(Picture1.hDC, pfd)
    If R = 0 Then
        MsgBox "ChoosePixelFormat failed"
        Exit Function
    End If
    R = SetPixelFormat(Picture1.hDC, R, pfd)

    m_hGLRC = wglCreateContext(Picture1.hDC)
    wglMakeCurrent Picture1.hDC, m_hGLRC
    Initialize = True
End Function

Private Sub Form_Paint()
    ViewSet 50, Picture1.ScaleHeight / Picture1.ScaleWidth, 1, 100
End Sub

Private Sub Form_Unload(Cancel As Integer)
    If m_hGLRC <> 0 Then
        wglMakeCurrent 0, 0
        wglDeleteContext m_hGLRC
    End If
    End
End Sub

Private Sub ViewSet(fov As Single, aspect As Single, near As Single, far As Single)
    glMatrixMode mmProjection
    glLoadIdentity
    gluPerspective fov, aspect, near, far
    glMatrixMode mmModelView
    glLoadIdentity
    glViewport 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight
End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
    Static old As Axis
    If Button = vbLeftButton Then
        rot.x = rot.x + (y - old.y)
        rot.y = rot.y + (x - old.x)
        Draw
    End If
    old.x = x: old.y = y

End Sub

Private Sub Picture1_Paint()
    Draw
End Sub

Private Sub Draw()
    glClear clrColorBufferBit
    glColor3f 1#, 1#, 1#
    glLoadIdentity
    glTranslatef 0#, 0#, -5#
    glRotatef rot.y, 0, 1, 0
    glRotatef rot.x, 1, 0, 0
    glScalef 1#, 1#, 1#
    glutWireCube 1#
    glFlush
End Sub