루빅스 큐브 만들기3

Posted by 백창
2014. 12. 24. 11:48 개발/Open GL
반응형


 개요

 

 큐브의 회전동작을 구현해보자



 코드

 

 Cube Class 구성


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
void Cube::setAngle(int new_angleX, int new_angleY, int new_angleZ){
    GLfloat temp[6][3];
    int cubeRet[3];
    for (int i = 0; i<6; i++){
        for (int j = 0; j<3; j++){
            temp[i][j] = colors[i][j];
        }
    }
    if (new_angleX > 0){
    
        for (int i = 0; i < 4; i++){
            for (int j = 0; j<3; j++){
                colors[rotate[0][i]][j] = temp[rotate[0][(i + 1) % 4]][j];
            }
            
        }
    }
    else if (new_angleY > 0){
        for (int i = 0; i < 4; i++){
            for (int j = 0; j<3; j++){
                colors[rotate[2][i]][j] = temp[rotate[2][(i + 1) % 4]][j];
            }
        }
        
    }
    else{
        for (int i = 0; i < 4; i++){
            for (int j = 0; j<3; j++){
                colors[rotate[1][i]][j] = temp[rotate[1][(i + 1) % 4]][j];
            }
        }
    }
}
cs


동작

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
 
void turnFuc(int xyz, int val, int dir){
    int cubeRet[3], a=0;
    GLfloat temp[6][3];
    GLfloat col[9][6][3];
 
 
    for (int i = 0; i < 3; i++){
        for (int j = 0; j < 9; j++){
            cube[i][j].getLocation(cubeRet);
            if (cubeRet[xyz] == val){
 
 
                cube[i][j].getColor(temp);
                for (int l = 0; l < 6; l++){
                    for (int k = 0; k < 3; k++)
                        col[a][l][k] = temp[l][k];
                }
                a++;
                
            }
        }
    }
    
    a = 0;
    for (int i = 0; i < 3; i++){
        for (int j = 0; j < 9; j++){
            cube[i][j].getLocation(cubeRet);
            if (cubeRet[xyz] == val){
                cube[i][j].setColor(col[rot[a++]]);
 
            }
        }
    }
 
    for (int i = 0; i < 3; i++){
        for (int j = 0; j < 9; j++){
            cube[i][j].getLocation(cubeRet);
            if (cubeRet[xyz] == val){
 
 
                if (xyz == 0){
                cube[i][j].setAngle(0900);
                }
                else if (xyz == 1){
                cube[i][j].setAngle(9000);
                }
                else if (xyz == 2)
                cube[i][j].setAngle(0090);
                
 
            }
        }
    }
}
 
void MyKeyboard(unsigned char key, int x, int y){
 
    switch (key){
 
    case 'a':
        turnFuc(01,0);
        break;
    case 's':
        turnFuc(02,0);
        break
    case 'd':
        turnFuc(03,4);
        break;
 
    case 'z':
        turnFuc(111);
        break;
    case 'x':
        turnFuc(120);
        break;
    case 'c':
        turnFuc(133);
        break;
 
    case 'q':
        turnFuc(212);
        break;
    case 'w':
        turnFuc(222);
        break;
    case 'e':
        turnFuc(232);
        break;
    }
 
    glutDisplayFunc(MyDisplay);
 
    glutPostRedisplay();
}
 
cs



 결과

 





반응형

'개발 > Open GL' 카테고리의 다른 글

루빅스 큐브 만들기2  (0) 2014.12.08
루빅스 큐브 만들기1  (0) 2014.11.22
이미지 불러오기  (0) 2014.11.21
정육면체 그리기  (0) 2014.11.21
도형 그리기 및 이동  (0) 2014.11.03

루빅스 큐브 만들기2

Posted by 백창
2014. 12. 8. 20:42 개발/Open GL
반응형


 개요

 

 cube 객체를 생성하고 27개의 작은 정육면체로 큰 정육면체를 만들기



 간단한 설명

 

클래스를 작성하여 반복문으로 각 위치를 설정해주고 정육면체를 그린다.


생각나는데로 만들어서 노가다성 코드가 많음.







 좌표설정 및 칼라 설정

 

