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