769 | | |
| 769 | = Grafični jezik OpenGL = |
| 770 | |
| 771 | Vse naloge v nadaljevanju so zastavljene tako, da se želi grafični izris z določenimi |
| 772 | primitivi in v določeni obliki. Če ni podrobneje določeno, je potrebno pripraviti izris tako, |
| 773 | da je dovolj ličen in v ustreznem razmerju z velikostjo okna. Okno naj bo velikosti 400x400. |
| 774 | Za spremembo koordinatnega sistema modela je potrebno uporabiti transformacijske funkcije |
| 775 | v ustreznem vrstnem redu. Transformacijske funkcije so: |
| 776 | - translacija |
| 777 | {{{ |
| 778 | #!c |
| 779 | void glTranslatef( GLfloat x, GLfloat y, GLfloat z ) |
| 780 | }}} |
| 781 | - skaliranje |
| 782 | {{{ |
| 783 | #!c |
| 784 | void glScalef( GLfloat x, GLfloat y, GLfloat z ) |
| 785 | }}} |
| 786 | - rotacija |
| 787 | {{{ |
| 788 | #!c |
| 789 | void glRotatef( GLfloat angle, GLfloat x, GLfloat y, GLfloat z ) |
| 790 | }}} |
| 791 | |
| 792 | == vaja120 == |
| 793 | Program, ki bere podatke robnih elementov iz datoteke |
| 794 | {{{ |
| 795 | 8 1 |
| 796 | 00 00 06 00 0 |
| 797 | 06 00 14 00 -1 |
| 798 | 14 00 20 00 0 |
| 799 | 20 00 20 10 0 |
| 800 | 20 10 14 10 0 |
| 801 | 14 10 06 10 1 |
| 802 | 06 10 00 10 0 |
| 803 | 00 10 00 00 0 |
| 804 | }}} |
| 805 | tako, da bo na vozlišča elementov postavil rdečo kroglo |
| 806 | velikosti 1.0, na sredino robnih elementov pa zeleno kroglo |
| 807 | velikosti 0.5. Za izris krogle uporabite |
| 808 | {{{ |
| 809 | #!c |
| 810 | void glutSolidSphere(GLdouble radius, GLint slices, GLint stacks); |
| 811 | }}} |
| 812 | z osmimi delitvami po dolžini in širini krogle. |
| 813 | |
| 814 | V prikazani datoteki v prvi vrstici piše število elementov 8 in število delitev 1. |
| 815 | V naslednjih vrsticah so koordinate robnih elementov v ravnini in jakost vtoka. |
| 816 | Vsaka vrstica ima naslednje koordinate |
| 817 | {{{ |
| 818 | x1 y1 x2 y1 q |
| 819 | }}} |
| 820 | |
| 821 | == vaja121 == |
| 822 | Tako kot v vaji 120 preberite datoteko robih elementov in na sredini vsakega |
| 823 | elementa pravokotno na element narišite puščico vtoka ali iztoka v element. |
| 824 | Velikost puščice naj bo sorazmerna velikosti pretoka. Če pretoka ni, se puščice ne |
| 825 | riše. Puščica pritoka naj bo zelen, puščica odtoka pa rdeče barve. |
| 826 | |
| 827 | == vaja122 == |
| 828 | Tako kot 120 naj se izriše sistem robnih elementov. V prvem kvadrantu pa naj |
| 829 | se kot podlaga izriše še mreža točk (''grid'') v obsegu [0..10] z gostoto 1.0 |
| 830 | |
| 831 | Za risanje točk uporabite primitiv {{{GL_POINTS}}} v sivi barvi |
| 832 | {{{glColorf(0.5, 0.5, 0.5);}}} |
| 833 | |
| 834 | Spodnja leva točka sistema mora sovpadati z izhodiščem prvega kvadranata. |
| 835 | |
| 836 | == vaja123 == |
| 837 | Program naj vpraša za rotacijo okoli osi x, y in z ter nato nariše |
| 838 | koordinatni sistem kot tri vektorje dolžine 1.0 v rdeči, zeleni in modri barvi. |
| 839 | Na koncu naj bo še prostorska puščica primerne velikosti (npr 0.15) |
| 840 | izdelana s stožcem za kar lahko izdelamo z |
| 841 | {{{ |
| 842 | #!c |
| 843 | void glutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks); |
| 844 | }}} |
| 845 | |
| 846 | == vaja124 == |
| 847 | Narišite kocko v izometrični projekciji z dolžino stranice a = 3. Vozlišča povežite med seboj s črtami in v vsako vozlišče postavite rumeno kroglo velikosti 0.5. Za izris črt uporabite primitiv |
| 848 | {{{ |
| 849 | #!c |
| 850 | glBegin(GL_LINES) |
| 851 | /// ... |
| 852 | glEnd(); |
| 853 | }}} |
| 854 | |
| 855 | == vaja 125 == |
| 856 | Napišite program, ki bo za vrednost n = 1 do 7 zračunal n!. Vrednosti n naj bodo na osi x, n! pa na osi y. |
| 857 | Točke (x, y) za posamezno vrednost poveži skupaj z uporabo primitiva |
| 858 | {{{ |
| 859 | #!c |
| 860 | glBegin(GL_LINE_STRIP) |
| 861 | /// ... |
| 862 | glEnd(); |
| 863 | }}} |
| 864 | |
| 865 | == vaja 126 == |
| 866 | Datoteka vaja126.dat: |
| 867 | ||3|||| |
| 868 | ||0||0|| |
| 869 | ||2||1|| |
| 870 | ||-1||2|| |
| 871 | |
| 872 | Iz datoteke preberi tri točke p1, p2 in p3. |
| 873 | Z vektorskim produktom med vektorjema vec(a)=p2-p1 in vec(b)=p3-p1 ustvari nov vektor vec(c), |
| 874 | ki bo določal mesto točke p4 (s puščicami prikažite smer vektorjev a, b in c). |
| 875 | Vse točke povežite med sabo in v novo določeno točko p4 vstavite čajnik za kar uporabite: |
| 876 | {{{ |
| 877 | #!c |
| 878 | glutWireTeapot(0.5); |
| 879 | }}} |
| 880 | |
| 881 | == vaja 127 == |
| 882 | Narišite 2D koordinatni sistem, katerega izhodišče se bo nahajalo v sredini zaslona |
| 883 | (x os naj bo rdeče, y os pa zelene barve). V vsakem |
| 884 | kvadrantu koordinatnega sistema nariši mrežo točk v obsegu [0..10] z gostoto |
| 885 | (Kvadrant: K1[0.5], K2[1.0], K3[0.5], K4[1.0]). |
| 886 | Vsak kvadrant naj ima mrežne točke drugačne barve (K1-zelene, K2-modre, K3-sive in K4-bele) |
| 887 | izdelane s primitivom |
| 888 | {{{ |
| 889 | #!c |
| 890 | glBegin(GL_POINTS); |
| 891 | ///.... |
| 892 | glEnd(); |
| 893 | }}} |
| 894 | |
| 895 | == vaja128 == |
| 896 | Narišite sinusno krivuljo v razponu od -π do π. Število točk naj bo možno spremeniti s konstanto N, izris |
| 897 | pa izvedemo z {{{GL_LINE_STRIP}}}. |
| 898 | {{{ |
| 899 | #!c |
| 900 | #define N 50 |
| 901 | }}} |
| 902 | |
| 903 | == vaja129 == |
| 904 | V enem od prejšnjih vaj uporabite naslednji podprogram in ga prijavi kot GLUT podprogram, |
| 905 | ki se izvede pri spremembi velikosti okna. |
| 906 | {{{ |
| 907 | #!c |
| 908 | void reshape(int w, int h) |
| 909 | { |
| 910 | GLdouble width = w, height = h; |
| 911 | GLdouble left, right, bottom, top, znear, zfar; |
| 912 | |
| 913 | if (w > h) |
| 914 | { |
| 915 | left = -width/height; |
| 916 | right = width/height; |
| 917 | bottom = -1.0; |
| 918 | top = 1.0; |
| 919 | } |
| 920 | else |
| 921 | { |
| 922 | left = -1.0; |
| 923 | right = 1.0; |
| 924 | bottom = -height/width; |
| 925 | top = height/width; |
| 926 | } |
| 927 | znear = -1.0; |
| 928 | zfar = 1.0; |
| 929 | glViewport(0, 0, w, h); |
| 930 | glMatrixMode(GL_PROJECTION); |
| 931 | glLoadIdentity(); |
| 932 | glOrtho(left, right, bottom, top, znear, zfar); |
| 933 | glMatrixMode(GL_MODELVIEW); |
| 934 | glLoadIdentity(); |
| 935 | } |
| 936 | }}} |
| 937 | Kakšna je lastnost take spremembe okna? Začetno okno izrišite v velikosti 500x300. |
| 938 | |
| 939 | == vaja130 == |
| 940 | |
| 941 | Izrišite trikotnik s prelivanjem osnovnih barv v vozliščih. Za osnovo naj vam bo naslednji fortranski program: |
| 942 | {{{ |
| 943 | #!f |
| 944 | subroutine display |
| 945 | implicit none |
| 946 | include ’GL/fgl.h’ |
| 947 | call fglClear(GL_COLOR_BUFFER_BIT) |
| 948 | call fglBegin(GL_TRIANGLES) |
| 949 | call fglColor3f(1.0, 0.0, 0.0) |
| 950 | call fglVertex2f(-1.0, -1.0) |
| 951 | call fglColor3f(0.0, 1.0, 0.0) |
| 952 | call fglVertex2f(0.0, 1.0) |
| 953 | call fglColor3f(0.0, 0.0, 1.0) |
| 954 | call fglVertex2f(1.0, 0.0) |
| 955 | call fglEnd |
| 956 | call fglFlush |
| 957 | end |
| 958 | }}} |
| 959 | |
| 960 | == vaja131 == |
| 961 | Izrišite kocko v prostoru tako, da uporabite podprogram, ki izrisuje kvadrate različnih barv |
| 962 | s funkcijo |
| 963 | {{{ |
| 964 | #!c |
| 965 | void glRectf( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 ); |
| 966 | }}} |
| 967 | Funkcija glRectf riše v ravnini z=0. Z uporabo matričnih transformacij pa lahko rišemo |
| 968 | v poljubni ravini. |
| 969 | Za osnovo naj vam bo naslednji fortarnski program: |
| 970 | {{{ |
| 971 | #!f |
| 972 | subroutine kvadrat(i) |
| 973 | real r(6), g(6), b(6) |
| 974 | data r /1,0,0,1,1,1/, g /0,1,0,1,0,0/ |
| 975 | data b /0,0,1,0,1,1/ |
| 976 | call fglPushMatrix |
| 977 | call fglColor3f(r(i), g(i), b(i)) |
| 978 | call fglTranslatef(0.0, 0.0, 1.0) |
| 979 | call fglRectf(-1.0, -1.0, 1.0, 1.0) |
| 980 | call fglPopMatrix |
| 981 | end |
| 982 | subroutine display |
| 983 | implicit none |
| 984 | include ’GL/fgl.h’ |
| 985 | call fglClear(GL_COLOR_BUFFER_BIT+GL_DEPTH_BUFFER_BIT) |
| 986 | call fglPushMatrix |
| 987 | call fglRotatef(30.0, 1.0, 0.0, 0.0) |
| 988 | call fglRotatef(30.0, 0.0, 1.0, 0.0) |
| 989 | call fglScalef(0.5, 0.5, 0.5) |
| 990 | call kvadrat(1) |
| 991 | call fglRotatef(90.0, 0.0, 1.0, 0.0) |
| 992 | call kvadrat(2) |
| 993 | call fglRotatef(90.0, 0.0, 1.0, 0.0) |
| 994 | call kvadrat(3) |
| 995 | call fglRotatef(90.0, 0.0, 1.0, 0.0) |
| 996 | call kvadrat(4) |
| 997 | call fglRotatef(90.0, 1.0, 0.0, 0.0) |
| 998 | call kvadrat(5) |
| 999 | call fglRotatef(180.0, 1.0, 0.0, 0.0) |
| 1000 | call kvadrat(6) |
| 1001 | call fglPopMatrix |
| 1002 | call fglFlush |
| 1003 | end |
| 1004 | }}} |
| 1005 | |
| 1006 | Pri izbiri okna morate vklopiti globinski pomnilnik z |
| 1007 | {{{ |
| 1008 | #!c |
| 1009 | glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGB); |
| 1010 | glEnable(GL DEPTH TEST); |
| 1011 | }}} |
| 1012 | |
| 1013 | == vaja132 == |
| 1014 | Tako kot v nalogi 130 izrišite prelivajoč se trikotnik s tem da prijavite še |
| 1015 | naslednjo funkcijo pri izrisu okna velikosti 500x300: |
| 1016 | {{{ |
| 1017 | #!c |
| 1018 | void reshape (intw, inth) { |
| 1019 | glViewport(0, 0, w, h); |
| 1020 | glMatrixMode(GL_PROJECTION); |
| 1021 | glLoadIdentity(); |
| 1022 | gluOrtho2D (0.0, w, 0.0, h); |
| 1023 | } |
| 1024 | }}} |
| 1025 | |
| 1026 | == vaja133 == |
| 1027 | Izrišite naslednji mnogokotnik v oknu velikosti 300x300 tako, da bo z leve in desne |
| 1028 | strani okoli 20% praznega prostora. Če želite ga lahko tudi pobarvate. |
| 1029 | {{{ |
| 1030 | #!c |
| 1031 | glBegin(GL_POLYGON); |
| 1032 | glVertex2f(0.0, 0.0); |
| 1033 | glVertex2f(0.0, 3.0); |
| 1034 | glVertex2f(4.0, 3.0); |
| 1035 | glVertex2f(6.0, 1.5); |
| 1036 | glVertex2f(4.0, 0.0); |
| 1037 | glEnd(); |
| 1038 | }}} |
| 1039 | |
| 1040 | == vaja134 == |
| 1041 | Kocko iz vaje 124 rišite z gladkimi črtami debeline 1.5, za kar uporabite naslednja |
| 1042 | ukaza v glavnem programu: |
| 1043 | {{{ |
| 1044 | #!c |
| 1045 | glEnable(GL_LINE_SMOOTH); |
| 1046 | glLineWidth(1.5); |
| 1047 | }}} |