가장 간단한 노가다로 처리


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
static GLfloat vertices[3][9][8][3] = {
    //Front
    {
        //Top
        {
            { -0.5, 0.5, 0.2 }, { -0.5, 0.5, 0.5 }, { -0.2, 0.5, 0.5 }, { -0.2, 0.5, 0.2 }, { -0.5, 0.2, 0.2 }, { -0.5, 0.2, 0.5 }, { -0.2, 0.2, 0.5 }, { -0.2, 0.2, 0.2 }
        },
        {
            { -0.15, 0.5, 0.2 }, { -0.15, 0.5, 0.5 }, { 0.15, 0.5, 0.5 }, { 0.15, 0.5, 0.2 }, { -0.15, 0.2, 0.2 }, { -0.15, 0.2, 0.5 }, { 0.15, 0.2, 0.5 }, { 0.15, 0.2, 0.2 }
        },
        {
            { 0.2, 0.5, 0.2 }, { 0.2, 0.5, 0.5 }, { 0.5, 0.5, 0.5 }, { 0.5, 0.5, 0.2 }, { 0.2, 0.2, 0.2 }, { 0.2, 0.2, 0.5 }, { 0.5, 0.2, 0.5 }, { 0.5, 0.2, 0.2 }
        },
            //Mid
        {
            { -0.5, 0.5, -0.15 }, { -0.5, 0.5, 0.15 }, { -0.2, 0.5, 0.15 }, { -0.2, 0.5, -0.15 }, { -0.5, 0.2, -0.15 }, { -0.5, 0.2, 0.15 }, { -0.2, 0.2, 0.15 }, { -0.2, 0.2, -0.15 }
        },
        {
            { -0.15, 0.5, -0.15 }, { -0.15, 0.5, 0.15 }, { 0.15, 0.5, 0.15 }, { 0.15, 0.5, -0.15 }, { -0.15, 0.2, -0.15 }, { -0.15, 0.2, 0.15 }, { 0.15, 0.2, 0.15 }, { 0.15, 0.2, -0.15 }
        },
        {
            { 0.2, 0.5, -0.15 }, { 0.2, 0.5, 0.15 }, { 0.5, 0.5, 0.15 }, { 0.5, 0.5, -0.15 }, { 0.2, 0.2, -0.15 }, { 0.2, 0.2, 0.15 }, { 0.5, 0.2, 0.15 }, { 0.5, 0.2, -0.15 }
        },
            //Bot
        {
            { -0.5, 0.5, -0.5 }, { -0.5, 0.5, -0.2 }, { -0.2, 0.5, -0.2 }, { -0.2, 0.5, -0.5 }, { -0.5, 0.2, -0.5 }, { -0.5, 0.2, -0.2 }, { -0.2, 0.2, -0.2 }, { -0.2, 0.2, -0.5 }
            
        },
        {
            { -0.15, 0.5, -0.5 }, { -0.15, 0.5, -0.2 }, { 0.15, 0.5, -0.2 }, { 0.15, 0.5, -0.5 }, { -0.15, 0.2, -0.5 }, { -0.15, 0.2, -0.2 }, { 0.15, 0.2, -0.2 }, { 0.15, 0.2, -0.5 }
        },
        {
            { 0.2, 0.5, -0.5 }, { 0.2, 0.5, -0.2 }, { 0.5, 0.5, -0.2 }, { 0.5, 0.5, -0.5 }, { 0.2, 0.2, -0.5 }, { 0.2, 0.2, -0.2 }, { 0.5, 0.2, -0.2 }, { 0.5, 0.2, -0.5 }
        }
    },
        //Middle
    {
        //Top
        {
            { -0.5, 0.15, 0.2 }, { -0.5, 0.15, 0.5 }, { -0.2, 0.15, 0.5 }, { -0.2, 0.15, 0.2 }, { -0.5, -0.15, 0.2 }, { -0.5, -0.15, 0.5 }, { -0.2, -0.15, 0.5 }, { -0.2, -0.15, 0.2 }
        },
        {
            { -0.15, 0.15, 0.2 }, { -0.15, 0.15, 0.5 }, { 0.15, 0.15, 0.5 }, { 0.15, 0.15, 0.2 }, { -0.15, -0.15, 0.2 }, { -0.15, -0.15, 0.5 }, { 0.15, -0.15, 0.5 }, { 0.15, -0.15, 0.2 }
        },
        {
            { 0.2, 0.15, 0.2 }, { 0.2, 0.15, 0.5 }, { 0.5, 0.15, 0.5 }, { 0.5, 0.15, 0.2 }, { 0.2, -0.15, 0.2 }, { 0.2, -0.15, 0.5 }, { 0.5, -0.15, 0.5 }, { 0.5, -0.15, 0.2 }
        },
            //Mid
        {
            { -0.5, 0.15, -0.15 }, { -0.5, 0.15, 0.15 }, { -0.2, 0.15, 0.15 }, { -0.2, 0.15, -0.15 }, { -0.5, -0.15, -0.15 }, { -0.5, -0.15, 0.15 }, { -0.2, -0.15, 0.15 }, { -0.2, -0.15, -0.15 }
        },
        { //Black One - Center Cube
            { -0.35, 0.35, -0.35 }, { -0.35, 0.35, 0.35 }, { 0.35, 0.35, 0.35 }, { 0.35, 0.35, -0.35 }, { -0.35, -0.35, -0.35 }, { -0.35, -0.35, 0.35 }, { 0.35, -0.35, 0.35 }, { 0.35, -0.35, -0.35 }
        },
        {
            { 0.2, 0.15, -0.15 }, { 0.2, 0.15, 0.15 }, { 0.5, 0.15, 0.15 }, { 0.5, 0.15, -0.15 }, { 0.2, -0.15, -0.15 }, { 0.2, -0.15, 0.15 }, { 0.5, -0.15, 0.15 }, { 0.5, -0.15, -0.15 }
        },
            //Bot
        {
            { -0.5, 0.15, -0.5 }, { -0.5, 0.15, -0.2 }, { -0.2, 0.15, -0.2 }, { -0.2, 0.15, -0.5 }, { -0.5, -0.15, -0.5 }, { -0.5, -0.15, -0.2 }, { -0.2, -0.15, -0.2 }, { -0.2, -0.15, -0.5 }
        },
        {
            { -0.15, 0.15, -0.5 }, { -0.15, 0.15, -0.2 }, { 0.15, 0.15, -0.2 }, { 0.15, 0.15, -0.5 }, { -0.15, -0.15, -0.5 }, { -0.15, -0.15, -0.2 }, { 0.15, -0.15, -0.2 }, { 0.15, -0.15, -0.5 }
        },
        {
            { 0.2, 0.15, -0.5 }, { 0.2, 0.15, -0.2 }, { 0.5, 0.15, -0.2 }, { 0.5, 0.15, -0.5 }, { 0.2, -0.15, -0.5 }, { 0.2, -0.15, -0.2 }, { 0.5, -0.15, -0.2 }, { 0.5, -0.15, -0.5 }
            
        }
    },
        //Back
    {
        //Top
        {
            { -0.5, -0.2, 0.2 }, { -0.5, -0.2, 0.5 }, { -0.2, -0.2, 0.5 }, { -0.2, -0.2, 0.2 }, { -0.5, -0.5, 0.2 }, { -0.5, -0.5, 0.5 }, { -0.2, -0.5, 0.5 }, { -0.2, -0.5, 0.2 }
        },
        {
            { -0.15, -0.2, 0.2 }, { -0.15, -0.2, 0.5 }, { 0.15, -0.2, 0.5 }, { 0.15, -0.2, 0.2 }, { -0.15, -0.5, 0.2 }, { -0.15, -0.5, 0.5 }, { 0.15, -0.5, 0.5 }, { 0.15, -0.5, 0.2 }
        },
        {
            { 0.2, -0.2, 0.2 }, { 0.2, -0.2, 0.5 }, { 0.5, -0.2, 0.5 }, { 0.5, -0.2, 0.2 }, { 0.2, -0.5, 0.2 }, { 0.2, -0.5, 0.5 }, { 0.5, -0.5, 0.5 }, { 0.5, -0.5, 0.2 }
        },
            //Mid
        {
            { -0.5, -0.2, -0.15 }, { -0.5, -0.2, 0.15 }, { -0.2, -0.2, 0.15 }, { -0.2, -0.2, -0.15 }, { -0.5, -0.5, -0.15 }, { -0.5, -0.5, 0.15 }, { -0.2, -0.5, 0.15 }, { -0.2, -0.5, -0.15 }
        },
        {
            { -0.15, -0.2, -0.15 }, { -0.15, -0.2, 0.15 }, { 0.15, -0.2, 0.15 }, { 0.15, -0.2, -0.15 }, { -0.15, -0.5, -0.15 }, { -0.15, -0.5, 0.15 }, { 0.15, -0.5, 0.15 }, { 0.15, -0.5, -0.15 }
        },
        {
            { 0.2, -0.2, -0.15 }, { 0.2, -0.2, 0.15 }, { 0.5, -0.2, 0.15 }, { 0.5, -0.2, -0.15 }, { 0.2, -0.5, -0.15 }, { 0.2, -0.5, 0.15 }, { 0.5, -0.5, 0.15 }, { 0.5, -0.5, -0.15 }
        },
 
            //Bot
        {
            { -0.5, -0.2, -0.5 }, { -0.5, -0.2, -0.2 }, { -0.2, -0.2, -0.2 }, { -0.2, -0.2, -0.5 }, { -0.5, -0.5, -0.5 }, { -0.5, -0.5, -0.2 }, { -0.2, -0.5, -0.2 }, { -0.2, -0.5, -0.5 }
        },
        {
            { -0.15, -0.2, -0.5 }, { -0.15, -0.2, -0.2 }, { 0.15, -0.2, -0.2 }, { 0.15, -0.2, -0.5 }, { -0.15, -0.5, -0.5 }, { -0.15, -0.5, -0.2 }, { 0.15, -0.5, -0.2 }, { 0.15, -0.5, -0.5 }
        },
        {
            { 0.2, -0.2, -0.5 }, { 0.2, -0.2, -0.2 }, { 0.5, -0.2, -0.2 }, { 0.5, -0.2, -0.5 }, { 0.2, -0.5, -0.5 }, { 0.2, -0.5, -0.2 }, { 0.5, -0.5, -0.2 }, { 0.5, -0.5, -0.5 }
            
        }
    }
};
 
