Robot Open Gl
unknown
c_cpp
a year ago
7.1 kB
9
Indexable
#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;
}
Editor is loading...
Leave a Comment