Robot Open Gl
unknown
c_cpp
a month ago
7.1 kB
3
Indexable
Never
#include <iostream> #include <GL/glew.h> #include <GL/freeglut.h> #include <cmath> // Untuk menggunakan fungsi trigonometri // Fungsi untuk menggambar persegi void drawSquare(float x1, float y1, float x2, float y2, int r, int g, int b) { glBegin(GL_QUADS); // Konversi RGB dari 0-255 ke 0.0-1.0 glColor3f(r / 255.0f, g / 255.0f, b / 255.0f); // warna persegi glVertex2f(x1, y1); glVertex2f(x2, y1); glVertex2f(x2, y2); glVertex2f(x1, y2); glEnd(); } void drawCircle(float cx, float cy, float radius, int num_segments, int r, int g, int b) { glBegin(GL_TRIANGLE_FAN); // Menggunakan GL_TRIANGLE_FAN untuk membuat lingkaran glColor3f(r / 255.0f, g / 255.0f, b / 255.0f); // Warna lingkaran, dikonversi dari 0-255 ke 0.0-1.0 glVertex2f(cx, cy); // Titik pusat lingkaran for (int i = 0; i <= num_segments; i++) { float theta = 2.0f * 3.1415926f * float(i) / float(num_segments); // Sudut per segmen float x = radius * cosf(theta); // Koordinat x dari lingkaran float y = radius * sinf(theta); // Koordinat y dari lingkaran glVertex2f(x + cx, y + cy); // Menggambar segmen lingkaran } glEnd(); } void drawLine(float x1, float y1, float x2, float y2, int r, int g, int b, float lineWidth) { glLineWidth(lineWidth); // Mengatur ketebalan garis glBegin(GL_LINES); // Menggunakan GL_LINES untuk menggambar garis glColor3f(r / 255.0f, g / 255.0f, b / 255.0f); // Warna garis, dikonversi dari 0-255 ke 0.0-1.0 glVertex2f(x1, y1); // Titik awal garis glVertex2f(x2, y2); // Titik akhir garis glEnd(); } void drawCurve(float cx, float cy, float radius, int num_segments, int r, int g, int b) { glBegin(GL_LINE_STRIP); // Menggunakan GL_LINE_STRIP untuk menggambar kurva senyuman glColor3f(r / 255.0f, g / 255.0f, b / 255.0f); // Warna kurva, dikonversi dari 0-255 ke 0.0-1.0 // Menggambar setengah lingkaran (180 derajat) untuk senyuman for (int i = 0; i <= num_segments; i++) { float theta = 3.1415926f * float(i) / float(num_segments); // Sudut antara segmen (dari 0 hingga Pi) float x = radius * cosf(theta); // Koordinat x dari lingkaran float y = radius * sinf(theta); // Koordinat y dari lingkaran glVertex2f(x + cx, y + cy); // Menggambar titik kurva } glEnd(); } void drawBezierCurve(float x0, float y0, float x1, float y1, float x2, float y2, int segments, int r, int g, int b) { glColor3f(r / 255.0f, g / 255.0f, b / 255.0f); // Warna kurva glBegin(GL_LINE_STRIP); for (int i = 0; i <= segments; i++) { float t = (float)i / (float)segments; float x = (1 - t) * (1 - t) * x0 + 2 * (1 - t) * t * x1 + t * t * x2; // Persamaan kurva Bezier untuk x float y = (1 - t) * (1 - t) * y0 + 2 * (1 - t) * t * y1 + t * t * y2; // Persamaan kurva Bezier untuk y glVertex2f(x, y); // Gambar titik pada kurva } glEnd(); } void drawHalfCircle(float cx, float cy, float radius, int num_segments, int r, int g, int b) { glBegin(GL_TRIANGLE_FAN); glColor3f(r / 255.0f, g / 255.0f, b / 255.0f); glVertex2f(cx, cy); // Pusat lingkaran for (int i = 0; i <= num_segments / 2; i++) { float theta = 3.1415926f * float(i) / float(num_segments); // Setengah lingkaran (180 derajat) float x = radius * cosf(theta); float y = radius * sinf(theta); glVertex2f(x + cx, y + cy); } glEnd(); } // Fungsi untuk menggambar kepala void drawHead() { drawSquare(-0.06f, 0.25f, 0.06f, 0.2f, 61, 70, 101); //leher drawSquare(-0.2f, 0.55f, 0.2f, 0.25f, 61, 70, 101); //base kulit drawSquare(-0.18f, 0.52f, 0.18f, 0.28f, 251, 252, 254); //base kulit // Mata kiri hitam drawCircle(-0.1f, 0.4f, 0.05f, 100, 61, 70, 101); //mata kanaan hitam drawCircle(0.1f, 0.4f, 0.05f, 100, 61, 70, 101); //mata kiri putih drawCircle(-0.12f, 0.42f, 0.01f, 50, 251, 252, 254); //mata kanan putih drawCircle(0.08f, 0.42f, 0.01f, 50, 251, 252, 254); // Mulut drawLine(-0.05f, 0.3f, 0.05f, 0.3f, 61, 70, 101, 6.0f); } void drawBaju() { drawSquare(-0.23f, 0.23f, 0.23f, -0.23, 61, 70, 101); drawSquare(-0.2f, 0.2f, 0.2f, -0.2, 251, 252, 254); //base baju //buatkan outline bajunya menhgelili base baju mengugnakan square //lengan ke bawah kiri drawSquare(-0.31f, 0.15f, -0.24f, -0.26, 61, 70, 101); drawSquare(-0.29f, 0.15f, -0.26f, -0.24, 251, 252, 254); //lengan ke bawah kanan drawSquare(0.24f, 0.15f, 0.31f, -0.26, 61, 70, 101); drawSquare(0.26f, 0.15f, 0.29f, -0.24, 251, 252, 254); //telapak tangan kiri drawCurve(-0.28f, -0.3, 0.05f, 100, 61, 70, 101); //telapak tangan kanan drawCurve(0.28f, -0.3, 0.06f, 100, 61, 70, 101); //lengan bulat kiri drawCircle(-0.26f, 0.15f, 0.06f, 100, 61, 70, 101); drawCircle(-0.26f, 0.15f, 0.04f, 100, 251, 252, 254); //lengan bulat kanan drawCircle(0.26f, 0.15f, 0.06f, 100, 61, 70, 101); drawCircle(0.26f, 0.15f, 0.04f, 100, 251, 252, 254); } void drawKaki() { //kaki kiri drawSquare(-0.15f, -0.23, -0.05, -0.5f, 61, 70, 101);//base kaki kiri drawSquare(-0.12f, -0.24, -0.08, -0.47f, 251, 252, 254);//base kaki kiri drawHalfCircle(-0.15, -0.24, 0.1f, 100, 61, 70, 101); //kaki kanan drawSquare(0.05f, -0.23, 0.15f, -0.5f, 61, 70, 101);//base kaki kanan drawSquare(0.08f, -0.24, 0.12f, -0.47f, 251, 252, 254);//base kaki kanan //sepatu kiri drawSquare(-0.15f, -0.5f, -0.05f, -0.55f, 61, 70, 101);//base sepatu kiri drawSquare(-0.12f, -0.5f, -0.08f, -0.53f, 251, 252, 254);//base sepatu kiri //sepatu kanan drawSquare(0.05f, -0.5f, 0.15f, -0.55f, 61, 70, 101);//base sepatu kanan drawSquare(0.08f, -0.5f, 0.12f, -0.53f, 251, 252, 254);//base sepatu kanan } // Fungsi untuk menggambar badan // Fungsi untuk render robot void render() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Membersihkan buffer warna glLoadIdentity(); // Reset transformasi //ganti warna background glClearColor(176/ 255.0f, 227/ 255.0f, 255/ 255.0f, 1.0f); // Menggambar bagian-bagian robot drawHead(); drawKaki(); drawBaju(); glutSwapBuffers(); // Menukar buffer } // Fungsi untuk menyesuaikan viewport void changeViewPort(int w, int h) { glViewport(0, 0, w, h); } // Fungsi utama int main(int argc, char* argv[]) { glutInit(&argc, argv); // Inisialisasi GLUT glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); // Menyiapkan buffer glutInitWindowSize(500, 500); // Ukuran window glutCreateWindow("Robot OpenGL"); // Membuat window dengan judul glutReshapeFunc(changeViewPort); // Mengubah viewport ketika window di-resize glutDisplayFunc(render); // Fungsi render GLenum err = glewInit(); if (GLEW_OK != err) { std::cout << "Error initializing GLEW" << std::endl; return 1; } glutMainLoop(); // Loop utama return 0; }
Leave a Comment