エバリュエーターによる自由曲線・自由曲面

 

 

1.自由曲線・自由曲面 (配布資料参照)

 

2.エバリュエーターによる自由曲線


    'コントロールポイント配列 cp(xyz(x=0, y=0, z=0), Point Number)
    'Cの場合と配列要素の順序が逆になるので注意
   Dim cp(0 To 2, 0 To 4) As Single
    cp(0, 0) = -4: cp(1, 0) = -4: cp(2, 0) = 0#
    cp(0, 1) = -2: cp(1, 1) = 4: cp(2, 1) = 0#
    cp(0, 2) = 2: cp(1, 2) = -4: cp(2, 2) = 0#
    cp(0, 3) = 4: cp(1, 3) = 4: cp(2, 3) = 0#

    glMap1f GL_MAP1_VERTEX_3, 0#, 1#, 3, 4, cp(0, 0)
    glEnable GL_MAP1_VERTEX_3

    glBegin (GL_LINE_STRIP)
        For n = 0 To 30
            glEvalCoord1f (n / 30)
        Next
    glEnd
 

 
glMap1{fd} target, u1, u2, stride, order, *points
  target:制御点の意味
  GL_MAP1_VERTEX_3   x,y,z頂点の座標
  GL_MAP1_VERTEX_4   x,y,z,w頂点の座標
  GL_MAP1_INDEX        カラー指標
  GL_MAP1_COLOR4     R,G,B,A
  GL_MAP1_NORMAL    法線座標
  GL_MAP1_TEXTURE_COORD_1  sテクスチュア座標
  GL_MAP1_TEXTURE_COORD_2  s,tテクスチュア座標
  GL_MAP1_TEXTURE_COORD_3  s,t,rテクスチュア座標
  GL_MAP1_TEXTURE_COORD_4  s,t,r,qテクスチュア座標

  u1, u2:パラメータの範囲(通常0,1)
 stride:次の制御点までにいくつの値があるか.(次の制御点までのオフセット)
 order: スプラインの次数+1(3次スプラインの場合4)
 *points:制御点の配列(配列の0番目を渡す)

glEvalCoord1{fd} n
   1次元の写像の計算
   n:パラメータ

3.エバリュエーターによる自由曲面

1)ワイヤフレームモデル

      'cp(xyz (x=0, y=0, z=0), Point Number, Group Number)
        'Cの場合と配列要素の順序が逆になるので注意

        Dim cp(0 To 2, 0 To 3, 0 To 3) As Single
        cp(0, 0, 0) = -1.5: cp(1, 0, 0) = -1.5: cp(2, 0, 0) = 4#
        cp(0, 1, 0) = -0.5: cp(1, 1, 0) = -1.5: cp(2, 1, 0) = 2#
        cp(0, 2, 0) = 0.5: cp(1, 2, 0) = -1.5: cp(2, 2, 0) = -1#
        cp(0, 3, 0) = 1.5: cp(1, 3, 0) = -1.5: cp(2, 3, 0) = 2#

        cp(0, 0, 1) = -1.5: cp(1, 0, 1) = -0.5: cp(2, 0, 1) = 1#
        cp(0, 1, 1) = -0.5: cp(1, 1, 1) = -0.5: cp(2, 1, 1) = 3#
        cp(0, 2, 1) = 0.5: cp(1, 2, 1) = -0.5: cp(2, 2, 1) = 0#
        cp(0, 3, 1) = 1.5: cp(1, 3, 1) = -0.5: cp(2, 3, 1) = 1#

        cp(0, 0, 2) = -1.5: cp(1, 0, 2) = 0.5: cp(2, 0, 2) = 4#
        cp(0, 1, 2) = -0.5: cp(1, 1, 2) = 0.5: cp(2, 1, 2) = 0#
        cp(0, 2, 2) = 0.5: cp(1, 2, 2) = 0.5: cp(2, 2, 2) = 3#
        cp(0, 3, 2) = 1.5: cp(1, 3, 2) = 0.5: cp(2, 3, 2) = 4#

        cp(0, 0, 3) = -1.5: cp(1, 0, 3) = 1.5: cp(2, 0, 3) = -2#
        cp(0, 1, 3) = -0.5: cp(1, 1, 3) = 1.5: cp(2, 1, 3) = -2#
        cp(0, 2, 3) = 0.5: cp(1, 2, 3) = 1.5: cp(2, 2, 3) = 0#
        cp(0, 3, 3) = 1.5: cp(1, 3, 3) = 1.5: cp(2, 3, 3) = -1#

        glMap2f GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, cp(0, 0, 0)
        glEnable GL_MAP2_VERTEX_3
 

            Dim i  As Integer, j As Integer
            For j = 0 To 8   '8分割したメッシュを書く
                glBegin GL_LINE_STRIP
                    For i = 0 To 30
                        glEvalCoord2f  i / 30, j / 8
                    Next
                glEnd
                glBegin GL_LINE_STRIP
                    For i = 0 To 30
                        glEvalCoord2f  j / 8, i / 30
                    Next
                glEnd
            Next

 
