2 single: RingOpenGL と RingFreeGLUT の用法 (3D グラフィックス); はじめに
4 ===========================================================
5 RingOpenGL と RingFreeGLUT の用法 (3D グラフィックス)
6 ===========================================================
9 RingOpenGL と RingFreeGLUT の用法を学びます。
13 pair: RingOpenGL と RingFreeGLUT の用法 (3D グラフィックス); サンプルソース (作者)
18 この C チュートリアルを参考に本章のサンプルを記述しました。
22 (1) http://www.lighthouse3d.com/tutorials/glut-tutorial/
24 (2) http://www.wikihow.com/Make-a-Cube-in-OpenGL
28 pair: RingOpenGL と RingFreeGLUT の用法 (3D グラフィックス); RingOpenGL とは?
33 RingOpenGL は Ring 付属の OpenGL ライブラリのバインディングです。
35 こちらから OpenGL について学べます : https://www.opengl.org/
37 RingOpenGL は下記のバージョンに対応しています。
57 OpenGL 2.1 の場合は RingOpenGL 2.1 ライブラリを読み込みます。
61 load "opengl21lib.ring"
65 pair: RingOpenGL と RingFreeGLUT の用法 (3D グラフィックス); RingFreeGLUT とは?
70 RingFreeGLUT は Ring 付属の FreeGLUT ライブラリのバインディングです。
72 このサイトで FreeGLUT について学べます : http://freeglut.sourceforge.net/
74 RingFreeGLUT の使用前に freeglut.ring ライブラリを読み込みます。
82 pair: RingOpenGL と RingFreeGLUT の用法 (3D グラフィックス); RingFreeGLUT によるはじめてのウィンドウ
84 RingFreeGLUT によるはじめてのウィンドウ
85 =======================================
95 glutInitDisplayMode(GLUT_SINGLE)
96 glutInitWindowSize(800, 600)
97 glutInitWindowPosition(100, 10)
98 glutCreateWindow("RingFreeGLUT - Test 1")
99 glutDisplayFunc(:displayCode)
106 .. image:: freeglutshot1.png
111 pair: RingOpenGL と RingFreeGLUT の用法 (3D グラフィックス); RingOpenGL での描画
122 load "opengl21lib.ring"
127 glutInitDisplayMode(GLUT_SINGLE)
128 glutInitWindowSize(800, 600)
129 glutInitWindowPosition(100, 10)
130 glutCreateWindow("RingFreeGLUT - Test 2")
131 glutDisplayFunc(:displayCode)
135 glClear(GL_COLOR_BUFFER_BIT)
138 glVertex3f(0.0, 0.0, 0.0)
139 glVertex3f(0.5, 0.0, 0.0)
140 glVertex3f(0.5, 0.5, 0.0)
141 glVertex3f(0.0, 0.5, 0.0)
145 glVertex3f(0.0, 0.0, 0.0)
146 glVertex3f(0.5, 0.0, 0.0)
147 glVertex3f(-0.5,- 1, 0.0)
148 glVertex3f(0.0, -1, 0.0)
152 glVertex3f(0.0, 0.0, 0.0)
153 glVertex3f(-0.5, 0.0, 0.0)
154 glVertex3f(-0.5,- 0.5, 0.0)
155 glVertex3f(0.0, -0.5, 0.0)
162 .. image:: freeglutshot2.png
167 pair: RingOpenGL と RingFreeGLUT の用法 (3D グラフィックス); はじめての三角形
178 load "opengl21lib.ring"
182 glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA)
183 glutInitWindowSize(320,320)
184 glutInitWindowPosition(100, 10)
185 glutCreateWindow("RingFreeGLUT - Test 3")
186 glutDisplayFunc(:renderScene)
191 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
193 glBegin(GL_TRIANGLES)
194 glVertex3f(-0.5,-0.5,0.0)
195 glVertex3f(0.5,0.0,0.0)
196 glVertex3f(0.0,0.5,0.0)
204 .. image:: freeglutshot3.png
208 pair: RingOpenGL と RingFreeGLUT の用法 (3D グラフィックス); ウィンドウの大きさ変更イベント
211 ==============================
218 load "opengl21lib.ring"
222 // GLUT の初期化とウィンドウの作成
224 glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA)
225 glutInitWindowPosition(100,100)
226 glutInitWindowSize(320,320)
227 glutCreateWindow("RingFreeGLUT - Test 4")
229 glutDisplayFunc(:renderScene)
230 glutReshapeFunc(:changeSize)
236 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
238 glBegin(GL_TRIANGLES)
239 glVertex3f(-2,-2,-5.0)
240 glVertex3f(2,0.0,-5.0)
241 glVertex3f(0.0,2,-5.0)
248 h = glutEventHeight()
251 // ウィンドウの大きさが小さすぎる場合に、ゼロ除算エラーになるのを防ぎます。
252 // (幅 0 のウィンドウは作成できません)
260 glMatrixMode(GL_PROJECTION)
265 // ウィンドウ全体のビューポートを設定します。
266 glViewport(0, 0, w, h)
269 gluPerspective(45,ratio,1,100)
272 glMatrixMode(GL_MODELVIEW)
275 pair: RingOpenGL と RingFreeGLUT の用法 (3D グラフィックス); 三角形の回転
285 load "opengl21lib.ring"
291 // GLUT の初期化とウィンドウの作成
293 glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA)
294 glutInitWindowPosition(100,100)
295 glutInitWindowSize(320,320)
296 glutCreateWindow("RingFreeGLUT - Test 5")
298 glutDisplayFunc(:renderScene)
299 glutReshapeFunc(:changeSize)
300 glutIdleFunc(:renderScene)
307 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
312 gluLookAt( 0.0, 0.0, 10.0,
316 glRotatef(angle, 0.0, 1.0, 0.0)
318 glBegin(GL_TRIANGLES)
319 glVertex3f(-2.0,-2.0, 0.0)
320 glVertex3f( 2.0, 0.0, 0.0)
321 glVertex3f( 0.0, 2.0, 0.0)
330 h = glutEventHeight()
333 // ウィンドウの大きさが小さすぎる場合に、ゼロ除算エラーになるのを防ぎます。
334 // (幅 0 のウィンドウは作成できません)
342 glMatrixMode(GL_PROJECTION)
347 // ウィンドウ全体のビューポートを設定します。
348 glViewport(0, 0, w, h)
351 gluPerspective(45,ratio,1,100)
354 glMatrixMode(GL_MODELVIEW)
359 .. image:: freeglutshot4.png
364 pair: RingOpenGL と RingFreeGLUT の用法 (3D グラフィックス); キーボードイベントと配色
367 ========================
375 load "opengl21lib.ring"
385 // GLUT の初期化とウィンドウの作成
387 glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA)
388 glutInitWindowPosition(100,100)
389 glutInitWindowSize(320,320)
390 glutCreateWindow("RingFreeGLUT - Test 6")
392 glutDisplayFunc(:renderScene)
393 glutReshapeFunc(:changeSize)
394 glutIdleFunc(:renderScene)
397 glutKeyboardFunc(:processNormalKeys)
398 glutSpecialFunc(:processSpecialKeys)
405 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
410 gluLookAt( 0.0, 0.0, 10.0,
414 glRotatef(angle, 0.0, 1.0, 0.0)
417 glColor3f(red,green,blue);
419 glBegin(GL_TRIANGLES)
420 glVertex3f(-2.0,-2.0, 0.0)
421 glVertex3f( 2.0, 0.0, 0.0)
422 glVertex3f( 0.0, 2.0, 0.0)
431 h = glutEventHeight()
434 // ウィンドウの大きさが小さすぎる場合に、ゼロ除算エラーになるのを防ぎます。
435 // (幅 0 のウィンドウは作成できません)
443 glMatrixMode(GL_PROJECTION)
448 // ウィンドウ全体のビューポートを設定します。
449 glViewport(0, 0, w, h)
452 gluPerspective(45,ratio,1,100)
455 glMatrixMode(GL_MODELVIEW)
457 func processNormalKeys
463 func processSpecialKeys
484 .. image:: freeglutshot5.png
490 pair: RingOpenGL と RingFreeGLUT の用法 (3D グラフィックス); カメラ
500 load "opengl21lib.ring"
504 // 実際のベクトルはカメラ方向を表しています。
513 glColor3f(1.0, 1.0, 1.0)
516 glTranslatef(0.0 ,0.75, 0.0)
517 glutSolidSphere(0.75,20,20)
520 glTranslatef(0.0, 1.0, 0.0)
521 glutSolidSphere(0.25,20,20)
525 glColor3f(0.0,0.0,0.0)
526 glTranslatef(0.05, 0.10, 0.18)
527 glutSolidSphere(0.05,10,10)
528 glTranslatef(-0.1, 0.0, 0.0)
529 glutSolidSphere(0.05,10,10)
534 glColor3f(1.0, 0.5 , 0.5)
535 glutSolidCone(0.08,0.5,10,2)
540 h = glutEventHeight()
542 // ウィンドウの大きさが小さすぎる場合に、ゼロ除算エラーになるのを防ぎます。
543 // (幅 0 のウィンドウは作成できません)
551 glMatrixMode(GL_PROJECTION)
557 // ウィンドウ全体のビューポートを設定します。
558 glViewport(0, 0, w, h)
561 gluPerspective(45.0, ratio, 0.1, 100.0);
564 glMatrixMode(GL_MODELVIEW)
567 func processNormalKeys
580 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
585 gluLookAt( x, 1.0, z,
591 glColor3f(0.9, 0.9, 0.9)
593 glVertex3f(-100.0, 0.0, -100.0)
594 glVertex3f(-100.0, 0.0, 100.0)
595 glVertex3f( 100.0, 0.0, 100.0)
596 glVertex3f( 100.0, 0.0, -100.0)
603 glTranslatef(i*10.0,0,j * 10.0)
613 func processSpecialKeys
639 // GLUT の初期化とウィンドウの作成
642 glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA)
644 glutInitWindowPosition(100,100)
645 glutInitWindowSize(320,320)
646 glutCreateWindow("RingFreeGLUT - Test 7")
649 glutDisplayFunc(:renderScene)
650 glutReshapeFunc(:changeSize)
651 glutIdleFunc(:renderScene)
652 glutKeyboardFunc(:processNormalKeys)
653 glutSpecialFunc(:processSpecialKeys)
656 glEnable(GL_DEPTH_TEST)
658 // GLUT のイベント処理サイクルへ入ります。
663 .. image:: freeglutshot6.png
671 load "opengl21lib.ring"
676 // 実際のベクトルはカメラ方向を表しています。
682 // キーを押していない時は変数は 0 です。
688 h = glutEventHeight()
690 // ウィンドウの大きさが小さすぎる場合に、ゼロ除算エラーになるのを防ぎます。
691 // (幅 0 のウィンドウは作成できません)
699 glMatrixMode(GL_PROJECTION)
704 // ウィンドウ全体のビューポートを設定します。
705 glViewport(0, 0, w, h)
708 gluPerspective(45.0, ratio, 0.1, 100.0)
711 glMatrixMode(GL_MODELVIEW)
716 glColor3f(1.0, 1.0, 1.0)
720 glTranslatef(0.0 ,0.75, 0.0)
721 glutSolidSphere(0.75,20,20)
724 glTranslatef(0.0, 1.0, 0.0)
725 glutSolidSphere(0.25,20,20)
729 glColor3f(0.0,0.0,0.0)
730 glTranslatef(0.05, 0.10, 0.18)
731 glutSolidSphere(0.05,10,10)
732 glTranslatef(-0.1, 0.0, 0.0)
733 glutSolidSphere(0.05,10,10)
737 glColor3f(1.0, 0.5 , 0.5)
738 glRotatef(0.0,1.0, 0.0, 0.0)
739 glutSolidCone(0.08,0.5,10,2)
742 func computePos deltaMove
744 x += deltaMove * lx * 0.1
745 z += deltaMove * lz * 0.1
748 func computeDir deltaAngle
757 computePos(deltaMove)
761 computeDir(deltaAngle)
765 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
770 gluLookAt( x, 1.0, z,
776 glColor3f(0.9, 0.9, 0.9)
778 glVertex3f(-100.0, 0.0, -100.0)
779 glVertex3f(-100.0, 0.0, 100.0)
780 glVertex3f( 100.0, 0.0, 100.0)
781 glVertex3f( 100.0, 0.0, -100.0)
789 glTranslatef(i*10.0,0,j * 10.0)
830 // GLUT の初期化とウィンドウの作成
832 glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA)
833 glutInitWindowPosition(100,100)
834 glutInitWindowSize(320,320)
835 glutCreateWindow("RingFreeGLUT - Test 8")
838 glutDisplayFunc(:renderScene)
839 glutReshapeFunc(:changeSize)
840 glutIdleFunc(:renderScene)
842 glutSpecialFunc(:pressKey)
845 glutIgnoreKeyRepeat(1)
846 glutSpecialUpFunc(:releaseKey)
849 glEnable(GL_DEPTH_TEST)
851 // GLUT のイベント処理サイクルへ入ります。
856 pair: RingOpenGL と RingFreeGLUT の用法 (3D グラフィックス); マウスイベント
866 load "opengl21lib.ring"
871 // 実際のベクトルはカメラ方向を表しています。
878 // キーを押していない時は変数は 0 です。
885 h = glutEventHeight()
887 // ウィンドウの大きさが小さすぎる場合に、ゼロ除算エラーになるのを防ぎます。
888 // (幅 0 のウィンドウは作成できません)
896 glMatrixMode(GL_PROJECTION)
901 // ウィンドウ全体のビューポートを設定します。
902 glViewport(0, 0, w, h)
905 gluPerspective(45.0, ratio, 0.1, 100.0)
908 glMatrixMode(GL_MODELVIEW)
913 glColor3f(1.0, 1.0, 1.0)
916 glTranslatef(0.0 ,0.75, 0.0)
917 glutSolidSphere(0.75,20,20)
920 glTranslatef(0.0, 1.0, 0.0)
921 glutSolidSphere(0.25,20,20)
925 glColor3f(0.0,0.0,0.0)
926 glTranslatef(0.05, 0.10, 0.18)
927 glutSolidSphere(0.05,10,10)
928 glTranslatef(-0.1, 0.0, 0.0)
929 glutSolidSphere(0.05,10,10)
933 glColor3f(1.0, 0.5 , 0.5)
934 glRotatef(0.0,1.0, 0.0, 0.0)
935 glutSolidCone(0.08,0.5,10,2)
938 func computePos deltaMove
940 x += deltaMove * lx * 0.1
941 z += deltaMove * lz * 0.1
946 computePos(deltaMove)
950 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
955 gluLookAt( x, 1.0, z,
961 glColor3f(0.9, 0.9, 0.9)
963 glVertex3f(-100.0, 0.0, -100.0)
964 glVertex3f(-100.0, 0.0, 100.0)
965 glVertex3f( 100.0, 0.0, 100.0)
966 glVertex3f( 100.0, 0.0, -100.0)
974 glTranslatef(i*10.0,0,j * 10.0)
981 func processNormalKeys
1002 key = glutEventKey()
1014 // これは左ボタンを押したときのみ true になります。
1018 deltaAngle = (xx - xOrigin) * 0.001
1021 lx = sin(angle + deltaAngle)
1022 lz = -cos(angle + deltaAngle)
1029 button = glutEventButton()
1030 state = glutEventState()
1034 // これは左ボタンを押したときのみ動作開始になります。
1035 if button = GLUT_LEFT_BUTTON
1041 // state = GLUT_DOWN
1050 // GLUT の初期化とウィンドウの作成
1052 glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA)
1053 glutInitWindowPosition(100,100)
1054 glutInitWindowSize(320,320)
1055 glutCreateWindow("RingFreeGLUT - Test 9")
1058 glutDisplayFunc(:renderScene)
1059 glutReshapeFunc(:changeSize)
1060 glutIdleFunc(:renderScene)
1062 glutIgnoreKeyRepeat(1)
1063 glutKeyboardFunc(:processNormalKeys)
1064 glutSpecialFunc(:pressKey)
1065 glutSpecialUpFunc(:releaseKey)
1067 // ここには二つの新しい関数があります。
1068 glutMouseFunc(:mouseButton)
1069 glutMotionFunc(:mouseMove)
1072 glEnable(GL_DEPTH_TEST)
1074 // GLUT のイベント処理サイクルへ入ります。
1079 pair: RingOpenGL と RingFreeGLUT の用法 (3D グラフィックス); メニューイベント
1086 .. code-block:: ring
1089 load "freeglut.ring"
1090 load "opengl21lib.ring"
1095 // 実際のベクトルはカメラ方向を表しています。
1102 // キーを押していない時は変数は 0 です。
1110 // RingFreeGLUT では - メニューの項目ごとに異なる ID を指定してください。
1129 red = 1.0 blue=0.5 green=0.5
1138 w = glutEventWidth()
1139 h = glutEventHeight()
1141 // ウィンドウの大きさが小さすぎる場合に、ゼロ除算エラーになるのを防ぎます。
1142 // (幅 0 のウィンドウは作成できません)
1150 glMatrixMode(GL_PROJECTION)
1155 // ウィンドウ全体のビューポートを設定します。
1156 glViewport(0, 0, w, h)
1159 gluPerspective(45.0, ratio, 0.1, 100.0)
1162 glMatrixMode(GL_MODELVIEW)
1166 glScalef(scale, scale, scale)
1167 glColor3f(1.0, 1.0, 1.0)
1170 glTranslatef(0.0 ,0.75, 0.0)
1171 glutSolidSphere(0.75,20,20)
1174 glTranslatef(0.0, 1.0, 0.0)
1175 glutSolidSphere(0.25,20,20)
1179 glColor3f(0.0,0.0,0.0)
1180 glTranslatef(0.05, 0.10, 0.18)
1181 glutSolidSphere(0.05,10,10)
1182 glTranslatef(-0.1, 0.0, 0.0)
1183 glutSolidSphere(0.05,10,10)
1187 glColor3f(red, green, blue)
1188 glRotatef(0.0,1.0, 0.0, 0.0)
1189 glutSolidCone(0.08,0.5,10,2)
1191 glColor3f(1.0, 1.0, 1.0)
1194 func computePos deltaMove
1196 x += deltaMove * lx * 0.1
1197 z += deltaMove * lz * 0.1
1203 computePos(deltaMove)
1207 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
1212 gluLookAt( x, 1.0, z,
1218 glColor3f(0.9, 0.9, 0.9)
1220 glVertex3f(-100.0, 0.0, -100.0)
1221 glVertex3f(-100.0, 0.0, 100.0)
1222 glVertex3f( 100.0, 0.0, 100.0)
1223 glVertex3f( 100.0, 0.0, -100.0)
1231 glTranslatef(i*10.0, 0.0, j * 10.0)
1239 // -----------------------------------
1241 // -----------------------------------
1243 func processNormalKeys
1244 key = glutEventKey()
1248 glutSetMenu(mainMenu)
1251 glutDestroyMenu(mainMenu)
1252 glutDestroyMenu(fillMenu)
1253 glutDestroyMenu(colorMenu)
1254 glutDestroyMenu(shrinkMenu)
1259 glutChangeToSubMenu(2,"Shrink",shrinkMenu)
1263 glutChangeToSubMenu(2,"Color",colorMenu)
1273 key = glutEventKey()
1287 key = glutEventKey()
1297 // -----------------------------------
1299 // -----------------------------------
1305 // これは左ボタンを押したときのみ true になります。
1309 deltaAngle = (xx - xOrigin) * 0.001
1312 lx = sin(angle + deltaAngle)
1313 lz = -cos(angle + deltaAngle)
1319 button = glutEventButton()
1320 state = glutEventState()
1324 // これは左ボタンを押したときのみ動作開始になります。
1325 if button = GLUT_LEFT_BUTTON
1331 // state = GLUT_DOWN
1337 // -----------------------------------
1339 // -----------------------------------
1341 func processMenuStatus
1343 status = glutEventStatus()
1347 if status = GLUT_MENU_IN_USE
1354 func processMainMenu
1357 // 動作は全てサブメニューから行います。
1360 func processFillMenu
1362 option = glutEventValue()
1367 glPolygonMode(GL_FRONT, GL_FILL)
1369 glPolygonMode(GL_FRONT, GL_LINE)
1373 func processShrinkMenu
1375 option = glutEventValue()
1386 func processColorMenu
1388 option = glutEventValue()
1410 func createPopupMenus
1412 shrinkMenu = glutCreateMenu(:processShrinkMenu)
1414 glutAddMenuEntry("Shrink",C_SHRINK)
1415 glutAddMenuEntry("NORMAL",C_NORMAL)
1417 fillMenu = glutCreateMenu(:processFillMenu)
1419 glutAddMenuEntry("Fill",C_FILL)
1420 glutAddMenuEntry("Line",C_LINE)
1422 colorMenu = glutCreateMenu(:processColorMenu)
1423 glutAddMenuEntry("Red",C_RED)
1424 glutAddMenuEntry("Blue",C_BLUE)
1425 glutAddMenuEntry("Green",C_GREEN)
1426 glutAddMenuEntry("Orange",C_ORANGE)
1428 mainMenu = glutCreateMenu(:processMainMenu)
1430 glutAddSubMenu("Polygon Mode", fillMenu)
1431 glutAddSubMenu("Color", colorMenu)
1433 glutAttachMenu(GLUT_RIGHT_BUTTON)
1435 // これでアクティブなメニューであるかどうか検知できるようにします。
1436 glutMenuStatusFunc(:processMenuStatus)
1439 // -----------------------------------
1441 // -----------------------------------
1445 // GLUT の初期化とウィンドウの作成
1447 glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA)
1448 glutInitWindowPosition(100,100)
1449 glutInitWindowSize(320,320)
1450 glutCreateWindow("RingFreeGLUT - Test 10")
1453 glutDisplayFunc(:renderScene)
1454 glutReshapeFunc(:changeSize)
1455 glutIdleFunc(:renderScene)
1457 glutIgnoreKeyRepeat(1)
1458 glutKeyboardFunc(:processNormalKeys)
1459 glutSpecialFunc(:pressKey)
1460 glutSpecialUpFunc(:releaseKey)
1462 // ここには二つの新しい関数があります。
1463 glutMouseFunc(:mouseButton)
1464 glutMotionFunc(:mouseMove)
1467 glEnable(GL_DEPTH_TEST)
1468 glEnable(GL_CULL_FACE)
1473 // GLUT のイベント処理サイクルへ入ります。
1478 .. image:: freeglutshot7.png
1483 pair: RingOpenGL と RingFreeGLUT の用法 (3D グラフィックス); フォントの用法
1490 .. code-block:: ring
1492 load "freeglut.ring"
1493 load "opengl21lib.ring"
1499 // 実際のベクトルはカメラ方向を表しています。
1506 // キーを押していない時は変数は 0 です。
1538 font = GLUT_BITMAP_TIMES_ROMAN_24
1540 C_INT_GLUT_BITMAP_8_BY_13 = 7
1541 C_INT_GLUT_BITMAP_9_BY_15 = 8
1542 C_INT_GLUT_BITMAP_TIMES_ROMAN_10 = 9
1543 C_INT_GLUT_BITMAP_TIMES_ROMAN_24 = 10
1544 C_INT_GLUT_BITMAP_HELVETICA_10 = 11
1545 C_INT_GLUT_BITMAP_HELVETICA_12 = 12
1546 C_INT_GLUT_BITMAP_HELVETICA_18 = 13
1549 w = glutEventWidth()
1550 h = glutEventHeight()
1552 // ウィンドウの大きさが小さすぎる場合に、ゼロ除算エラーになるのを防ぎます。
1553 // (幅 0 のウィンドウは作成できません)
1561 glMatrixMode(GL_PROJECTION)
1566 // ウィンドウ全体のビューポートを設定します。
1567 glViewport(0, 0, w, h)
1570 gluPerspective(45.0, ratio, 0.1, 100.0)
1573 glMatrixMode(GL_MODELVIEW)
1577 glScalef(scale, scale, scale)
1578 glColor3f(1.0, 1.0, 1.0)
1581 glTranslatef(0.0 ,0.75, 0.0)
1582 glutSolidSphere(0.75,20,20)
1585 glTranslatef(0.0, 1.0, 0.0)
1586 glutSolidSphere(0.25,20,20)
1590 glColor3f(0.0,0.0,0.0)
1591 glTranslatef(0.05, 0.10, 0.18)
1592 glutSolidSphere(0.05,10,10)
1593 glTranslatef(-0.1, 0.0, 0.0)
1594 glutSolidSphere(0.05,10,10)
1598 glColor3f(red, green, blue)
1599 glRotatef(0.0,1.0, 0.0, 0.0)
1600 glutSolidCone(0.08,0.5,10,2)
1602 glColor3f(1.0, 1.0, 1.0)
1604 func renderBitmapString x,y,z,font,string
1605 glRasterPos3f(x, y,z)
1607 glutBitmapCharacter(font,ascii(c))
1611 func computePos deltaMove
1613 x += deltaMove * lx * 0.1
1614 z += deltaMove * lz * 0.1
1620 computePos(deltaMove)
1624 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
1630 gluLookAt( x, 1.0, z,
1636 glColor3f(0.9, 0.9, 0.9)
1638 glVertex3f(-100.0, 0.0, -100.0)
1639 glVertex3f(-100.0, 0.0, 100.0)
1640 glVertex3f( 100.0, 0.0, 100.0)
1641 glVertex3f( 100.0, 0.0, -100.0)
1648 glTranslatef(i*10.0, 0.0, j * 10.0)
1650 number = (i+3)*6+(j+3)
1651 renderBitmapString(0.0, 0.5, 0.0,font ,""+number)
1659 // -----------------------------------
1661 // -----------------------------------
1663 func processNormalKeys
1664 key = glutEventKey()
1670 glutDestroyMenu(mainMenu)
1671 glutDestroyMenu(fillMenu)
1672 glutDestroyMenu(colorMenu)
1673 glutDestroyMenu(fontMenu)
1680 key = glutEventKey()
1694 key = glutEventKey()
1704 // -----------------------------------
1706 // -----------------------------------
1712 // これは左ボタンを押したときのみ true になります。
1716 deltaAngle = (xx - xOrigin) * 0.001
1719 lx = sin(angle + deltaAngle)
1720 lz = -cos(angle + deltaAngle)
1726 button = glutEventButton()
1727 state = glutEventState()
1731 // これは左ボタンを押したときのみ動作開始になります。
1732 if button = GLUT_LEFT_BUTTON
1738 // state = GLUT_DOWN
1744 // -----------------------------------
1746 // -----------------------------------
1748 func processMenuStatus
1750 status = glutEventStatus()
1752 if status = GLUT_MENU_IN_USE
1759 func processMainMenu
1762 // 動作は全てサブメニューから行います。
1765 func processFillMenu
1767 option = glutEventValue()
1772 glPolygonMode(GL_FRONT, GL_FILL)
1774 glPolygonMode(GL_FRONT, GL_LINE)
1778 func processFontMenu
1780 option = glutEventValue()
1783 on C_INT_GLUT_BITMAP_8_BY_13
1784 font = GLUT_BITMAP_8_BY_13
1785 on C_INT_GLUT_BITMAP_9_BY_15
1786 font = GLUT_BITMAP_9_BY_15
1787 on C_INT_GLUT_BITMAP_TIMES_ROMAN_10
1788 font = GLUT_BITMAP_TIMES_ROMAN_10
1789 on C_INT_GLUT_BITMAP_TIMES_ROMAN_24
1790 font = GLUT_BITMAP_TIMES_ROMAN_24
1791 on C_INT_GLUT_BITMAP_HELVETICA_10
1792 font = GLUT_BITMAP_HELVETICA_10
1793 on C_INT_GLUT_BITMAP_HELVETICA_12
1794 font = GLUT_BITMAP_HELVETICA_12
1795 on C_INT_GLUT_BITMAP_HELVETICA_18
1796 font = GLUT_BITMAP_HELVETICA_18
1799 func processColorMenu
1801 option = glutEventValue()
1823 func createPopupMenus
1825 fontMenu = glutCreateMenu(:processFontMenu)
1827 glutAddMenuEntry("BITMAP_8_BY_13 ",C_INT_GLUT_BITMAP_8_BY_13 )
1828 glutAddMenuEntry("BITMAP_9_BY_15",C_INT_GLUT_BITMAP_9_BY_15 )
1829 glutAddMenuEntry("BITMAP_TIMES_ROMAN_10 ",C_INT_GLUT_BITMAP_TIMES_ROMAN_10 )
1830 glutAddMenuEntry("BITMAP_TIMES_ROMAN_24",C_INT_GLUT_BITMAP_TIMES_ROMAN_24 )
1831 glutAddMenuEntry("BITMAP_HELVETICA_10 ",C_INT_GLUT_BITMAP_HELVETICA_10 )
1832 glutAddMenuEntry("BITMAP_HELVETICA_12",C_INT_GLUT_BITMAP_HELVETICA_12 )
1833 glutAddMenuEntry("BITMAP_HELVETICA_18",C_INT_GLUT_BITMAP_HELVETICA_18 )
1835 fillMenu = glutCreateMenu(:processFillMenu)
1837 glutAddMenuEntry("Fill",C_FILL)
1838 glutAddMenuEntry("Line",C_LINE)
1840 colorMenu = glutCreateMenu(:processColorMenu)
1841 glutAddMenuEntry("Red",C_RED);
1842 glutAddMenuEntry("Blue",C_BLUE);
1843 glutAddMenuEntry("Green",C_GREEN);
1844 glutAddMenuEntry("Orange",C_ORANGE);
1846 mainMenu = glutCreateMenu(:processMainMenu)
1848 glutAddSubMenu("Polygon Mode", fillMenu)
1849 glutAddSubMenu("Color", colorMenu)
1850 glutAddSubMenu("Font",fontMenu)
1852 glutAttachMenu(GLUT_RIGHT_BUTTON)
1854 // これでアクティブなメニューであるかどうか検知できるようにします。
1855 glutMenuStatusFunc(:processMenuStatus)
1858 // -----------------------------------
1860 // -----------------------------------
1864 // GLUT の初期化とウィンドウの作成
1866 glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA)
1867 glutInitWindowPosition(100,100)
1868 glutInitWindowSize(320,320)
1869 glutCreateWindow("RingFreeGLUT - Test 11")
1872 glutDisplayFunc(:renderScene)
1873 glutReshapeFunc(:changeSize)
1874 glutIdleFunc(:renderScene)
1876 glutIgnoreKeyRepeat(1)
1877 glutKeyboardFunc(:processNormalKeys)
1878 glutSpecialFunc(:pressKey)
1879 glutSpecialUpFunc(:releaseKey)
1881 // ここには二つの新しい関数があります。
1882 glutMouseFunc(:mouseButton)
1883 glutMotionFunc(:mouseMove)
1886 glEnable(GL_DEPTH_TEST)
1887 glEnable(GL_CULL_FACE)
1892 // GLUT のイベント処理サイクルへ入ります。
1897 .. image:: freeglutshot8.png
1902 pair: RingOpenGL と RingFreeGLUT の用法 (3D グラフィックス); 一秒あたりのフレーム数
1905 ======================
1909 .. code-block:: ring
1911 load "freeglut.ring"
1912 load "opengl21lib.ring"
1917 // 実際のベクトルはカメラ方向を表しています。
1924 // キーを押していない時は変数は 0 です。
1956 font = GLUT_BITMAP_TIMES_ROMAN_24
1958 C_INT_GLUT_BITMAP_8_BY_13 = 7
1959 C_INT_GLUT_BITMAP_9_BY_15 = 8
1960 C_INT_GLUT_BITMAP_TIMES_ROMAN_10 = 9
1961 C_INT_GLUT_BITMAP_TIMES_ROMAN_24 = 10
1962 C_INT_GLUT_BITMAP_HELVETICA_10 = 11
1963 C_INT_GLUT_BITMAP_HELVETICA_12 = 12
1964 C_INT_GLUT_BITMAP_HELVETICA_18 = 13
1970 // 一秒あたりのフレーム数を計算するための変数
1977 w = glutEventWidth()
1978 h = glutEventHeight()
1980 // ウィンドウの大きさが小さすぎる場合に、ゼロ除算エラーになるのを防ぎます。
1981 // (幅 0 のウィンドウは作成できません)
1989 glMatrixMode(GL_PROJECTION)
1994 // ウィンドウ全体のビューポートを設定します。
1995 glViewport(0, 0, w, h)
1998 gluPerspective(45.0, ratio, 0.1, 100.0)
2001 glMatrixMode(GL_MODELVIEW)
2005 glScalef(scale, scale, scale)
2006 glColor3f(1.0, 1.0, 1.0)
2009 glTranslatef(0.0 ,0.75, 0.0)
2010 glutSolidSphere(0.75,20,20)
2013 glTranslatef(0.0, 1.0, 0.0)
2014 glutSolidSphere(0.25,20,20)
2018 glColor3f(0.0,0.0,0.0)
2019 glTranslatef(0.05, 0.10, 0.18)
2020 glutSolidSphere(0.05,10,10)
2021 glTranslatef(-0.1, 0.0, 0.0)
2022 glutSolidSphere(0.05,10,10)
2026 glColor3f(red, green, blue)
2027 glRotatef(0.0,1.0, 0.0, 0.0)
2028 glutSolidCone(0.08,0.5,10,2)
2030 glColor3f(1.0, 1.0, 1.0)
2032 func renderBitmapString x,y,z,font,string
2033 glRasterPos3f(x, y,z)
2035 glutBitmapCharacter(font,ascii(c))
2038 func renderStrokeFontString x,y,z,font,string
2040 glTranslatef(x, y,z)
2041 glScalef(0.002, 0.002, 0.002)
2043 glutStrokeCharacter(font, Ascii(c));
2048 func restorePerspectiveProjection
2050 glMatrixMode(GL_PROJECTION)
2055 glMatrixMode(GL_MODELVIEW)
2058 func setOrthographicProjection
2061 glMatrixMode(GL_PROJECTION)
2071 gluOrtho2D(0, w, h, 0)
2073 // modelview モードへ復帰切り替え
2074 glMatrixMode(GL_MODELVIEW)
2078 func computePos deltaMove
2080 x += deltaMove * lx * 0.1
2081 z += deltaMove * lz * 0.1
2087 computePos(deltaMove)
2091 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
2097 gluLookAt( x, 1.0, z,
2103 glColor3f(0.9, 0.9, 0.9)
2105 glVertex3f(-100.0, 0.0, -100.0)
2106 glVertex3f(-100.0, 0.0, 100.0)
2107 glVertex3f( 100.0, 0.0, 100.0)
2108 glVertex3f( 100.0, 0.0, -100.0)
2115 glTranslatef(i*10.0, 0.0, j * 10.0)
2117 number = (i+3)*3+(j+3)
2118 renderBitmapString(0.0, 0.5, 0.0,font ,""+number)
2123 // 一秒あたりのフレーム数を計算するためのコード
2126 time=glutGet(GLUT_ELAPSED_TIME)
2127 if time - timebase > 1000
2128 s = "RingFreeGLUT - FPS: " + (frame*1000.0/(time-timebase))
2133 // ビットマップフォントで文字列 (fps) を表示するためのコード
2134 setOrthographicProjection()
2138 renderBitmapString(5,30,0,GLUT_BITMAP_HELVETICA_18,s)
2141 restorePerspectiveProjection()
2146 // -----------------------------------
2148 // -----------------------------------
2150 func processNormalKeys
2151 key = glutEventKey()
2157 glutDestroyMenu(mainMenu)
2158 glutDestroyMenu(fillMenu)
2159 glutDestroyMenu(colorMenu)
2160 glutDestroyMenu(fontMenu)
2167 key = glutEventKey()
2181 key = glutEventKey()
2191 // -----------------------------------
2193 // -----------------------------------
2199 // これは左ボタンを押したときのみ true になります。
2203 deltaAngle = (xx - xOrigin) * 0.001
2206 lx = sin(angle + deltaAngle)
2207 lz = -cos(angle + deltaAngle)
2213 button = glutEventButton()
2214 state = glutEventState()
2218 // これは左ボタンを押したときのみ動作開始になります。
2219 if button = GLUT_LEFT_BUTTON
2225 // state = GLUT_DOWN
2231 // -----------------------------------
2233 // -----------------------------------
2235 func processMenuStatus
2237 status = glutEventStatus()
2239 if status = GLUT_MENU_IN_USE
2246 func processMainMenu
2249 // 動作は全てサブメニューから行います。
2252 func processFillMenu
2254 option = glutEventValue()
2259 glPolygonMode(GL_FRONT, GL_FILL)
2261 glPolygonMode(GL_FRONT, GL_LINE)
2265 func processFontMenu
2267 option = glutEventValue()
2270 on C_INT_GLUT_BITMAP_8_BY_13
2271 font = GLUT_BITMAP_8_BY_13
2272 on C_INT_GLUT_BITMAP_9_BY_15
2273 font = GLUT_BITMAP_9_BY_15
2274 on C_INT_GLUT_BITMAP_TIMES_ROMAN_10
2275 font = GLUT_BITMAP_TIMES_ROMAN_10
2276 on C_INT_GLUT_BITMAP_TIMES_ROMAN_24
2277 font = GLUT_BITMAP_TIMES_ROMAN_24
2278 on C_INT_GLUT_BITMAP_HELVETICA_10
2279 font = GLUT_BITMAP_HELVETICA_10
2280 on C_INT_GLUT_BITMAP_HELVETICA_12
2281 font = GLUT_BITMAP_HELVETICA_12
2282 on C_INT_GLUT_BITMAP_HELVETICA_18
2283 font = GLUT_BITMAP_HELVETICA_18
2286 func processColorMenu
2288 option = glutEventValue()
2310 func createPopupMenus
2312 fontMenu = glutCreateMenu(:processFontMenu)
2314 glutAddMenuEntry("BITMAP_8_BY_13 ",C_INT_GLUT_BITMAP_8_BY_13 )
2315 glutAddMenuEntry("BITMAP_9_BY_15",C_INT_GLUT_BITMAP_9_BY_15 )
2316 glutAddMenuEntry("BITMAP_TIMES_ROMAN_10 ",C_INT_GLUT_BITMAP_TIMES_ROMAN_10 )
2317 glutAddMenuEntry("BITMAP_TIMES_ROMAN_24",C_INT_GLUT_BITMAP_TIMES_ROMAN_24 )
2318 glutAddMenuEntry("BITMAP_HELVETICA_10 ",C_INT_GLUT_BITMAP_HELVETICA_10 )
2319 glutAddMenuEntry("BITMAP_HELVETICA_12",C_INT_GLUT_BITMAP_HELVETICA_12 )
2320 glutAddMenuEntry("BITMAP_HELVETICA_18",C_INT_GLUT_BITMAP_HELVETICA_18 )
2322 fillMenu = glutCreateMenu(:processFillMenu)
2324 glutAddMenuEntry("Fill",C_FILL)
2325 glutAddMenuEntry("Line",C_LINE)
2327 colorMenu = glutCreateMenu(:processColorMenu)
2328 glutAddMenuEntry("Red",C_RED);
2329 glutAddMenuEntry("Blue",C_BLUE);
2330 glutAddMenuEntry("Green",C_GREEN);
2331 glutAddMenuEntry("Orange",C_ORANGE);
2333 mainMenu = glutCreateMenu(:processMainMenu)
2335 glutAddSubMenu("Polygon Mode", fillMenu)
2336 glutAddSubMenu("Color", colorMenu)
2337 glutAddSubMenu("Font",fontMenu)
2339 glutAttachMenu(GLUT_RIGHT_BUTTON)
2341 // これでアクティブなメニューであるかどうか検知できるようにします。
2342 glutMenuStatusFunc(:processMenuStatus)
2345 // -----------------------------------
2347 // -----------------------------------
2351 // GLUT の初期化とウィンドウの作成
2353 glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA)
2354 glutInitWindowPosition(100,100)
2355 glutInitWindowSize(320,320)
2356 glutCreateWindow("RingFreeGLUT - Test - 9 SnowMan")
2359 glutDisplayFunc(:renderScene)
2360 glutReshapeFunc(:changeSize)
2361 glutIdleFunc(:renderScene)
2363 glutIgnoreKeyRepeat(1)
2364 glutKeyboardFunc(:processNormalKeys)
2365 glutSpecialFunc(:pressKey)
2366 glutSpecialUpFunc(:releaseKey)
2368 // ここには二つの新しい関数があります。
2369 glutMouseFunc(:mouseButton)
2370 glutMotionFunc(:mouseMove)
2373 glEnable(GL_DEPTH_TEST)
2374 glEnable(GL_CULL_FACE)
2379 // GLUT のイベント処理サイクルへ入ります。
2387 .. image:: ring15freeglut.png
2393 .. image:: ring15freeglut2.png
2397 pair: RingOpenGL と RingFreeGLUT の用法 (3D グラフィックス); RingOpenGL と RingFreeGLUT による立方体の作例
2399 RingOpenGL と RingFreeGLUT による立方体の作例
2400 =============================================
2404 .. code-block:: ring
2406 load "freeglut.ring"
2407 load "opengl21lib.ring"
2409 // ----------------------------------------------------------
2411 // ----------------------------------------------------------
2415 // ----------------------------------------------------------
2416 // display() コールバック関数
2417 // ----------------------------------------------------------
2421 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
2426 // rotate_x および rotate_y のユーザによる変更をリセットします。
2427 glRotatef( rotate_x, 1.0, 0.0, 0.0 )
2428 glRotatef( rotate_y, 0.0, 1.0, 0.0 )
2433 glColor3f( 1.0, 0.0, 0.0 ) glVertex3f( 0.5, -0.5, -0.5 ) # P1 is red
2434 glColor3f( 0.0, 1.0, 0.0 ) glVertex3f( 0.5, 0.5, -0.5 ) # P2 is green
2435 glColor3f( 0.0, 0.0, 1.0 ) glVertex3f( -0.5, 0.5, -0.5 ) # P3 is blue
2436 glColor3f( 1.0, 0.0, 1.0 ) glVertex3f( -0.5, -0.5, -0.5 ) # P4 is purple
2442 glColor3f( 1.0, 1.0, 1.0 )
2443 glVertex3f( 0.5, -0.5, 0.5 )
2444 glVertex3f( 0.5, 0.5, 0.5 )
2445 glVertex3f( -0.5, 0.5, 0.5 )
2446 glVertex3f( -0.5, -0.5, 0.5 )
2451 glColor3f( 1.0, 0.0, 1.0 )
2452 glVertex3f( 0.5, -0.5, -0.5 )
2453 glVertex3f( 0.5, 0.5, -0.5 )
2454 glVertex3f( 0.5, 0.5, 0.5 )
2455 glVertex3f( 0.5, -0.5, 0.5 )
2460 glColor3f( 0.0, 1.0, 0.0 )
2461 glVertex3f( -0.5, -0.5, 0.5 )
2462 glVertex3f( -0.5, 0.5, 0.5 )
2463 glVertex3f( -0.5, 0.5, -0.5 )
2464 glVertex3f( -0.5, -0.5, -0.5 )
2469 glColor3f( 0.0, 0.0, 1.0 )
2470 glVertex3f( 0.5, 0.5, 0.5 )
2471 glVertex3f( 0.5, 0.5, -0.5 )
2472 glVertex3f( -0.5, 0.5, -0.5 )
2473 glVertex3f( -0.5, 0.5, 0.5 )
2478 glColor3f( 1.0, 0.0, 0.0 )
2479 glVertex3f( 0.5, -0.5, -0.5 )
2480 glVertex3f( 0.5, -0.5, 0.5 )
2481 glVertex3f( -0.5, -0.5, 0.5 )
2482 glVertex3f( -0.5, -0.5, -0.5 )
2489 // ----------------------------------------------------------
2490 // specialKeys() コールバック関数
2491 // ----------------------------------------------------------
2494 key = glutEventKey()
2496 // 右矢印 - 回転を五度増分します。
2502 // 左矢印 - 回転を五度減分します。
2519 // ----------------------------------------------------------
2521 // ----------------------------------------------------------
2524 // GLUT の初期化とユーザ仮引数の処理
2527 // トゥルーカラーのウィンドウのために Z-バッファによるダブルバッファを要求します。
2528 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
2531 glutCreateWindow("Awesome Cube")
2533 // Z バッファの深度テストを有効にします。
2534 glEnable(GL_DEPTH_TEST)
2537 glutDisplayFunc(:display)
2538 glutSpecialFunc(:specialKeys)
2540 // イベントに関する GLUT への制御を渡します。
2548 .. image:: ring15opengl.png