GLfloat primary_colors[][3] = {
    { 1.0, 0.0, 0.0 },      // red  
    { 1.0, 1.0, 0.0 },      // yellow  
    { 0.0, 1.0, 0.0 },      // green  
    { 0.0, 0.0, 1.0 },      // blue  
    { 1.0, 1.0, 1.0 },      // gold
    { 1.0, 0.0, 1.0 }        // magenta  
};     




 클래스 생성

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
 
class Cube{
private:
    GLfloat vertices[8][3];
    GLfloat colors[6][3];
    int location[3];
    
 
public:
    void setPosition(GLfloat set[8][3]);
 
    void setLocation(int loc[3]);
    void getLocation(int *ptr);
 
    void setColor(GLfloat set[6][3]);
    void getColor(GLfloat get[6][3]);
 
    void setAngle(int new_angleX, int new_angleY, int new_angleZ);
 
    void drawCube();
    void drawBlackCube();
        
};
 
 
void Cube::setColor(GLfloat set[6][3]){
    for (int i = 0; i<6; i++){
        for (int j = 0; j<3; j++){
            colors[i][j] = set[i][j];
        }
    }
}
 
 
void Cube::getColor(GLfloat get[6][3]){
    for (int i = 0; i < 6; i++){
        for (int j = 0; j < 3; j++){
            get[i][j] = colors[i][j];
        }
    }
}
 
