OpenGL程序設計結構
以老版的opengl為例
// OpenGLOld.cpp : 定義控制台應用程序的入口點。
//
#include <GL/glew.h>
#include <GL/glut.h>
void init(void){
glClearColor(1.0, 1.0, 1.0, 1.0);//設置背景色白色
}
void display(void){
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);//圖形類型,GL_LINES為線段
glColor3f(1.0f,0.0f,0.0f);//指定頂點顏色
glVertex2f(100.0f,100.0f);//指定頂點坐標
glColor3f(0.0f,1.0f,0.0f);
glVertex2f(500.0f,100.0f);
glColor3f(0.0f,0.0f,1.0f);
glVertex2f(300.0f,400.0f);
glEnd();
//glFlush();//單緩沖時必須要,說明繪圖命令(函數)結束
glutSwapBuffers();//交換緩沖(雙緩沖時使用)
}
void reshape(int width, int height){
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, width, 0, height);
glMatrixMode(GL_MODELVIEW);
}
void keyboard(unsigned char key, int x, int y){
}
int main(int argc, char* argv[]){
glutInitWindowPosition(200, 200);
glutInitWindowSize(800, 600);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);//雙緩沖,單緩沖為GLUT_SINGLE
glutCreateWindow("OpenGL Old");
init();
glutDisplayFunc(display);//圖形繪制
glutReshapeFunc(reshape);//窗口大小變化
glutKeyboardFunc(keyboard);//鍵盤交互
glutMainLoop();
return 0;
}
遇到的問題:gluOrtho2D(0, width, 0, height);
有問題,查了很多資料也解決不了
所以就改成glOrtho(-width,width,-height,height, -1,1);
在原理上等於glOrtho(-width,width,-height,height)
這個函數的功能:待更
繪圖實例
線段
glBegin(GL_LINES)
//畫線glBegin(GL_LINE_STRIP)
glBegin(GL_LINE_LOOP)
//一條線
glColor3f(0,0,1);
glBegin(GL_LINES);
glVertex2f(-110,0);
glVertex2f(-200,30);
glEnd();
//圖形線圍成圖形
glBegin(GL_LINE_LOOP);
glVertex2f(30,30);
glVertex2f(100,100);
glVertex2f(100,200);
glVertex2f(50,100);
glEnd();
填充圖形
glBegin(GL_POLYGON)
glColor3f(0,1,0);
glBegin(GL_POLYGON);
glVertex2f(110,0);
glVertex2f(200,0);
glVertex2f(200,30);
glVertex2f(110,30);
glEnd();
五角星原理
其實是一大一小的圓,然后按照五等分得到的點
我們需要知道大小圓的半徑\(R\)和\(r\),圓心坐標\((x_c,y_c)\),和夾角\(\theta\)
先確定第一個小三角形的兩個坐標,然后旋轉
旋轉是通過弧度制,弧度加上五等分的角\(\alpha\) 就行
實現代碼
Π可以直接通過cos(-1.0)
得到
外圓點的角度初值為p=Π/2
,內圓的初始值為p=Π/2+theta
為了兩種顏色的質感,奇偶不同顏色
#include <iostream>
#include <cmath>
// GLEW
#define GLEW_STATIC
#include <GL/glew.h>
// GLFW
#include <GLFW/glfw3.h>
#include <GL/glut.h>
using namespace std;
const float pai = acos(-1.0);
const float alpha = 0.4*pai;
//初始化背景
void init() {
glClearColor(0, 0, 0, 0);
glMatrixMode(GL_PROJECTION);
}
void draw(int cx,int cy, float R, float r, float theta){
float *x,*y;
x = new float[10],y=new float[10];
float p = pai/2;
for(int i = 0;i < 10;i += 2){
x[i] = R*cos(p);
y[i] = R*sin(p);
p += alpha;
}
p = pai/2+theta;
for(int i = 1;i < 10;i += 2){
x[i] = r*cos(p);
y[i] = r*sin(p);
p += alpha;
}
for(int i = 0;i < 10;++i){
glColor3f(1 ,0 ,0);
glBegin(GL_LINES);
glVertex2f(x[i],y[i]);
glVertex2f(x[(i + 1) % 10],y[(i + 1) % 10]);
glEnd();
}
for(int i = 0;i < 10;++i){
if(i & 1) glColor3f(1 ,0 ,0);
else glColor3f(1 ,1 ,0);
glBegin(GL_POLYGON);
glVertex2f(x[i],y[i]);
glVertex2f(x[(i + 1) % 10],y[(i + 1) % 10]);
glVertex2f(cx,cy);
glEnd();
}
glutSwapBuffers();
delete []x;
delete []y;
}
//生成五角星
void display() {
draw(0,0,200,100,0.2*pai);
}
void reshape(int width, int height) {
glViewport(0, 0, width, height);
glOrtho(-width,width,-height,height, -1,1);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char *argv[]) {
glutInit(&argc, argv);
glutInitWindowPosition(200,200);
glutInitWindowSize(800, 600);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutCreateWindow("DEMO PHY");
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}