| 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')). |