| 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 |   |  | 
                      
                        | 822 |   | == vaja121 == | 
                      
                        | 823 |   | Tako kot v vaji 120 preberite datoteko robih elementov in na sredini vsakega | 
                      
                        | 824 |   | elementa pravokotno na element narišite puščico vtoka ali iztoka v element. | 
                      
                        | 825 |   | Velikost puščice naj bo sorazmerna velikosti pretoka. Če pretoka ni, se puščice ne | 
                      
                        | 826 |   | riše. Puščica pritoka naj bo zelen,  puščica odtoka pa rdeče barve. | 
                      
                        | 827 |   |  | 
                      
                        | 828 |   |  | 
                      
                        | 829 |   | == vaja122 == | 
                      
                        | 830 |   | Tako kot 120 naj se izriše sistem robnih elementov. V prvem kvadrantu pa naj | 
                      
                        | 831 |   | se kot podlaga izriše še mreža točk (''grid'') v obsegu [0..10] z gostoto 1.0 | 
                      
                        | 832 |   |  | 
                      
                        | 833 |   | Za risanje točk uporabite primitiv {{{GL_POINTS}}} v sivi barvi  | 
                      
                        | 834 |   | {{{glColorf(0.5, 0.5, 0.5);}}} | 
                      
                        | 835 |   |  | 
                      
                        | 836 |   | Spodnja leva točka sistema mora sovpadati z izhodiščem prvega kvadranata. | 
                      
                        | 837 |   |  | 
                      
                        | 838 |   | == vaja123 == | 
                      
                        | 839 |   | Program naj vpraša za rotacijo okoli osi x, y in z ter nato nariše | 
                      
                        | 840 |   | koordinatni sistem kot tri vektorje dolžine 1.0 v rdeči, zeleni in modri barvi. | 
                      
                        | 841 |   | Na koncu naj bo še prostorska puščica primerne velikosti (npr 0.15)  | 
                      
                        | 842 |   | izdelana s stožcem za kar lahko izdelamo z  | 
                      
                        | 843 |   | {{{ | 
                      
                        | 844 |   | #!c | 
                      
                        | 845 |   | void glutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks); | 
                      
                        | 846 |   | }}} | 
                      
                        | 847 |   |  | 
                      
                        | 848 |   |  | 
                      
                        | 849 |   | == vaja124 == | 
                      
                        | 850 |   | 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  | 
                      
                        | 851 |   | {{{ | 
                      
                        | 852 |   | #!c | 
                      
                        | 853 |   |   glBegin(GL_LINES) | 
                      
                        | 854 |   |   /// ... | 
                      
                        | 855 |   |   glEnd(); | 
                      
                        | 856 |   | }}} | 
                      
                        | 857 |   |  | 
                      
                        | 858 |   | == vaja 125 == | 
                      
                        | 859 |   | 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.  | 
                      
                        | 860 |   | Točke (x, y) za posamezno vrednost poveži skupaj z uporabo primitiva  | 
                      
                        | 861 |   | {{{ | 
                      
                        | 862 |   | #!c | 
                      
                        | 863 |   |   glBegin(GL_LINE_STRIP) | 
                      
                        | 864 |   |   /// ... | 
                      
                        | 865 |   |   glEnd(); | 
                      
                        | 866 |   | }}} | 
                      
                        | 867 |   |  | 
                      
                        | 868 |   | == vaja 126 == | 
                      
                        | 869 |   | Datoteka vaja126.dat: | 
                      
                        | 870 |   | ||3|||| | 
                      
                        | 871 |   | ||0||0|| | 
                      
                        | 872 |   | ||2||1|| | 
                      
                        | 873 |   | ||-1||2|| | 
                      
                        | 874 |   |  | 
                      
                        | 875 |   | Iz datoteke preberi tri točke p1, p2 in p3.  | 
                      
                        | 876 |   | Z vektorskim produktom med vektorjema vec(a)=p2-p1 in vec(b)=p3-p1 ustvari nov vektor vec(c), | 
                      
                        | 877 |   | ki bo določal mesto točke p4 (s puščicami prikažite smer vektorjev a, b in c).  | 
                      
                        | 878 |   | Vse točke povežite med sabo in v novo določeno točko p4 vstavite čajnik za kar uporabite: | 
                      
                        | 879 |   | {{{ | 
                      
                        | 880 |   | #!c | 
                      
                        | 881 |   |    glutWireTeapot(0.5); | 
                      
                        | 882 |   | }}} | 
                      
                        | 883 |   |  | 
                      
                        | 884 |   | == vaja 127 == | 
                      
                        | 885 |   | Narišite 2D koordinatni sistem, katerega izhodišče se bo nahajalo v sredini zaslona  | 
                      
                        | 886 |   | (x os naj bo rdeče, y os pa zelene barve). V vsakem | 
                      
                        | 887 |   | kvadrantu koordinatnega sistema nariši mrežo točk v obsegu [0..10] z gostoto | 
                      
                        | 888 |   | (Kvadrant: K1[0.5], K2[1.0], K3[0.5], K4[1.0]).  | 
                      
                        | 889 |   | Vsak kvadrant naj ima mrežne točke drugačne barve (K1-zelene, K2-modre, K3-sive in K4-bele) | 
                      
                        | 890 |   | izdelane s primitivom | 
                      
                        | 891 |   | {{{ | 
                      
                        | 892 |   | #!c | 
                      
                        | 893 |   |    glBegin(GL_POINTS); | 
                      
                        | 894 |   |    ///.... | 
                      
                        | 895 |   |    glEnd(); | 
                      
                        | 896 |   | }}} | 
                      
                        | 897 |   |  | 
                      
                        | 898 |   |  | 
                      
                        | 899 |   | == vaja128 == | 
                      
                        | 900 |   | Narišite sinusno krivuljo v razponu od -π do π. Število točk naj bo možno spremeniti s konstanto N, izris | 
                      
                        | 901 |   | pa izvedemo z {{{GL_LINE_STRIP}}}. | 
                      
                        | 902 |   | {{{ | 
                      
                        | 903 |   | #!c | 
                      
                        | 904 |   | #define N 50 | 
                      
                        | 905 |   | }}} | 
                      
                        | 906 |   |  | 
                      
                        | 907 |   |  | 
                      
                        | 908 |   | == vaja129 == | 
                      
                        | 909 |   | V eneom od prejšnih vajah uporabite naslednji podprogram in ga prijavi kot GLUT podprogram,  | 
                      
                        | 910 |   | ki se izvede pri spremembi velikosti okna. | 
                      
                        | 911 |   |  | 
                      
                        | 912 |   | {{{ | 
                      
                        | 913 |   | #!c | 
                      
                        | 914 |   | void reshape(int w, int h) | 
                      
                        | 915 |   | { | 
                      
                        | 916 |   |   GLdouble width = w, height = h; | 
                      
                        | 917 |   |   GLdouble left, right, bottom, top, znear, zfar; | 
                      
                        | 918 |   |  | 
                      
                        | 919 |   |   if (w > h) | 
                      
                        | 920 |   |     { | 
                      
                        | 921 |   |       left = -width/height; | 
                      
                        | 922 |   |       right = width/height; | 
                      
                        | 923 |   |       bottom = -1.0; | 
                      
                        | 924 |   |       top = 1.0; | 
                      
                        | 925 |   |     } | 
                      
                        | 926 |   |   else | 
                      
                        | 927 |   |     { | 
                      
                        | 928 |   |       left = -1.0; | 
                      
                        | 929 |   |       right = 1.0; | 
                      
                        | 930 |   |       bottom = -height/width; | 
                      
                        | 931 |   |       top = height/width; | 
                      
                        | 932 |   |     } | 
                      
                        | 933 |   |   znear = -1.0; | 
                      
                        | 934 |   |   zfar = 1.0; | 
                      
                        | 935 |   |   glViewport(0, 0, w, h); | 
                      
                        | 936 |   |   glMatrixMode(GL_PROJECTION); | 
                      
                        | 937 |   |   glLoadIdentity(); | 
                      
                        | 938 |   |   glOrtho(left, right, bottom, top, znear, zfar); | 
                      
                        | 939 |   |   glMatrixMode(GL_MODELVIEW); | 
                      
                        | 940 |   |   glLoadIdentity(); | 
                      
                        | 941 |   | } | 
                      
                        | 942 |   | }}} | 
                      
                        | 943 |   | Kakšna je lastnost take spremembe okna? Začetno okno izrišite v velikosti 500x300. | 
                      
                        | 944 |   |  | 
                      
                        | 945 |   |  | 
                      
                        | 946 |   | == vaja130 == | 
                      
                        | 947 |   |  | 
                      
                        | 948 |   | Izrišite trikotnik s prelivanjem osnovnih barv v vozliščih. Za osnovo naj vam bo naslednji fortranski program: | 
                      
                        | 949 |   |  | 
                      
                        | 950 |   | {{{ | 
                      
                        | 951 |   | #!f | 
                      
                        | 952 |   | subroutine display | 
                      
                        | 953 |   | implicit none | 
                      
                        | 954 |   | include ’GL/fgl.h’ | 
                      
                        | 955 |   | call fglClear(GL_COLOR_BUFFER_BIT) | 
                      
                        | 956 |   | call fglBegin(GL_TRIANGLES) | 
                      
                        | 957 |   | call fglColor3f(1.0, 0.0, 0.0) | 
                      
                        | 958 |   | call fglVertex2f(-1.0, -1.0) | 
                      
                        | 959 |   | call fglColor3f(0.0, 1.0, 0.0) | 
                      
                        | 960 |   | call fglVertex2f(0.0, 1.0) | 
                      
                        | 961 |   | call fglColor3f(0.0, 0.0, 1.0) | 
                      
                        | 962 |   | call fglVertex2f(1.0, 0.0) | 
                      
                        | 963 |   | call fglEnd | 
                      
                        | 964 |   | call fglFlush | 
                      
                        | 965 |   | end | 
                      
                        | 966 |   | }}} | 
                      
                        | 967 |   |  | 
                      
                        | 968 |   |  | 
                      
                        | 969 |   | == vaja131 == | 
                      
                        | 970 |   | Izrišite kocko v prostoru tako, da uporabite podprogram, ki izrisuje kvadrate različnih barv | 
                      
                        | 971 |   | s funkcijo | 
                      
                        | 972 |   | {{{ | 
                      
                        | 973 |   | #!c | 
                      
                        | 974 |   | void glRectf( GLfloat x1, GLfloat y1, GLfloat x2,  GLfloat y2 ); | 
                      
                        | 975 |   | }}} | 
                      
                        | 976 |   | Funkcija glRectf riše v ravnini z=0. Z uporabo matričnih transformacij pa lahko rišemo | 
                      
                        | 977 |   | v poljubni ravini. | 
                      
                        | 978 |   | Za osnovo naj vam bo naslednji fortarnski program: | 
                      
                        | 979 |   | {{{ | 
                      
                        | 980 |   | #!f | 
                      
                        | 981 |   | subroutine kvadrat(i) | 
                      
                        | 982 |   | real r(6), g(6), b(6) | 
                      
                        | 983 |   | data r /1,0,0,1,1,1/, g /0,1,0,1,0,0/ | 
                      
                        | 984 |   | data b /0,0,1,0,1,1/ | 
                      
                        | 985 |   | call fglPushMatrix | 
                      
                        | 986 |   | call fglColor3f(r(i), g(i), b(i)) | 
                      
                        | 987 |   | call fglTranslatef(0.0, 0.0, 1.0) | 
                      
                        | 988 |   | call fglRectf(-1.0, -1.0, 1.0, 1.0) | 
                      
                        | 989 |   | call fglPopMatrix | 
                      
                        | 990 |   | end | 
                      
                        | 991 |   | subroutine display | 
                      
                        | 992 |   | implicit none | 
                      
                        | 993 |   | include ’GL/fgl.h’ | 
                      
                        | 994 |   | call fglClear(GL_COLOR_BUFFER_BIT+GL_DEPTH_BUFFER_BIT) | 
                      
                        | 995 |   | call fglPushMatrix | 
                      
                        | 996 |   | call fglRotatef(30.0, 1.0, 0.0, 0.0) | 
                      
                        | 997 |   | call fglRotatef(30.0, 0.0, 1.0, 0.0) | 
                      
                        | 998 |   | call fglScalef(0.5, 0.5, 0.5) | 
                      
                        | 999 |   | call kvadrat(1) | 
                      
                        | 1000 |   | call fglRotatef(90.0, 0.0, 1.0, 0.0) | 
                      
                        | 1001 |   | call kvadrat(2) | 
                      
                        | 1002 |   | call fglRotatef(90.0, 0.0, 1.0, 0.0) | 
                      
                        | 1003 |   | call kvadrat(3) | 
                      
                        | 1004 |   | call fglRotatef(90.0, 0.0, 1.0, 0.0) | 
                      
                        | 1005 |   | call kvadrat(4) | 
                      
                        | 1006 |   | call fglRotatef(90.0, 1.0, 0.0, 0.0) | 
                      
                        | 1007 |   | call kvadrat(5) | 
                      
                        | 1008 |   | call fglRotatef(180.0, 1.0, 0.0, 0.0) | 
                      
                        | 1009 |   | call kvadrat(6) | 
                      
                        | 1010 |   | call fglPopMatrix | 
                      
                        | 1011 |   | call fglFlush | 
                      
                        | 1012 |   | end | 
                      
                        | 1013 |   | }}} | 
                      
                        | 1014 |   |  | 
                      
                        | 1015 |   | Pri izbiri okna morate vklopiti globinski pomnilnik z  | 
                      
                        | 1016 |   | {{{ | 
                      
                        | 1017 |   | #!c | 
                      
                        | 1018 |   | glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGB); | 
                      
                        | 1019 |   | glEnable(GL DEPTH TEST); | 
                      
                        | 1020 |   | }}} | 
                      
                        | 1021 |   |  | 
                      
                        | 1022 |   |  | 
                      
                        | 1023 |   | == vaja132 == | 
                      
                        | 1024 |   | Tako kot v nalogi 130 izrišite prelivajoč se trikotnik s tem da prijavite še | 
                      
                        | 1025 |   | naslednjo funkcijo pri izrisu okna velikosti 500x300: | 
                      
                        | 1026 |   | {{{ | 
                      
                        | 1027 |   | #!c | 
                      
                        | 1028 |   | void reshape (intw, inth) { | 
                      
                        | 1029 |   | glViewport(0, 0, w, h); | 
                      
                        | 1030 |   | glMatrixMode(GL_PROJECTION); | 
                      
                        | 1031 |   | glLoadIdentity(); | 
                      
                        | 1032 |   | gluOrtho2D (0.0, w, 0.0, h); | 
                      
                        | 1033 |   | } | 
                      
                        | 1034 |   | }}} | 
                      
                        | 1035 |   |  | 
                      
                      
                        |   | 769 | = PythonOCC = | 
                      
                        |   | 770 | == vaja 130 == | 
                      
                        |   | 771 | S pomočjo štiri točk v prostoru izdelaj štrikotnik s stranico a. Vse točke naj imajo enako z os. | 
                      
                        |   | 772 | Površino izvleči v smeri vektorja vec{v}, ki ni enak vektorju normale izvlečene površine. | 
                      
                        |   | 773 | Vektor vec{v} in stranico a podamo programu na začetku.  | 
                      
                        |   | 774 |  | 
                      
                        |   | 775 | == vaja 131 == | 
                      
                        |   | 776 | V izhodišče lokalnega koordinatnega sistema postavite kocko s stranico a. Na sredino zgornje ploskve | 
                      
                        |   | 777 | postavite valj premera r, v smeri normale površine na katero je valj postavljen. | 
                      
                        |   | 778 | Uporabite funkciji: BRepPrimAPI_MakeBox in BRepPrimAPI_MakeCylinder. | 
                      
                        |   | 779 |  | 
                      
                        |   | 780 | == vaja 132 == | 
                      
                        |   | 781 | Izdelajte mrežo iz točk P1(-10, -10, 0), P2 (-10, -20, 0) in P3(10, -10, 0) in jo prezrcalite okoli osi X. | 
                      
                        |   | 782 | Za vsako mrežo posebej izdelajte prizmo (torej dve prizmi) in ju različno obarvajte (display.DisplayColoredShape(myShape, 'GREEN')). |