/**
* Cube 위치 설정
*/
void Cube::setLocation(int loc[3]){
    for (int i = 0; i < 3; i++){
        location[i] = loc[i];
    }
}
 
/**
* Cube 위치 반환
*/
void Cube::getLocation(int *ptr){
    for (int i = 0; i < 3; i++){
        ptr[i] = location[i];
    }
 
}
 
/**
* Cube 위치 좌표 설정
*/
void Cube::setPosition(GLfloat set[8][3]){
    for (int i = 0; i < 8; i++){
        for (int j = 0; j < 3; j++){
            vertices[i][j] = set[i][j];
        }
    }
 
}
/**
* Cube 그리기
*/
void Cube::drawCube(){
    
    glBegin(GL_QUADS);
    
    glColor3fv(colors[0]);
    glNormal3f(0.0f, 1.0f, 0.0f);//top
    glVertex3fv(vertices[0]);
    glVertex3fv(vertices[3]);
    glVertex3fv(vertices[2]);
    glVertex3fv(vertices[1]);
    
    glColor3fv(colors[1]);
    glNormal3f(0.0f, 0.0f, 1.0f);//front
    glVertex3fv(vertices[1]);
    glVertex3fv(vertices[2]);
    glVertex3fv(vertices[6]);
    glVertex3fv(vertices[5]);
    
    glColor3fv(colors[2]);
    glNormal3f(1.0f, 0.0f, 0.0f);//right
    glVertex3fv(vertices[3]);
    glVertex3fv(vertices[7]);
    glVertex3fv(vertices[6]);
    glVertex3fv(vertices[2]);
    
    
    glColor3fv(colors[3]);
    glNormal3f(0.0f, 0.0f, -1.0f);//back
    glVertex3fv(vertices[0]);
    glVertex3fv(vertices[3]);
    glVertex3fv(vertices[7]);
    glVertex3fv(vertices[4]);
    
    glColor3fv(colors[4]);
    glNormal3f(0.0f, -1.0f, 0.0f);//buttom
    glVertex3fv(vertices[7]);
    glVertex3fv(vertices[4]);
    glVertex3fv(vertices[5]);
    glVertex3fv(vertices[6]);
    
    glColor3fv(colors[5]);
    glNormal3f(-1.0f, 0.0f, 0.0f);//left 
    glVertex3fv(vertices[4]);
    glVertex3fv(vertices[0]);
    glVertex3fv(vertices[1]);
    glVertex3fv(vertices[5]);
    
    glEnd();            // End Drawing The Cube
}
/**
* Center Cube 그리기
*/
void Cube::drawBlackCube(){
 
    glBegin(GL_QUADS);
    glColor3f(0.5f, 0.5f, 0.5f);
    glVertex3fv(vertices[0]);
    glVertex3fv(vertices[3]);
    glVertex3fv(vertices[2]);
    glVertex3fv(vertices[1]);
 
    glColor3f(0.5f, 0.5f, 0.5f);
    glVertex3fv(vertices[1]);
    glVertex3fv(vertices[2]);
    glVertex3fv(vertices[6]);
    glVertex3fv(vertices[5]);
 
    glColor3f(0.5f, 0.5f, 0.5f);
    glVertex3fv(vertices[3]);
    glVertex3fv(vertices[7]);
    glVertex3fv(vertices[6]);
    glVertex3fv(vertices[2]);
 
    glColor3f(0.5f, 0.5f, 0.5f);
    glVertex3fv(vertices[0]);
    glVertex3fv(vertices[3]);
    glVertex3fv(vertices[7]);
    glVertex3fv(vertices[4]);
 
    glColor3f(0.5f, 0.5f, 0.5f);
    glVertex3fv(vertices[7]);
    glVertex3fv(vertices[4]);
    glVertex3fv(vertices[5]);
    glVertex3fv(vertices[6]);
 
    glColor3f(0.5f, 0.5f, 0.5f);
    glVertex3fv(vertices[4]);
    glVertex3fv(vertices[0]);
    glVertex3fv(vertices[1]);
    glVertex3fv(vertices[5]);
 
    glEnd();            // End Drawing The Cube
}




 Display Func

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
 
