りんく
https://staff.mast.tsukuba.ac.jp/users/jikken/weblog/66767/attachments/f15ac/titlepage.pdf
・実験提出
・データベースシステム提出
・インタラクティブCG
・視覚情報処理提出
・メディア実験提出
インタラクティブCG
class Model : public ModelerView {
private:
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//第3週課題
//---------------------------------------------------------------------
// フレーム番号
int frame_count;
//-------------------------------------------------------------------------
// 制御変数
//-------------------------------------------------------------------------
// ~~~変数を追加~~~
double r,posX,posY;
//時間刻み
double dt;
//重力加速度
double G;
//振り子の角度
double angle_prev;//θ(t-dt)
double angle_curr;//(t)
double angle_next;//t+dt
double k;
//ボールの位置座標
Vec3d pos;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public:
// コンストラクタ(スーパークラスのコンストラクタを呼び出す)
Model( int x, int y, int w, int h, char* label ) : ModelerView( x, y, w, h, label )
{
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//第3週課題
//---------------------------------------------------------------------
// フレーム番号の初期化
frame_count = 0;
//---------------------------------------------------------------------
// 初期化
//---------------------------------------------------------------------
// ~~~変数を初期化~~~
//r=4.0;
posX=r;//r*cos(0)
posY=0.0;//r*sin(0)
dt=0.06;//時間刻み
G=9.8;//重力加速度
r=6.0;//振り子の長さ
k=sqrt(G/r);
//振り子の角度を初期化
angle_prev=angle_curr=angle_next=M_PI/4.0;
//ボールの位置座標を初期化
pos=Vec3d(r*sin(angle_next),-r*cos(angle_next),0);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//第3週課題
//---------------------------------------------------------------------
// 自動アニメーションの設定
void SetAutomaticAnimation()
{
//-----------------------------------------------------------------
// アニメーション
//-----------------------------------------------------------------
// ~~~プログラムを記述~~~
double th=frame_count*M_PI/50;
posX=r*cos(th);
posY=r*sin(th);
//振り子の角度を更新
angle_next=-angle_prev+2*angle_curr-pow(k*dt,2)*sin(angle_curr);
angle_prev=angle_curr;
angle_curr=angle_next;
//同時にボールの位置座標も更新
pos=Vec3d(r*sin(angle_next),-r*cos(angle_next),0);
//-----------------------------------------------------------------
}
// 手動アニメーションの設定
void SetManualAnimation()
{
//-----------------------------------------------------------------
// アニメーション
//-----------------------------------------------------------------
// ~~~プログラムを記述~~~
double th=frame_count*M_PI/50;
posX=r*cos(th);
posY=r*sin(th);
//振り子の角度を更新
angle_next=-angle_prev+2*angle_curr-pow(k*dt,2)*sin(angle_curr);
angle_prev=angle_curr;
angle_curr=angle_next;
//同時にボールの位置座標も更新
pos=Vec3d(r*sin(angle_next),-r*cos(angle_next),0);
//-----------------------------------------------------------------
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 描画の前処理
void BeginPaint()
{
// 半透明処理を有効化
glEnable( GL_BLEND );
// 混合方法の指定
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
}
// 描画の後処理
void EndPaint()
{
// 半透明処理を無効化
glDisable( GL_BLEND );
}
//----6/21片目の描画
void DrawEye(){
//白目の描画
setDiffuseColor(1.0f,1.0f,1.0f,1.0f);
drawSphere(1.0);
//黒目の描画
glPushMatrix();
setDiffuseColor(0.2f,0.1f,0.0f,1.0f);
glTranslated(0.7,0.0,0.0);
drawSphere(0.5);//半径1
glPopMatrix();
}
//--6/27プリミティブ
//鼻、半径3から半径2へ長さ6
void circle_nose(){
//少数で計算式かかないと動かないので0.1
double th=0.1*M_PI;
int i;
Vec3d en1[20],en2[20];
setDiffuseColor(0.0f,0.3f,0.5f,1.0f);
//en1
glBegin(GL_TRIANGLE_FAN);
for(i=0;i<20;i++){//キャストをはっきりしておくint,double
en1[i][0]=3*cos((double)i*th);
en1[i][1]=3*sin((double)i*th);
en1[i][2]=0.0;
glVertex3d(en1[i][0],en1[i][1],0);
}
glEnd();
glPushMatrix();
glTranslated(0.0,0.0,-6.0);//-zで+zに移動する
//en2
glBegin(GL_TRIANGLE_FAN);
for(i=0;i<20;i++){//キャストをはっきりしておくint,double
en2[i][0]=2*cos((double)i*th);
en2[i][1]=2*sin((double)i*th);
en2[i][2]=-6.0;
glVertex3d(en2[i][0],en2[i][1],0);
}
glEnd();
glPopMatrix();
//connect
glBegin(GL_QUADS);
for(i=0;i<20;i++){
glVertex3d(en1[i][0],en1[i][1],en1[i][2]);
glVertex3d(en2[i][0],en2[i][1],en2[i][2]);
glVertex3d(en2[i+1][0],en2[i+1][1],en2[i+1][2]);
glVertex3d(en1[i+1][0],en1[i+1][1],en1[i+1][2]);
}
glEnd();
}
//耳左向き幅1
void ear(){
Vec3d en1[20],en2[20];
double th=0.1*M_PI,th2=0.04*M_PI;
int i;
setDiffuseColor(0.0f,0.3f,0.5f,1.0f);
//片側
glBegin(GL_TRIANGLE_FAN);
for(i=0;i<10;i++){
en1[i][1]=sin((double)(i-5)*th);//-1/2*M_PI~1/2*M_PI度
en1[i][0]=(double)pow(en1[i][1],2)-1;
en1[i][2]=0.0;
glVertex3d(en1[i][0],en1[i][1],0.0);
}
glEnd();
//もう片側
glBegin(GL_TRIANGLE_FAN);
for(i=0;i<10;i++){
en2[i][1]=sin((double)(i-5)*th);
en2[i][0]=(double)pow(en2[i][1],2)-1;
en2[i][2]=en2[i][0]*tan(-10.0);//10度回転したときのzの値
glVertex3d(en2[i][0],en2[i][1],en2[i][2]);
}
glEnd();
//つなぐ
glBegin(GL_TRIANGLE_STRIP);
for(i=0;i<10;i++){
glVertex3d(en1[i][0],en1[i][1],en1[i][2]);
glVertex3d(en2[i][0],en2[i][1],en2[i][2]);
}
glEnd();
}
//帽子、原点は上のへこみの中心、高さy軸方向に-3,半径内側3外側6
void hat(){
//y=1/10x^2とx^2+z^2=1をつかって
Vec3d in[20],out[20],cur[20];
double th=0.1*M_PI;
int i;
setDiffuseColor(0.3f,0.0f,0.0f,1.0f);
//内側の円の描画
glBegin(GL_TRIANGLE_FAN);
for(i=0;i<20;i++){
in[i][0]=cos((double)i*th);
in[i][1]=0.1*pow(in[i][0],2);
in[i][2]=sin((double)i*th);
glVertex3d(in[i][0],in[i][1],in[i][2]);
}
glEnd();
//外側の円の配列に代入
//つなげる
glBegin(GL_TRIANGLE_STRIP);
for(i=0;i<20;i++){
out[i][0]=2*cos((double)i*th);//xの値を大きくする
out[i][1]=0.1*pow(out[i][0],2);
out[i][2]=2*sin((double)i*th);
glVertex3d(in[i][0],in[i][1],in[i][2]);
glVertex3d(out[i][0],out[i][1],out[i][2]);
}
glVertex3d(in[0][0],in[0][1],in[0][2]);
glVertex3d(out[0][0],out[0][1],out[0][2]);
glEnd();
//x^2+z^2=9
setDiffuseColor(0.3f,0.1f,0.0f,1.0f);
glBegin(GL_TRIANGLE_STRIP);
for(i=0;i<20;i++){
cur[i][0]=3*cos((double)i*th);
cur[i][2]=3*sin((double)i*th);
cur[i][1]=-3;
glVertex3d(out[i][0],out[i][1],out[i][2]);
glVertex3d(cur[i][0],cur[i][1],cur[i][2]);
}
glVertex3d(out[0][0],out[0][1],out[0][2]);
glVertex3d(cur[0][0],cur[0][1],cur[0][2]);
glEnd();
setDiffuseColor(0.3f,0.05f,0.0f,1.0f);
//まわり
glBegin(GL_TRIANGLE_STRIP);
for(i=0;i<20;i++){
glVertex3d(cur[i][0],cur[i][1],cur[i][2]);
glVertex3d(2*cur[i][0],cur[i][1],2*cur[i][2]);
}
glVertex3d(cur[0][0],cur[0][1],cur[0][2]);
glVertex3d(2*cur[0][0],cur[0][1],2*cur[0][2]);
glEnd();
}
// オブジェクトの描画
void draw()
{
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//第3週課題
//---------------------------------------------------------------------
// 自動アニメーションの処理
if ( IsAutomaticAnimation() && frame_count<max_frame_count ) {
// フレーム番号の更新
SetSliderValue( FRAME_CONTROLS, ++frame_count );
// 自動アニメーション
SetAutomaticAnimation();
}
// 手動アニメーションの処理
else {
// フレーム番号を取得
frame_count = (int)GetSliderValue( FRAME_CONTROLS );
// 手動アニメーション
SetManualAnimation();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// スーパークラスの描画メソッドをコール(必須)
ModelerView::draw();
// 描画開始
BeginPaint();
//---------------------------------------------------------------------
// オブジェクトを描画
//半径5の顔
setDiffuseColor(0.0f,0.4f,0.5f,1.0f);//青
drawSphere(5.0);
//左耳 z軸方向に-4移動して大きさyに3倍zに6倍
glPushMatrix();
glTranslated(0.0,0.0,4.0);
glScaled(1.0,3.0,6.0);
ear();
glPopMatrix();
//右耳 180度y軸固定で回転z軸方向に-4移動して大きさyに3倍zに6倍
glPushMatrix();
glRotated(180,0.0,1.0,0.0);
glTranslated(0.0,0.0,4.0);
glScaled(1.0,3.0,6.0);
ear();
glPopMatrix();
//座標保存したまま半径1の目を先にかく z軸固定で45度回転のところに
glPushMatrix();
glRotated(30,0.0,0.0,1.0);
glTranslated(5.0,0.0,0.0);
DrawEye();
glPopMatrix();
//ここから鼻先
setDiffuseColor(0.0f,0.3f,0.5f,1.0f);
glTranslated(5.0,0.0,0.0);
drawSphere(1.5);
//---------------------------------------------------------------------
//色の値、光の値は0~1
//---------------------------------------------------------------------
// 描画終了
EndPaint();
}
};
// __MODEL_H__
#endif