Robot Open Gl

mail@pastecode.io avatar
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