void setAllCube(){
 
    /**************** 큐브 초기 좌표 설정 *****************/
    for (int i = 0; i < 3; i++){
        for (int j = 0; j < 9; j++){
            cube[i][j].setPosition(vertices[i][j]);
            cube[i][j].setLocation(primaryLocation[i][j]);
            cube[i][j].setColor(primary_colors);
        }
    }
}
 
void drawAllCube(){
 
    for (int a = 0; a < 3; a++){
        for (int b = 0; b < 9; b++){
 
            for (int i = 0; i < 3; i++){
                for (int j = 0; j < 9; j++){
 
                    int save[3];
                    int cnt = 0;
 
                    cube[i][j].getLocation(save);
                    
                    //위치에 맞는 큐브를 선택
                    for (int k = 0; k < 3; k++){
                        if (primaryLocation[a][b][k] == save[k]){
                            cnt++;
                        }
                    }
                    if (cnt == 3){
 
                        glPushMatrix();
                        if (i == 1 && j == 4)
                            cube[i][j].drawBlackCube();
                        else
                            cube[i][j].drawCube();
 
                        glPopMatrix();
                    }
                }
            }
        }
    }
 
    
}
 
 
void Init(){
 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(700, 700);
    glutInitWindowPosition(0, 0);
 
 
    glutCreateWindow("Rubik\'s Cube");
 
 
//    glClearColor(1.0, 1.0, 1.0, 0.0);
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
 
    glEnable(GL_DEPTH_TEST);
 
    setAllCube();
}
 
 
void MyDisplay(){
    
    
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
 
    glPopMatrix();
    glRotatef(g_fSpinY, 1.0f, 0.0f, 0.0f);
    glRotatef(g_fSpinX, 0.0f, 0.0f, 1.0f);
 
    drawAllCube();
 
    glPopMatrix(); 
    glutSwapBuffers();
    glFlush();
    
}
 


반응형

'개발 > Open GL' 카테고리의 다른 글

루빅스 큐브 만들기3  (3) 2014.12.24
루빅스 큐브 만들기1  (0) 2014.11.22
이미지 불러오기  (0) 2014.11.21
정육면체 그리기  (0) 2014.11.21
도형 그리기 및 이동  (0) 2014.11.03

루빅스 큐브 만들기1

Posted by 백창
2014. 11. 22. 15:03 개발/Open GL
반응형


 개요

 

 Open GL을 사용하여 어릴때 가지고 놀던 장난감, 루빅스 큐브를 만들어 보도록 하자.




 설계

 

 각각의 정육면체를 Class로 생성, 각각의 객체에 3차원 좌표와 각 면의 색깔을 지정해준다.


 그리고 회전하고자 하는 면의 좌표를 선택하여 아래와 같은 규칙을 따라 회전 시킨다. 


(나는 좌표 값을 사용하지 않고 각 객체가 위치한 좌표를 식별하기 편하게 1 , 2 , 3 으로 주었다.)


(반대 방향으로 회전하고자 하는 경우 규칙을 반대로 적용하면 된다.)




단면을 봤을 때 위와 같은 규칙으로 회전하고 전체적인 그림을 봤을때 색깔의 변경은 아래와 같다.



반응형

'개발 > Open GL' 카테고리의 다른 글

루빅스 큐브 만들기3  (3) 2014.12.24
루빅스 큐브 만들기2  (0) 2014.12.08
이미지 불러오기  (0) 2014.11.21
정육면체 그리기  (0) 2014.11.21
도형 그리기 및 이동  (0) 2014.11.03

이미지 불러오기

Posted by 백창
2014. 11. 21. 14:48 개발/Open GL
반응형


 개요

 

 이미지를 불러오기 위해 하는 프로젝트 설정



 설정

 


다음과 같이 포인터에 저장 후 사용


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void loadTexture(void) {
    AUX_RGBImageRec *pTextureImage = auxDIBImageLoad("flower.bmp");
 
    if (pTextureImage != NULL) {
        glGenTextures(1, &g_textureID);
 
        glBindTexture(GL_TEXTURE_2D, g_textureID);
 
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 
        glTexImage2D(GL_TEXTURE_2D, 0, 3, pTextureImage->sizeX, pTextureImage->sizeY, 0,
            GL_RGB, GL_UNSIGNED_BYTE, pTextureImage->data);
    }
 
    if (pTextureImage) {
        if (pTextureImage->data)
            free(pTextureImage->data);
 
        free(pTextureImage);
    }
}


반응형

'개발 > Open GL' 카테고리의 다른 글