glMap2{fd} target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, *points
  target:制御点の意味
  GL_MAP1_VERTEX_3   x,y,z頂点の座標
  GL_MAP1_VERTEX_4   x,y,z,w頂点の座標
  GL_MAP1_INDEX        カラー指標
  GL_MAP1_COLOR4     R,G,B,A
  GL_MAP1_NORMAL    法線座標
  GL_MAP1_TEXTURE_COORD_1  sテクスチュア座標
  GL_MAP1_TEXTURE_COORD_2  s,tテクスチュア座標
  GL_MAP1_TEXTURE_COORD_3  s,t,rテクスチュア座標
  GL_MAP1_TEXTURE_COORD_4  s,t,r,qテクスチュア座標

  u1, u2, v1, v2 :パラメータの範囲(通常0,1)
 ustride, vstride:次の制御点までにいくつの値があるか.
        (次の制御点までのオフセット)
 uorder, vorder: 制御点の数
 *points:制御点の配列(配列の0番目を渡す)

glEvalCoord2{fd} u, v
   2次元の写像の計算
   u,v:パラメータ

2)シェーディングモデル

       Dim MaterialAmbient(3) As Single
       Dim MaterialDiffuse(3) As Single
       Dim MaterialSpecular(3) As Single

    FillArray4f MaterialAmbient(), 0.1, 0.1, 0.1, 1
        FillArray4f MaterialDiffuse(), 0.4, 0.1, 0.1, 1!
        FillArray4f MaterialSpecular(), 0.5, 0.1, 0.1, 1!
        glMaterialfv GL_FRONT, GL_AMBIENT, MaterialAmbient(0)
        glMaterialfv GL_FRONT, GL_DIFFUSE, MaterialDiffuse(0)
        glMaterialfv GL_FRONT, GL_SPECULAR, MaterialSpecular(0)

        Dim cp(0 To 2, 0 To 3, 0 To 3) As Single
        cp(0, 0, 0) = -1.5: cp(1, 0, 0) = -1.5: cp(2, 0, 0) = 4#
        cp(0, 1, 0) = -0.5: cp(1, 1, 0) = -1.5: cp(2, 1, 0) = 2#
        cp(0, 2, 0) = 0.5: cp(1, 2, 0) = -1.5: cp(2, 2, 0) = -1#
        cp(0, 3, 0) = 1.5: cp(1, 3, 0) = -1.5: cp(2, 3, 0) = 2#

        cp(0, 0, 1) = -1.5: cp(1, 0, 1) = -0.5: cp(2, 0, 1) = 1#
        cp(0, 1, 1) = -0.5: cp(1, 1, 1) = -0.5: cp(2, 1, 1) = 3#
        cp(0, 2, 1) = 0.5: cp(1, 2, 1) = -0.5: cp(2, 2, 1) = 0#
        cp(0, 3, 1) = 1.5: cp(1, 3, 1) = -0.5: cp(2, 3, 1) = 1#

        cp(0, 0, 2) = -1.5: cp(1, 0, 2) = 0.5: cp(2, 0, 2) = 4#
        cp(0, 1, 2) = -0.5: cp(1, 1, 2) = 0.5: cp(2, 1, 2) = 0#
        cp(0, 2, 2) = 0.5: cp(1, 2, 2) = 0.5: cp(2, 2, 2) = 3#
        cp(0, 3, 2) = 1.5: cp(1, 3, 2) = 0.5: cp(2, 3, 2) = 4#

        cp(0, 0, 3) = -1.5: cp(1, 0, 3) = 1.5: cp(2, 0, 3) = -2#
        cp(0, 1, 3) = -0.5: cp(1, 1, 3) = 1.5: cp(2, 1, 3) = -2#
        cp(0, 2, 3) = 0.5: cp(1, 2, 3) = 1.5: cp(2, 2, 3) = 0#
        cp(0, 3, 3) = 1.5: cp(1, 3, 3) = 1.5: cp(2, 3, 3) = -1#

        glMap2f GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, cp(0, 0, 0)
        glEnable GL_MAP2_VERTEX_3
        glEnable GL_AUTO_NORMAL
        glMapGrid2f 8, 0, 1, 8, 0, 1

        glPushMatrix
            glRotatef 85#, 1, 1, 1
            glEvalMesh2 GL_FILL, 0, 8, 0, 8
        glPopMatrix

 
glMapGrid2{fd} nu, u1, u2, nv, v1, v2
  nu, nv :写像の間隔の設定
 u1, u2, v1, v2:パラメータの範囲
glMapMesh2{fd} mode, p1, p2, q1, q2
   mode  GL_POINTS, GL_LINE, GL_FILL(塗りつぶし)
 p1, p2 グリッドの領域変数の範囲