ここに花火のソースおいときます。
偉大なる増子先輩へ!!
#include
#include
#include
#include
#include
#include
#define MAX 6
#define HANI 2
// マウスの視点変化用変数
int mouseL = 0, mouseR = 0;
static GLfloat mouse_rol_x, mouse_rol_y;
static GLfloat mouse_bgn_x, mouse_bgn_y;
static int mouse_x, mouse_y;
// キーで視点変化用変数
static GLfloat move_x = 0.0, move_y = 0.0, zoom = 1.0;
static int star_mine = 0;
static int syaku[MAX] = {0, 0, 0, 0, 0, 0};
// 花火の構成データ
static int flag_rate = 200;
static int flag[400];
static GLfloat position[MAX][3];
static int frame[MAX];
static GLfloat color[MAX][2][3];
// ライト用データ
static int light_flag[MAX] = {0, 0, 0, 0, 0, 0};
static double light_data = 0.1;
// 星の位置
int star_x[100], star_y[100], star_z[100];
// 家の位置
int house_x[50], house_z[50];
int bldg_x[5], bldg_z[5];
// 材質関係
GLfloat m_diffuse[]= {0.8, 0.8, 0.8, 1.0};
GLfloat m_nomat[] = {0.0, 0.0, 0.0, 1.0 }; // 反射無し
GLfloat m_earth[] = {0.75, 0.5, 0.25, 1.0}; // 地面
GLfloat m_white[] = { 1.0, 1.0, 1.0, 1.0 }; // 白
GLfloat m_grey[] = { 0.25, 0.25, 0.25, 1.0 }; // 灰色
GLfloat m_black[] = { 0.0, 0.0, 0.0, 1.0 }; // 黒
GLfloat m_red[] = { 1.0, 0.0, 0.0, 1.0 }; // 赤
GLfloat m_yellow[] = {0.5, 0.5, 0.0, 1.0}; // 黄
GLfloat m_green[] = { 0.0, 1.0, 0.0, 1.0 }; // 緑
GLfloat m_cyan[] = {0.0, 1.0, 1.0, 1.0}; //水色
GLfloat m_blue[] = { 0.0, 0.0, 1.0, 1.0 }; // 青
GLfloat m_mazenda[] = {0.5, 0.0, 0.5, 1.0}; // 紫
GLfloat m_cloud[] = {0.25, 0.25, 0.25, 0.5}; // 雲
GLfloat m_specular[] = { 0.0, 0.0, 0.0, 1.0 };
GLfloat m_ambient[]= {0.25, 0.25, 0.25, 1.0};
GLfloat m_shin_min[] = {0.0};
GLfloat m_shin_middle[] = {50.0};
GLfloat m_shin_max[] = {100.0};
GLfloat m_emission[]= {0.0, 0.0, 0.0, 1.0};
GLfloat m_color_index[]= {0, 1, 1};
// ライト関係
GLfloat l_position[] = { 0.0, 10.0, 0.0, 1.0 };
GLfloat l_max[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat l_min[] = { 0.1, 0.1, 0.1, 1.0 };
GLfloat l_diffuse[] = { 0.1, 0.1, 0.1, 1.0 };
GLfloat l_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat l_ambient[] = { 0.25, 0.25, 0.25, 1.0 };
GLfloat spot_direction[] = { 0.0, -1.0, 0.0 };
GLfloat spot_exponent[] = { 0.0 };
GLfloat spot_cutoff[] = { 100.0 };
GLfloat constant_attenuation[] = { 1.0 };
GLfloat linear_attenuation[] = { 1.0 };
GLfloat quadratic_attenuation[] = { 1.0 };
// 初期化
void init(void){
int i;
for(i = 0 ; i < MAX ; i++){
flag[i] = 0;
change_color(i);
}
for(i = 0 ; i < 100 ; i++){
star_x[i] = (i % 2 == 0) ? (rand() % 70) : -((rand() % 70));
star_y[i] = (rand() % 5) + 40;
star_z[i] = (i % 3 == 0) ? (rand() % 70) : -((rand() % 70));
}
for(i = 0 ; i < 50 ; i++){
house_x[i] = (rand() % 30) + 15;
house_z[i] = (rand() % 30) + 15;
}
for(i = 0 ; i < 5 ; i++){
bldg_x[i] = (rand() % 30) + 15;
bldg_z[i] = (rand() % 30) + 15;
}
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_SMOOTH); // スムーズな色付け
glEnable(GL_DEPTH_TEST); // ライトを見えないところまで照らす
}
// 空
int sky(void){
int i;
static float time = 0.0;
// LIGHT2設定
glLightfv(GL_LIGHT2, GL_DIFFUSE, l_max); // 拡散光
glLightfv(GL_LIGHT2, GL_SPECULAR, l_max); // 鏡面光
glLightfv(GL_LIGHT2, GL_AMBIENT, l_max); // 環境光
glLightfv(GL_LIGHT2, GL_POSITION, l_position); // ライト位置
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT2);
// 星の材質設定
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_white); // 材質の拡散光の色
glMaterialfv(GL_FRONT, GL_SPECULAR, m_white); // 材質の鏡面光の色
glMaterialfv(GL_FRONT, GL_AMBIENT, m_white); // 材質の環境光の色
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_max); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_white); // 材質の放射光の色
// 星
for(i = 0 ; i < 100 ; i++){
glPushMatrix();
{
glTranslatef(star_x[i], star_y[i], star_z[i]);
glutSolidSphere(0.1, 5, 5);
}
glPopMatrix();
}
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// 月の材質設定
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_yellow); // 材質の拡散光の色
glMaterialfv(GL_FRONT, GL_SPECULAR, m_yellow); // 材質の鏡面光の色
glMaterialfv(GL_FRONT, GL_AMBIENT, m_ambient); // 材質の環境光の色
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_middle); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_yellow); // 材質の放射光の色
// 月
glPushMatrix();
{
glTranslatef(30, 30, 30);
glutSolidSphere(1, 12, 24);
}
glPopMatrix();
// 雲の材質設定
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_cloud); // 材質の拡散光の色
glMaterialfv(GL_FRONT, GL_SPECULAR, m_cloud); // 材質の鏡面光の色
glMaterialfv(GL_FRONT, GL_AMBIENT, m_cloud); // 材質の環境光の色
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_middle); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_cloud); // 材質の放射光の色
// 雲0
glPushMatrix();
{
glRotatef(time, 0, 1, 0);
glTranslatef(25, 25, 25);
glScalef(2.0, 1.0, 1.0);
glutSolidSphere(2, 4, 15);
}
glPopMatrix();
// 雲1
glPushMatrix();
{
glRotatef(time * 2, 0, 1, 0);
glTranslatef(20, 25, -25);
glScalef(3.0, 2.0, 1.0);
glutSolidSphere(2, 10, 15);
}
glPopMatrix();
// 雲2
glPushMatrix();
{
glRotatef(time, 0, 1, 0);
glTranslatef(23, 25, 25);
glScalef(2.0, 1.0, 1.0);
glutSolidSphere(2, 4, 15);
}
glPopMatrix();
// 雲3
glPushMatrix();
{
glRotatef(time * 3, 0, 1, 0);
glTranslatef(-10, 25, -10);
glScalef(2.0, 1.0, 1.0);
glutSolidSphere(2, 4, 15);
}
glPopMatrix();
glDisable(GL_BLEND);
glDisable(GL_LIGHTING);
glDisable(GL_LIGHT2);
time += 0.01;
return 0;
}
// 民家
int drawhouse(int i){
glScalef(0.2, 0.2, 0.2);
// 屋根
if(i == 0){
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_red); // 材質の拡散光の色
glMaterialfv(GL_FRONT, GL_SPECULAR, m_nomat); // 材質の鏡面光の色
glMaterialfv(GL_FRONT, GL_AMBIENT, m_ambient); // 材質の環境光の色
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_middle); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_nomat); // 材質の放射光の色
}
else if(i == 1){
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_yellow); // 材質の拡散光の色
glMaterialfv(GL_FRONT, GL_SPECULAR, m_nomat); // 材質の鏡面光の色
glMaterialfv(GL_FRONT, GL_AMBIENT, m_ambient); // 材質の環境光の色
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_middle); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_nomat); // 材質の放射光の色
}
else if(i == 2){
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_green); // 材質の拡散光の色
glMaterialfv(GL_FRONT, GL_SPECULAR, m_nomat); // 材質の鏡面光の色
glMaterialfv(GL_FRONT, GL_AMBIENT, m_ambient); // 材質の環境光の色
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_middle); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_nomat); // 材質の放射光の色
}
else if(i == 3){
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_cyan); // 材質の拡散光の色
glMaterialfv(GL_FRONT, GL_SPECULAR, m_nomat); // 材質の鏡面光の色
glMaterialfv(GL_FRONT, GL_AMBIENT, m_ambient); // 材質の環境光の色
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_middle); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_nomat); // 材質の放射光の色
}
else if(i == 4){
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_blue); // 材質の拡散光の色
glMaterialfv(GL_FRONT, GL_SPECULAR, m_nomat); // 材質の鏡面光の色
glMaterialfv(GL_FRONT, GL_AMBIENT, m_ambient); // 材質の環境光の色
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_middle); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_nomat); // 材質の放射光の色
}
else if(i == 5){
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_mazenda); // 材質の拡散光の色
glMaterialfv(GL_FRONT, GL_SPECULAR, m_nomat); // 材質の鏡面光の色
glMaterialfv(GL_FRONT, GL_AMBIENT, m_ambient); // 材質の環境光の色
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_middle); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_nomat); // 材質の放射光の色
}
else{
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_black); // 材質の拡散光の色
glMaterialfv(GL_FRONT, GL_SPECULAR, m_nomat); // 材質の鏡面光の色
glMaterialfv(GL_FRONT, GL_AMBIENT, m_ambient); // 材質の環境光の色
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_middle); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_nomat); // 材質の放射光の色
}
glBegin(GL_POLYGON);
glNormal3f(1.0/sqrt(2), 1.0/sqrt(2), 0);
glVertex3f(0.0, 3.0, 1.5);
glVertex3f(1.0, 2.0, 1.5);
glVertex3f(1.0, 2.0, -1.5);
glVertex3f(0.0, 3.0, -1.5);
glEnd();
glBegin(GL_POLYGON);
glNormal3f(-1.0/sqrt(2), 1.0/sqrt(2), 0);
glVertex3f(0.0, 3.0, 1.5);
glVertex3f(-1.0, 2.0, 1.5);
glVertex3f(-1.0, 2.0, -1.5);
glVertex3f(0.0, 3.0, -1.5);
glEnd();
// 壁
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_grey); // 材質の拡散光の色
glMaterialfv(GL_FRONT, GL_SPECULAR, m_nomat); // 材質の鏡面光の色
glMaterialfv(GL_FRONT, GL_AMBIENT, m_ambient); // 材質の環境光の色
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_middle); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_grey); // 材質の放射光の色
glBegin(GL_POLYGON);
glNormal3f(0.0, 0.0, 1.0);
glVertex3f(0.0, 3.0, 1.5);
glVertex3f(1.0, 2.0, 1.5);
glVertex3f(1.0, 0.0, 1.5);
glVertex3f(-1.0, 0.0, 1.5);
glVertex3f(-1.0, 2.0, 1.5);
glEnd();
glBegin(GL_POLYGON);
glNormal3f(0.0, 0.0, -1.0);
glVertex3f(0.0, 3.0, -1.5);
glVertex3f(1.0, 2.0, -1.5);
glVertex3f(1.0, 0.0, -1.5);
glVertex3f(-1.0, 0.0, -1.5);
glVertex3f(-1.0, 2.0, -1.5);
glEnd();
glBegin(GL_POLYGON);
glNormal3f(1.0, 0.0, 0.0);
glVertex3f(1.0, 2.0, 1.5);
glVertex3f(1.0, 2.0, -1.5);
glVertex3f(1.0, 0.0, -1.5);
glVertex3f(1.0, 0.0, 1.5);
glEnd();
glBegin(GL_POLYGON);
glNormal3f(-1.0, 0.0, 0.0);
glVertex3f(-1.0, 2.0, 1.5);
glVertex3f(-1.0, 2.0, -1.5);
glVertex3f(-1.0, 0.0, -1.5);
glVertex3f(-1.0, 0.0, 1.5);
glEnd();
glBegin(GL_POLYGON);
glNormal3f(0.0, 1.0, 0.0);
glVertex3f(1.0, 0.0, 1.5);
glVertex3f(1.0, 0.0, -1.5);
glVertex3f(-1.0, 0.0, -1.5);
glVertex3f(-1.0, 0.0, 1.5);
glEnd();
}
int drawbldg(int i){
// 壁
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_grey); // 材質の拡散光
glMaterialfv(GL_FRONT, GL_SPECULAR, m_grey); // 材質の鏡面光
glMaterialfv(GL_FRONT, GL_AMBIENT, m_ambient); // 材質の環境光
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_middle); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_nomat); // 材質の放射光
glPushMatrix();
glTranslatef(0.0, 1.0, 0.0);
if(i == 0) glScalef(3.0, 2.0, 0.25);
else if(i == 1) glScalef(0.5, 3.0, 0.5);
else glScalef(0.25, 2.0, 0.25);
glutSolidCube(2.0);
glPopMatrix();
if(i > 2){
glTranslatef(0, 2.6, 0);
glutSolidSphere(0.5, 10, 10);
}
}
// 背景描画
void background(void){
float x, y, th, th_rad;
int i;
float PI = 3.1415926;
GLfloat l_change[] = {light_data, light_data, light_data, 1.0}; // ライトの明るさ変数
glPushMatrix();
sky();
glPopMatrix();
// LIGHT1 設定
glLightfv(GL_LIGHT1, GL_DIFFUSE, l_change); // 拡散光
glLightfv(GL_LIGHT1, GL_SPECULAR, l_change); // 鏡面光
glLightfv(GL_LIGHT1, GL_AMBIENT, l_change); // 環境光
glLightfv(GL_LIGHT1, GL_POSITION, l_position); // ライト位置
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT1);
// 地面の材質
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_earth); // 材質の拡散光の色
glMaterialfv(GL_FRONT, GL_SPECULAR, m_earth); // 材質の鏡面光の色
glMaterialfv(GL_FRONT, GL_AMBIENT, m_ambient); // 材質の環境光の色
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_middle); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_nomat); // 材質の放射光の色
// 地面
glTranslatef(0.0, -5.0, 0.0);
glBegin(GL_QUADS);
glNormal3f(0.0, 1.0, 0.0);
glVertex3f(50, 0, 50);
glVertex3f(50, 0, -50);
glVertex3f(-50, 0, -50);
glVertex3f(-50, 0, 50);
glEnd();
// 山の材質
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_green); // 材質の拡散光の色
glMaterialfv(GL_FRONT, GL_SPECULAR, m_green); // 材質の鏡面光の色
glMaterialfv(GL_FRONT, GL_AMBIENT, m_ambient); // 材質の環境光の色
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_min); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_nomat); // 材質の放射光の色
// 山1
glPushMatrix();
glTranslatef(40.0, 0.0, -40.0);
glRotatef(-90, 1, 0, 0);
glutSolidCone(20, 10, 20, 10);
glPopMatrix();
// 山2
glPushMatrix();
glTranslatef(30.0, 0.0, -40.0);
glRotatef(-90, 1, 0, 0);
glutSolidCone(20, 10, 20, 10);
glPopMatrix();
// 山3
glPushMatrix();
glTranslatef(25.0, 0.0, -25.0);
glRotatef(-90, 1, 0, 0);
glutSolidCone(20, 5, 10, 10);
glPopMatrix();
// 山4
glPushMatrix();
glTranslatef(1.0, 0.0, -40.0);
glRotatef(-90, 1, 0, 0);
glutSolidCone(20, 10, 10, 10);
glPopMatrix();
glPushMatrix();
// 湖の材質
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_cyan); // 材質の拡散光の色
glMaterialfv(GL_FRONT, GL_SPECULAR, m_cyan); // 材質の鏡面光の色
glMaterialfv(GL_FRONT, GL_AMBIENT, m_ambient); // 材質の環境光の色
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_max); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_nomat); // 材質の放射光の色
glTranslatef(5.0, 0.1, -5.0);
// 湖
glBegin(GL_POLYGON);
glNormal3f(0.0, 1.0, 0.0);
for (th = 0.0 ; th <= 360.0 ; th = th + 10.0){
th_rad = th / 180.0 * PI;
x = 20 * cos(th_rad);
y = 15 * sin(th_rad);
glVertex3f(y, 0.0, x);
}
glEnd();
glPopMatrix();
// ビル
glPushMatrix();
glTranslatef(-13.0, 0.0, -13.0);
drawbldg(3);
glPopMatrix();
glPushMatrix();
glTranslatef(-12.0, 0.0, -14.0);
drawbldg(2);
glPopMatrix();
glPushMatrix();
glTranslatef(-14.0, 0.0, -14.0);
drawbldg(1);
glPopMatrix();
glPushMatrix();
glTranslatef(-14.0, 0.0, -14.0);
drawbldg(1);
glPopMatrix();
glPushMatrix();
for(i = 0 ; i < 5 ; i++){
glPushMatrix();
glTranslatef(bldg_x[i], 0.0, bldg_z[i]);
glRotatef(i * 2, 0, 1, 0);
drawbldg(i % 3);
glPopMatrix();
}
glTranslatef(-30, 0, 0);
for(i = 0 ; i < 5 ; i++){
glPushMatrix();
glTranslatef(bldg_x[i], 0.0, bldg_z[i]);
glRotatef(i * 2, 0, 1, 0);
drawbldg(i % 4);
glPopMatrix();
}
glTranslatef(-30, 0, 0);
for(i = 0 ; i < 5 ; i++){
glPushMatrix();
glTranslatef(bldg_x[i], 0.0, bldg_z[i]);
glRotatef(i * 2, 0, 1, 0);
drawbldg(i % 5);
glPopMatrix();
}
glTranslatef(0, 0, -30);
for(i = 0 ; i < 5 ; i++){
glPushMatrix();
glTranslatef(bldg_x[i], 0.0, bldg_z[i]);
glRotatef(i * 2, 0, 1, 0);
drawbldg(i % 6);
glPopMatrix();
}
glPopMatrix();
// 家
glPushMatrix();
for(i = 0 ; i < 50 ; i++){
glPushMatrix();
glTranslatef(house_x[i], 0.0, house_z[i]);
glRotatef(i * 2, 0, 1, 0);
drawhouse(i % 8);
glPopMatrix();
}
glTranslatef(-30, 0, 0);
for(i = 0 ; i < 50 ; i++){
glPushMatrix();
glTranslatef(house_x[i], 0.0, house_z[i]);
glRotatef(i * 2, 0, 1, 0);
drawhouse(i % 9);
glPopMatrix();
}
glTranslatef(-30, 0, 0);
for(i = 0 ; i < 50 ; i++){
glPushMatrix();
glTranslatef(house_x[i], 0.0, house_z[i]);
glRotatef(i * 2, 0, 1, 0);
drawhouse(i % 10);
glPopMatrix();
}
glTranslatef(0, 0, -30);
for(i = 0 ; i < 50 ; i++){
glPushMatrix();
glTranslatef(house_x[i], 0.0, house_z[i]);
glRotatef(i * 2, 0, 1, 0);
drawhouse(i % 11);
glPopMatrix();
}
glTranslatef(0, 0, -30);
for(i = 0 ; i < 50 ; i++){
glPushMatrix();
glTranslatef(house_x[i], 0.0, house_z[i]);
glRotatef(i * 2, 0, 1, 0);
drawhouse(i % 12);
glPopMatrix();
}
glPopMatrix();
glDisable(GL_LIGHTING);
glDisable(GL_LIGHT1);
}
// 花火の色をランダムに変える
int change_color(int i){
int j;
for(j = 0 ; j < 3 ; j++){
color[i][0][j] = (GLfloat)(rand() % 3) * 0.5;
color[i][1][j] = (GLfloat)(rand() % 3) * 0.5;
}
// 1色目が暗かった場合は白
if(color[i][0][0] < 0.5 && color[i][0][1] < 0.5 && color[i][0][2] < 0.5){
color[i][0][0] = 1.0;
color[i][0][1] = 1.0;
color[i][0][2] = 0.0;
}
// 2色目が暗かった場合は白
if(color[i][1][0] < 0.5 && color[i][1][1] < 0.5 && color[i][1][2] < 0.5){
color[i][1][0] = 0.0;
color[i][1][1] = 1.0;
color[i][1][2] = 1.0;
}
return 0;
}
// 打ち上げ位置の決定 -3 < x < 3, -3 < z < 3
void change_position(int i){
// x座標
position[i][0]=(GLfloat)(rand() % (HANI * 2 * 10 + 1) - (HANI * 10)) / 10;
// y座標は無し
// z座標
position[i][2]=(GLfloat)(rand() % (HANI * 2 * 10 + 1) - (HANI * 10)) / 10;
printf("パターン %d\n", i);
printf(" 打ち上げ点 x : %f y : %f z : %f\n", position[i][0], position[i][1], position[i][2]);
}
// 花火の線
void line(GLfloat start, GLfloat end, int density){
int zrol, yrol;
for(yrol = 0 ; yrol <= 180 ; yrol = yrol + (360 / density)){
glPushMatrix();
glRotatef((GLfloat)yrol, 0.0, 1.0, 0.0);
for(zrol = 0 ; zrol < 360 ; zrol = zrol + (360 / density)){
glPushMatrix();
glRotatef((GLfloat)zrol, 0.0, 0.0, 1.0);
glBegin(GL_LINES);
glLineWidth(30.0);
glVertex3f(start, 0.0, 0.0);
glVertex3f(end, 0.0, 0.0);
glEnd();
glPopMatrix();
}
glPopMatrix();
}
}
// 花火のランダム点
int dot_rand(int radius, int density, int scal){
int n = 0;
double x, y, z;
while(n < density){
x = (double)((rand() % (radius * 2)) - radius) / (double)scal;
y = (double)((rand() % (radius * 2)) - radius) / (double)scal;
z = (double)((rand() % (radius * 2)) - radius) / (double)scal;
if(sqrt(pow(x, 2) + pow(y, 2) + pow(z, 2)) <= (double)radius / (double)scal){
glBegin(GL_POINTS);
glVertex3f(x, y, z);
glEnd();
n++;
}
}
return 0;
}
// 花火の点
int dot(GLfloat radius, int density){
int rol_z, rol_y;
for(rol_y = 0 ; rol_y <= 180 ; rol_y = rol_y + (360 / density)){
glPushMatrix();
glRotatef((GLfloat)rol_y, 0.0, 1.0, 0.0);
for(rol_z = 0 ; rol_z <= 360 ; rol_z = rol_z + (360 / density)){
glPushMatrix();
glRotatef((GLfloat)rol_z, 0.0, 0.0, 1.0);
glBegin(GL_POINTS);
glVertex3f(radius, 0.0, 0.0);
glEnd();
glPopMatrix();
}
glPopMatrix();
}
return 0;
}
// 花火の球
void sphere(GLfloat radius, int density){
int rol_z, rol_y;
for(rol_y = 0 ; rol_y <= 180 ; rol_y = rol_y + (360 / density)){
glPushMatrix();
glRotatef((GLfloat)rol_y, 0.0, 1.0, 0.0);
for(rol_z = 0 ; rol_z <= 360 ; rol_z = rol_z + (360 / density)){
glPushMatrix();
glRotatef((GLfloat)rol_z, 0.0, 0.0, 1.0);
glTranslatef(radius, 0.0, 0.0);
glutSolidSphere(0.01, 7, 7);
glPopMatrix();
}
glPopMatrix();
}
}
//花火パターン0
void hanabi0(void){
float alpha1, alpha2, y_s, y_e, l_s, l_e, l_m;
y_s = frame[0] * 0.02;
y_e = frame[0] * 0.03;
alpha1 = (GLfloat)(1 - (frame[0] - 106) * 0.015);
alpha2 = (GLfloat)(1 - (frame[0] - 106) * 0.003);
l_s = frame[0] * 0.001;
l_e = frame[0] * 0.005;
l_m = 2 * (l_s + l_e) / 3;
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
if(y_e >= 3.2 && alpha1 > 0.0){
if(light_flag[0] == 0){
light_data = 1.0;
light_flag[0] = 1;
}
glPushMatrix();
glTranslatef(0.0, 5.0, 0.0);
glColor4f(color[0][0][0], color[0][0][1], color[0][0][2], alpha1);
line(l_s, l_e, 13);
glPopMatrix();
}
else if(y_e >= 3.2 && alpha1 < 0.2 && alpha2 > 0.0){
if(light_flag[0] == 0){
light_data = 1.0;
light_flag[0] = 1;
}
glPushMatrix();
glTranslatef(0.0, 5.0 - (GLfloat)(frame[0] - 183) * 0.002, 0.0);
glColor4f(color[0][1][0], color[0][1][1], color[0][1][2], alpha2);
dot(l_s, 7);
dot(l_e, 13);
dot(l_m, 13);
dot_rand((int)(l_m * 1000), 50, 1000);
glPopMatrix();
}
glDisable( GL_BLEND );
if(alpha1 < 0.0 && alpha2 < 0.0){
flag[0] = 0;
frame[0] = 0;
change_color(0);
change_position(0);
light_flag[0] = 0;
syaku[0] = 0;
}
}
// 花火パターン1
void hanabi1(void){
float y_s, y_e, l_s1, l_e1, l_s2, l_e2, alpha;
y_s = frame[1] * 0.03;
y_e = frame[1] * 0.04;
// 外側の円
l_s1 = frame[1] * 0.003;
l_e1 = frame[1] * 0.006;
// 内側の円
l_s2 = frame[1] * 0.002;
l_e2 = frame[1] * 0.006;
alpha = (GLfloat)(1 - (frame[1] - 49) * 0.01);
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
if(y_e > 2.0 && alpha > 0.0){
if(light_flag[1] == 0){
light_data = 1.0;
light_flag[1] = 1;
}
glPushMatrix();
glTranslatef(0.0, 4.3, 0.0);
glColor4f(color[1][0][0], color[1][0][1], color[1][0][2], alpha);
line(l_s1, l_e1, 7);
glColor4f(color[1][1][0], color[1][1][1], color[1][1][2], alpha);
line(l_s2, l_e2, 10);
glColor3f(color[1][0][0], color[1][0][1], color[1][0][2]);
dot_rand((int)(l_e1 * 100), (int)(l_e1 * 10), 100);
glPopMatrix();
}
glDisable(GL_BLEND);
if(alpha < 0){
flag[1] = 0;
frame[1] = 0;
change_color(1);
change_position(1);
light_flag[1] = 0;
syaku[1] = 0;
}
}
// 花火パターン2
void hanabi2(void){
float y_s, y_e, l_s1, l_e1, l_s2, l_e2, alpha;
y_s = frame[2] * 0.03;
y_e = frame[2] * 0.04;
l_s1 = 0.1;
l_e1 = (frame[2] - 3) * 0.001;
if(frame[2] > 5){
l_s1 = frame[2] * 0.001;
l_e1 = frame[2] * 0.003;
}
l_s2 = frame[2] * 0.0005;
l_e2 = frame[2] * 0.004;
alpha = (GLfloat)1 - (frame[2] - 74) * 0.01;
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
if(y_e > 3.3 && alpha > 0.0){
if(light_flag[2] == 0){
light_data = 1.0;
light_flag[2] = 1;
}
glPushMatrix();
glTranslatef(0.0, 3.3, 0.0);
glColor4f(color[2][0][0], color[2][0][1], color[2][0][2], alpha);
line(l_s1, l_e1, 7);
glColor4f(color[2][1][0], color[2][1][1], color[2][1][2], alpha);
line(l_s2, l_e2, 10);
glColor4f(color[2][0][0], color[2][0][1], color[2][0][2], alpha);
sphere(l_e2, 20);
sphere((l_e2+l_s2) / 2.0, 10);
glPopMatrix();
}
glDisable(GL_BLEND);
if(alpha < 0.0){
flag[2] = 0;
frame[2] = 0;
change_color(2);
change_position(2);
light_flag[2] = 0;
syaku[2] = 0;
}
}
// 花火パターン3
void hanabi3(void){
float y_s, y_e, l_s1, l_e1, d_s, d_m, d_mm, d_e, alpha1,alpha2;
y_s = frame[3] * 0.03;
y_e = frame[3] * 0.04;
l_s1 = (frame[3] - 99 ) * 0.0001;
l_e1 = (frame[3] - 99 ) * 0.002;
alpha1 = (GLfloat)(1 - (frame[3] - 110) * 0.01);
alpha2 = (GLfloat)(1 - (frame[3] - 210) * 0.01);
d_s = (frame[3]-99) * 0.001;
d_e = (frame[3]-99) * 0.005;
d_m = l_e1;
d_mm = 2.5 * (d_s + d_e) / 5;
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
if(y_s > 4.5 && alpha1 > 0.0){
if(light_flag[3] == 0){
light_data = 1.0;
light_flag[3] = 1;
}
glPushMatrix();
glTranslatef(0.0, 4.5, 0.0);
glColor4f(color[3][0][0], color[3][0][1], color[3][0][2], alpha1);
line(l_s1, l_e1, 10);
glColor4f(color[3][1][0], color[3][1][1], color[3][1][2], alpha2);
dot(l_e1, 20);
glPopMatrix();
}
else if(y_s > 4.5 && alpha1 < 0.5 && alpha2 > 0.0){
if(light_flag[3] == 0){
light_data = 1.0;
light_flag[3] = 1;
}
glPushMatrix();
glTranslatef(0.0, 4.5 - (frame[3] - 210) * 0.0025, 0.0);
glColor4f(color[3][1][0], color[3][1][1], color[3][1][2],alpha2);
dot(d_m,20);
glColor4f(color[3][0][0], color[3][0][1], color[3][0][2], alpha2);
dot(d_s, 13);
dot(d_mm, 13);
dot(d_e, 15);
glPopMatrix();
}
glDisable(GL_BLEND);
if(alpha1 < 0.0 && alpha2 < 0.0){
flag[3] = 0;
frame[3] = 0;
change_color(3);
change_position(3);
light_flag[3] = 0;
syaku[3] = 0;
}
}
// 花火パターン4
void hanabi4(void){
float y_s, y_e, l_s1, l_e1, l_s2, l_e2, alpha1,alpha2;
y_s = frame[4] * 0.03;
y_e = frame[4] * 0.04;
l_s1 = (frame[4] - 99 ) * 0.0001;
l_e1 = (frame[4] - 99 ) * 0.003;
alpha2 = (GLfloat)(1 - (frame[4] - 110) * 0.01);
alpha1 = (GLfloat)(1 - (frame[4] - 210) * 0.01);
l_s2 = (frame[4] - 99) * 0.001;
l_e2 = (frame[4] - 99) * 0.005;
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
if(y_s > 4.3){
if(light_flag[4] == 0){
light_data = 1.0;
light_flag[4] = 1;
}
glPushMatrix();
glTranslatef(0.0, 4.3, 0.0);
glColor4f(color[4][0][0], color[4][0][1], color[4][0][2], alpha1);
line(l_s1, l_e1, 17);
sphere(l_e2, 13);
glColor4f(color[4][1][0], color[4][1][1], color[4][1][2], alpha2);
line(l_s2, l_e2, 13);
dot(l_e1, 17);
glPopMatrix();
}
glDisable(GL_BLEND);
if(alpha1 < 0.0 && alpha2 < 0.0){
flag[4] = 0;
frame[4] = 0;
change_color(4);
change_position(4);
light_flag[4] = 0;
syaku[4] = 0;
}
}
// 花火パターン5
void hanabi5(void){
float y_s, y_e, l_s1, l_e1, l_s2, l_e2, alpha;
y_s = frame[5] * 0.03;
y_e = frame[5] * 0.04;
// 外側の円
l_s1 = frame[5] * 0.004;
l_e1 = frame[5] * 0.006;
// 内側の円
l_s2 = frame[5] * 0.001;
l_e2 = frame[5] * 0.006;
alpha = (GLfloat)(1 - (frame[5] - 74) * 0.009);
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
if(y_e > 3.4 && alpha > 0.0){
if(light_flag[5] == 0){
light_data = 1.0;
light_flag[5] = 1;
}
glPushMatrix();
glTranslatef(0.0, 3.4, 0.0);
glColor4f(color[5][0][0], color[5][0][1], color[5][0][2], alpha);
line(l_s1, l_e1, 10);
glColor4f(color[5][1][0], color[5][1][1], color[5][1][2], alpha);
line(l_s2, l_e2, 9);
glColor4f(color[5][0][0], color[5][0][1], color[5][0][2], alpha);
line((l_s1+l_s2)/2, ((l_e1+l_e2)/2), 8);
glColor3f(1.0, 1.0, 1.0);
dot_rand((int)(l_e1 * 100), (int)(l_e1 * 10), 100);
glPopMatrix();
}
glDisable(GL_BLEND);
if(alpha < 0){
flag[5] = 0;
frame[5] = 0;
change_color(5);
change_position(5);
light_flag[5] = 0;
syaku[5] = 0;
}
}
// 自動打ち上げユニット
void auto_func(void){
int target;
// フラグが立っているものは着火
// 花火パターン0
if(flag[0] == 1){
glPushMatrix();
glTranslatef(position[0][0], position[0][1], position[0][2]);
hanabi0();
glPopMatrix();
}
// 花火パターン1
if(flag[1] == 1){
glPushMatrix();
glTranslatef(position[1][0],position[1][1],position[1][2]);
hanabi1();
glPopMatrix();
}
// 花火パターン2
if(flag[2] == 1){
glPushMatrix();
glTranslatef(position[2][0],position[2][1],position[2][2]);
hanabi2();
glPopMatrix();
}
// 花火パターン3
if(flag[3] == 1){
glPushMatrix();
glTranslatef(position[3][0],position[3][1],position[3][2]);
hanabi3();
glPopMatrix();
}
// 花火パターン4
if(flag[4] == 1){
glPushMatrix();
glTranslatef(position[4][0],position[4][1],position[4][2]);
hanabi4();
glPopMatrix();
}
// 花火パターン5
if(flag[5] == 1){
glPushMatrix();
glTranslatef(position[5][0],position[5][1],position[5][2]);
hanabi5();
glPopMatrix();
}
target = (rand() % flag_rate);
if(flag[target] == 0 && star_mine == 1){
flag[target] = 1;
}
}
// 描画
void display(void){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
{
// 視点移動の平行移動
glTranslatef(move_x, move_y, 0);
// 視点移動の回転
glRotatef(mouse_rol_x, 1.0, 0.0, 0.0);
glRotatef(mouse_rol_y, 0.0, 1.0, 0.0);
// ズーム
glScalef(zoom, zoom, zoom);
// 背景
glPushMatrix();
background();
glPopMatrix();
// スターマイン
glPushMatrix();
auto_func();
glPopMatrix();
// 尺玉0
if(syaku[0] == 1){
glPushMatrix();
glTranslatef(0, 0, 0);
glScalef(2, 2, 2);
frame[0]++;
hanabi0();
glPopMatrix();
}
// 尺玉1
if(syaku[1] == 1){
glPushMatrix();
glTranslatef(5, 0, 5);
glScalef(2, 2, 2);
frame[1]++;
hanabi1();
glPopMatrix();
}
// 尺玉2
if(syaku[2] == 1){
glPushMatrix();
glTranslatef(-5, 0, 5);
glScalef(2, 2, 2);
frame[2]++;
hanabi2();
glPopMatrix();
}
// 尺玉3
if(syaku[3] == 1){
glPushMatrix();
glTranslatef(-5, 0, -5);
glScalef(2, 2, 2);
frame[3]++;
hanabi3();
glPopMatrix();
}
// 尺玉4
if(syaku[4] == 1){
glPushMatrix();
glTranslatef(5, 0, -5);
glScalef(2, 2, 2);
frame[4]++;
hanabi4();
glPopMatrix();
}
// 尺玉5
if(syaku[5] == 1){
glPushMatrix();
glTranslatef(25, 0, -25);
glScalef(2, 2, 2);
frame[5]++;
hanabi5();
glPopMatrix();
}
if(light_data > 0.1)light_data -= 0.01; // ディスプレイを暗くする処理
glutSwapBuffers();
}
glPopMatrix();
}
// 再描画
void reshape(int w, int h){
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat)w/(GLfloat)h, 1.0, 150.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0, 20.0, 20.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}
// キーボード操作
void keyboard (unsigned char key, int x, int y){
switch(key){
// ズームイン
case 'z':
zoom += 0.05;
glutPostRedisplay();
break;
// ズームアウト
case 'Z':
zoom -= 0.05;
glutPostRedisplay();
break;
// スターマイン!
case 's':
star_mine = 1;
glutPostRedisplay();
break;
// スターマイン...
case 'S':
star_mine = 0;
glutPostRedisplay();
break;
// 尺玉0
case '0':
syaku[0] = 1;
glutPostRedisplay();
break;
// 尺玉1
case '1':
syaku[1] = 1;
glutPostRedisplay();
break;
// 尺玉2
case '2':
syaku[2] = 1;
glutPostRedisplay();
break;
// 尺玉3
case '3':
syaku[3] = 1;
glutPostRedisplay();
break;
// 尺玉4
case '4':
syaku[4] = 1;
glutPostRedisplay();
break;
// 尺玉5
case '5':
syaku[5] = 1;
glutPostRedisplay();
break;
case 'l':
flag_rate = 400;
glutPostRedisplay();
break;
case 'm':
flag_rate = 200;
glutPostRedisplay();
break;
case 'h':
flag_rate = 50;
glutPostRedisplay();
break;
case 27:
exit(0);
break;
default:
break;
}
}
// キーボードの左側にある → ↓ ← ↑ の処理
void move(int key, int x, int y){
switch(key){
// 上スライド
case GLUT_KEY_UP:
move_y = move_y - 0.3;
glutPostRedisplay();
break;
// 下スライド
case GLUT_KEY_DOWN:
move_y = move_y + 0.3;
glutPostRedisplay();
break;
// 左スライド
case GLUT_KEY_LEFT:
move_x = move_x+0.3;
glutPostRedisplay();
break;
// 右スライド
case GLUT_KEY_RIGHT:
move_x = move_x-0.3;
glutPostRedisplay();
break;
default:
break;
}
}
void idle(void){
frame[0]++;
frame[1]++;
frame[2]++;
frame[3]++;
frame[4]++;
frame[5]++;
glutPostRedisplay();
}
// マウスクリック
void mouse_click(int button, int stat, int x, int y){
if(GLUT_DOWN == stat && button!=GLUT_MIDDLE_BUTTON){
// 左クリック → 横回転
if( GLUT_LEFT == button) mouseL=1, mouseR=0;
// 右クリック → 縦回転
else if( GLUT_RIGHT_BUTTON == button) mouseL=0, mouseR=1;
mouse_x = x;
mouse_y = y;
mouse_bgn_x = mouse_rol_x;
mouse_bgn_y = mouse_rol_y;
}
// 視点を元の位置に戻す
else if(button==GLUT_MIDDLE_BUTTON){
mouseL=0, mouseR=0;
move_x=0.0;
move_y=0.0;
mouse_rol_x = 0.0;
mouse_rol_y = 0.0;
zoom = 1.0;
glutPostRedisplay();
}
}
// マウスドラッグ
void mouse_drag(int x, int y){
// 横回転(y軸)
if( mouseL ){
// ドラッグ量から回転角度を求める
mouse_rol_y = (GLfloat)((x - mouse_x) + mouse_bgn_y)/2;
}
// 縦回転(x軸)
else if( mouseR ){
// ドラッグ量から回転角度を求める
mouse_rol_x = (GLfloat)((y - mouse_y) + mouse_bgn_x)/2;
// 回転角範囲の指定 0 < x < 45
if(mouse_rol_x > 45) mouse_rol_x = 45;
if(mouse_rol_x < -60) mouse_rol_x = -60;
}
glutPostRedisplay();
}
int main(int argc, char** argv){
// 時間によってランダムの要素を加える
srand((unsigned) time(NULL));
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(700,700);
glutInitWindowPosition(100,100);
glutCreateWindow("FIRE WARK");
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutSpecialFunc(move);
glutIdleFunc(idle);
glutMouseFunc(mouse_click);
glutMotionFunc(mouse_drag);
glutMainLoop();
return 0;
}
/ 2007/06/19(Tue)18:38 /
/
リアル
/
trackback:0 /
comment:3 /