루빅스 큐브 만들기2  (0) 2014.12.08
루빅스 큐브 만들기1  (0) 2014.11.22
정육면체 그리기  (0) 2014.11.21
도형 그리기 및 이동  (0) 2014.11.03
[빌드 오류] failure during conversion to COFF: file invalid or corrupt  (0) 2014.10.17

정육면체 그리기

Posted by 백창
2014. 11. 21. 10:56 개발/Open GL
반응형


 개요

 

 사각형을 이용해 정육면체 즉, 큐브를 그려보자



 코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <gl/glut.h>
 
GLfloat vertices[][3] = {
    { -0.5, 0.5, -0.5 }, 
    { -0.5, 0.5, 0.5 }, 
    { 0.5, 0.5, 0.5 }, 
    { 0.5, 0.5, -0.5 }, 
    { -0.5, -0.5, -0.5 }, 
    { -0.5, -0.5, 0.5 }, 
    { 0.5, -0.5, 0.5 }, 
    { 0.5, -0.5, -0.5 }
};
 
GLfloat colors[][3] = {
    { 1.0, 0.0, 0.0 },      // red  
    { 1.0, 1.0, 0.0 },      // yellow  
    { 0.0, 1.0, 0.0 },      // green  
    { 0.0, 0.0, 1.0 },      // blue  
    { 0.5, 0.5, 0.0 },      // gold
    { 1.0, 0.0, 1.0 }        // magenta  
};
 
 
void display(){
 
 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
    glTranslatef(0.0f, 0.0f, 0.0f);
    glRotatef(30, 1.0f, 0.0f, 0.0f);
    glRotatef(30, 0.0f, 0.0f, 1.0f);
 
    glBegin(GL_QUADS);
 
    glColor3fv(colors[0]);
    glVertex3fv(vertices[0]);
    glVertex3fv(vertices[3]);
    glVertex3fv(vertices[2]);
    glVertex3fv(vertices[1]);
 
    glColor3fv(colors[1]);
    glVertex3fv(vertices[1]);
    glVertex3fv(vertices[2]);
    glVertex3fv(vertices[6]);
    glVertex3fv(vertices[5]);
 
    glColor3fv(colors[2]);
    glVertex3fv(vertices[3]);
    glVertex3fv(vertices[7]);
    glVertex3fv(vertices[6]);
    glVertex3fv(vertices[2]);
 
    glColor3fv(colors[3]);
    glVertex3fv(vertices[0]);
    glVertex3fv(vertices[3]);
    glVertex3fv(vertices[7]);
    glVertex3fv(vertices[4]);
 
    glColor3fv(colors[4]);
    glVertex3fv(vertices[7]);
    glVertex3fv(vertices[4]);
    glVertex3fv(vertices[5]);
    glVertex3fv(vertices[6]);
 
    glColor3fv(colors[5]);
    glVertex3fv(vertices[4]);
    glVertex3fv(vertices[0]);
    glVertex3fv(vertices[1]);
    glVertex3fv(vertices[5]);
 
    glEnd();            // End Drawing The Cube
 
    glutSwapBuffers();
}
 
 
void Init(){
 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(700, 700);
    glutInitWindowPosition(0, 0);
 
    glutCreateWindow("Cube");
 
    glClearColor(1.0, 1.0, 1.0, 1.0);
 
    glEnable(GL_DEPTH_TEST);
 
}
 
int main(int argc, char **argv){
    glutInit(&argc, argv);
 
    Init();
 
    glutDisplayFunc(display);
    glutMainLoop();
 
    return 0;
}



 결과

 




 참고

 

 glEnable(GL_DEPTH_TEST) 를 사용하지 않으면 어떤 도형이 화면과 가까운지 체크할 수 없어 앞면과 뒷면이 구분되지 않는 문제가 발생한다.

반응형

'개발 > Open GL' 카테고리의 다른 글

루빅스 큐브 만들기1  (0) 2014.11.22
이미지 불러오기  (0) 2014.11.21
도형 그리기 및 이동  (0) 2014.11.03
[빌드 오류] failure during conversion to COFF: file invalid or corrupt  (0) 2014.10.17
Menu & SubMenu 생성  (11) 2014.10.09

도형 그리기 및 이동

Posted by 백창
2014. 11. 3. 10:19 개발/Open GL
반응형


 개요

 

마우스 드래그로 도형을 그리고 키보드 방향키를 눌렀을 때 그려진 도형이 이동


 소스

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <gl/glut.h>
#include <stdio.h>
 
/**
* 도형이동크기
*/
#define Move 0.05
 
/**
* Mouse 좌표 계산
*/
GLint TopLeftX, TopLeftY, BottomRightX, BottomRightY;
/**
* 현재 도형 좌표
*/
GLdouble X1, X2, Y1, Y2;
 
/**
* My Display
*/
void MyDisplay(){
    glViewport(0, 0, 500, 500);
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.5, 0.5, 0.5);
 
    glBegin(GL_POLYGON);
 
    glVertex3f(X1, Y1, 0.0);
    glVertex3f(X1, Y2, 0.0);
    glVertex3f(X2, Y2, 0.0);
    glVertex3f(X2, Y1, 0.0);
 
    glEnd();
    glFlush();
}
 
/**
* Start Mouse
*/
void MyMouseClick(GLint Button, GLint State, GLint X, GLint Y){
    if (Button == GLUT_LEFT_BUTTON && State == GLUT_DOWN){
        TopLeftX = X;
        TopLeftY = Y;
    }
}
 
void MyMouseMove(GLint X, GLint Y){
    BottomRightX = X;
    BottomRightY = Y;
 
    //마우스로 인해 그려지는 도형의 좌표 값
    X1 = TopLeftX / 500.0;
    X2 = BottomRightX / 500.0;
    Y1 = (500 - TopLeftY) / 500.0;
    Y2 = (500 - BottomRightY) / 500.0;
 
    glutPostRedisplay();
}
/**
* End Mouse
*/
 
void MySpecial(int key, int x, int y){
    //키보드 방향에 따른 위치이동
    switch (key){
    case GLUT_KEY_LEFT:
        X1 -= Move;
        X2 -= Move;
        printf("[Debug] : left %f,%f\n", X1, X2);
        break;
    case GLUT_KEY_RIGHT:
        X1 += Move;
        X2 += Move;
        break;
    case GLUT_KEY_UP:
        Y1 += Move;
        Y2 += Move;
        break;
    case GLUT_KEY_DOWN:
        Y1 -= Move;
        Y2 -= Move;
        break;
    }
 
    glutPostRedisplay();
}
 
void MyInit(){
    glClearColor(1.0, 1.0, 1.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
 
    glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
}
 
int main(int argc, char **argv){
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB);
    glutInitWindowSize(500, 500);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("Second");
    MyInit();
    glutDisplayFunc(MyDisplay);
    glutMouseFunc(MyMouseClick);
    glutMotionFunc(MyMouseMove);
    glutSpecialFunc(MySpecial);
 
    glutMainLoop();
    return 0;
}



 결과

 


반응형

'개발 > Open GL' 카테고리의 다른 글

이미지 불러오기  (0) 2014.11.21
정육면체 그리기  (0) 2014.11.21
[빌드 오류] failure during conversion to COFF: file invalid or corrupt  (0) 2014.10.17
Menu & SubMenu 생성  (11) 2014.10.09
freeglut API 설치  (0) 2014.09.29

[빌드 오류] failure during conversion to COFF: file invalid or corrupt

Posted by 백창
2014. 10. 17. 14:18 개발/Open GL
반응형


 개요

 

 Visual Studio 2010 에서 빌드를 할 때 다음과 같은 오류가 발생했을때의 해결방법.


failure during conversion to COFF: file invalid or corrupt



 해결

 

프로젝트 속성에서 Manifest Tool -> input and Output -> Embed Manifest 설정을 NO로 변경해준다.



반응형

'개발 > Open GL' 카테고리의 다른 글

정육면체 그리기  (0) 2014.11.21
도형 그리기 및 이동  (0) 2014.11.03
Menu & SubMenu 생성  (11) 2014.10.09
freeglut API 설치  (0) 2014.09.29
Open GL 설치  (0) 2014.09.12

Menu & SubMenu 생성

Posted by 백창
2014. 10. 9. 21:53 개발/Open GL
반응형


 개요

 

OpenGL에서 마우스 오른쪽 버튼을 누르면 나타나는 메뉴를 만들어보자.



 핵심코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 
void MyMainMenu(int entryID) {
    if (entryID == 1)       exit(0);
 
    glutPostRedisplay();
}
 
/**
* Sphere Size Menu
*/
void SphereSizeMenu(int entryID) {
    if (entryID == 1){
        IsShape = 1;
        IsSmall = true;
    }
    else if (entryID == 2){
        IsShape = 1;
        IsSmall = false;
    }
    glutPostRedisplay();
}
 
 
void MyInit() {
    glClearColor(1.0, 1.0, 1.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
 
    glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
 
    /**
    * Sphere Size Menu
    */
    GLint SpereSizeID = glutCreateMenu(SphereSizeMenu);
    glutAddMenuEntry("Small Sphere", 1);
    glutAddMenuEntry("Large Sphere", 2);
 
 
    /**
    * Show the Menu
    */
    GLint MyMainMenuID = glutCreateMenu(MyMainMenu);
    glutAddSubMenu("Draw Sphere", SpereSizeID);
    glutAddSubMenu("Draw Torus", TorusSizeID);
    glutAddSubMenu("Draw Teapot", TeapotSizeID);
    glutAddSubMenu("Change Color", ChangeColorID);
}


위 코드와 같이 메뉴를 설정해주는 함수를 만들고 마지막 부분에 다시 출력해주는 glutPostRedisplay() 함수를 사용해준다.


 그리고 초기화 과정에서 방금 사용한 함수를 호출하고 메뉴 또는 서브메뉴를 추가해주면 된다.



 결과

 


마우스 오른쪽 버튼을 누르면 다음 메뉴들이 나오고 서브 메뉴도 나온다



변경된 화면

반응형

'개발 > Open GL' 카테고리의 다른 글

정육면체 그리기  (0) 2014.11.21
도형 그리기 및 이동  (0) 2014.11.03
[빌드 오류] failure during conversion to COFF: file invalid or corrupt  (0) 2014.10.17
freeglut API 설치  (0) 2014.09.29
Open GL 설치  (0) 2014.09.12

freeglut API 설치

Posted by 백창
2014. 9. 29. 19:52 개발/Open GL
반응형



 개요


freeglut API를 설치하여 마우스 휠을 사용해 좌표를 수정해보자


 API 다운로드 및 설치


http://www.transmissionzero.co.uk/software/freeglut-devel/ 사이트에서 api를 다운받는다.



다운 받은 파일을 압축해제하고 다음 위치에 각각 파일을 넣는다.


Classification 

Folder Location

Files 

 Header File

C:\Program Files(x86)\Microsoft Visual Studio 12.0\VC\include\gl

freeglut.h

freeglut_ext.h

freeglut_std.h

 Library File

C:\Program Files(x86)\Microsoft Visual Studio 12.0\VC\lib

freeglut.lib

 Dynamic Link Library File

C:\Windows\System32

C:\Windows\SysWOW64

freeglut.dll





반응형

'개발 > Open GL' 카테고리의 다른 글

정육면체 그리기  (0) 2014.11.21
도형 그리기 및 이동  (0) 2014.11.03
[빌드 오류] failure during conversion to COFF: file invalid or corrupt  (0) 2014.10.17
Menu & SubMenu 생성  (11) 2014.10.09
Open GL 설치  (0) 2014.09.12

Open GL 설치

Posted by 백창
2014. 9. 12. 16:55 개발/Open GL
반응형


 API 다운로드 및 설치



 Library

 Internet Address

 GL

GLU

GLAUX

ftp://ftp.microsoft.com/softlib/mslfiles/opengl95.exe 

 GLUT

http://user.xmission.com/~nate/glut.html


GLUT 다운로드 사이트 화면


glut-3.7.6-bin.zip 파일을 다운로드 한다.


압축 해제 후 각 파일을 다음 폴더에 넣는다.


64bit 운영체제 기준입니다.


Classification 

Folder Location

Files 

 Header File

C:\Program Files(x86)\Microsoft Visual Studio 12.0\VC\include\gl

gl.h

glaux.h

glu.h

glut.h

 Library File

C:\Program Files(x86)\Microsoft Visual Studio 12.0\VC\lib

glaux.lib

glu32.lib

glut32.lib

opengl32.lib

 Dynamic Link Library File

C:\Windows\System32

C:\Windows\SysWOW64

 glu32.dll

glut32.dll

opengl32.dll


추가할 DLL파일은 3개 인데 두개는 이미 존재한다고한다. 그래서 일단 추가하지 않았음



 프로젝트 생성





 코드 작성


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <gl/glut.h>
#include <math.h>
 
#define    Pi    3.1415
 
void MyDisplay(){
    GLfloat Size[2], Angle;
 
    glClear(GL_COLOR_BUFFER_BIT);        //상태변수 설정, GL 버퍼를 초기화해라. 1번 칼라를 사용해라
    glColor3f(0.0, 0.0, 0.0);
 
    glGetFloatv(GL_POINT_SIZE_RANGE, Size);
 
    glPointSize(Size[0] * 10);
    glBegin(GL_POINTS);
 
    //계산
    for (Angle = 0.0; Angle <= 2.0*Pi; Angle += Pi / 20.0){
        glVertex3f(0.5*cos(Angle), 0.5*sin(Angle), 0.0);
    }
 
    glEnd();
    glFlush();
}
 
int main(int argc, char **argv){
 
    glutInit(&argc, argv);            //glut 라이브러리를 초기화 하고 윈도우와 연결하는 세션을 만들어라
 
    glutInitDisplayMode(GLUT_RGBA);  //윈도우의 기본 컬러모드를 RGBA로 설정
    glutInitWindowSize(500, 500);        //크기
    glutInitWindowPosition(0, 0);         //시작위치
    glutCreateWindow("Hello");           //타이틀
 
    glClearColor(1.0, 1.0, 1.0, 1.0);   //1번 칼라 (0~1 값을 가지고, 마지막 A는 불투명도 이다)
    glutDisplayFunc(MyDisplay);         //콜백함수 실행
    glutMainLoop();
    return 0;
}


 실습



반응형

'개발 > Open GL' 카테고리의 다른 글

정육면체 그리기  (0) 2014.11.21
도형 그리기 및 이동  (0) 2014.11.03
[빌드 오류] failure during conversion to COFF: file invalid or corrupt  (0) 2014.10.17
Menu & SubMenu 생성  (11) 2014.10.09
freeglut API 설치  (0) 2014.09.29