• 締切済み

3DCG上の動きについて

物を表示させてx軸・y軸・z軸について回転、物を拡大させたり、 縮小させたりする事は出来ます。 どこをどのようにすれば、物を縦や横に動かす事が出来るのか教えて下さい。 下に自分でやってみたプログラムを書いておきます。 光の強さ、main関数等の所は、スペース上、省略してあります。 void light_enable(){ glenable(GL_LIGHTING); glenable(GL_LIGHT0); glenable(GL_DEPTH_TEST); } void set_light(void){ light_enable(); glMaterialfv(GL_FRONT,GL_SPECULAR,lite_spec); glMaterialfv(GL_FRONT,GL_SHININESS,lite_shine); glLightfv(GL_LIGHT0,GL_POSITION,lite_post); } int anime(){ int i,move; for(i=0;i>=10;i++){ if(i==10){ for(i=10;i<0;i--){ move+=move; } } } return 0; } void modeldraw(void){ glpushmatrix(); gclearbuffers(); gltranslated(1.0,1.0,1.0); glrotatef((float)rot_x,1.0,0.0,0.0); glrotatef((float)rot_y,0.0,1.0,0.0); glrotatef((float)rot_z,0.0,0.0,1.0); glMaterialfv(GL_FRONT,GL_DIFFUSE,obj_diffuse1); glMaterialfv(GL_FRONT,GL_AMBIENT,obj_ambient1); glMaterialfv(GL_FRONT,GL_SPECULAR,obj_specular1); glMaterialfv(GL_FRONT,GL_SHININESS,obj_shininess); glscaled(sscale*0.3,sscale*0.3,sscale*0.3); glutSolidSphere(1.0,40,50); glpopmatrix(); glutswapbuffers(); glflush(); } void key_press(unsigned char key, int xk, int yk){ if(key=='x')rot_x=(rot_x+5)%360; else if(key=='y')rot_y=(rot_y+5)%360; else if(key=='z')rot_z=(rot_z+5)%360; else if(key=='S')sscale=sscale*1.2; else if(key=='s')sscale=sscale/1.2; else if(key=='a')anime(); modeldraw(); }

みんなの回答

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.2

>例えば、最初は原点に表示されていて、キーボードのkeyを押して物体が動き始め >一定の条件を満たしたら止まるというような事です。 >このプログラムの場合、右に移動して、一定の時間が経ったら逆に動くというような事をやりたいのです。 このソースだけではよくわかりませんが、 そのためには、一定の時間がたつと呼ばれる関数が必要です。 例えば,1/10秒毎に呼ばれる関数を用意して,そこでx座標を少しづつ足しながら画面を書き換えるという動作をすれば、 x軸方向に移動することになります。 一定の時間で動きを逆にしたいなら、内部にカウンタを用意し,一定の値になったら、足さずに引けば逆方向に動くようになります。 キーが押されるまで動かさないようにするなら、キーが押されるまでは0を足し, キーが押された値を設定すればいいわけです。 って、こういう話なら3DCGは関係ないですね。 単に、移動させるための座表計算をどうすればいいかという話ですから。 もし、これも意味が違うなら、私には質問が理解できないということですので、 引っ込みます。

yukki-asimo
質問者

お礼

アドバイス、有難うございます。 参考になります。

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.1

物体の位置を変えるという意味では, glTransrate()でしょうね。 例えば,x,yの位置に表示したいなら、 glpushmatrix(); gltranslated(x,y,0.0); // 現在の描画部 glpopmatrix(); でいいと思いますが。 未確認です(^^: あと、質問のタイトルは3DCGとせずに、OpenGLとした方がいいですよ。

yukki-asimo
質問者

補足

>物体の位置を変えるという意味では, >glTransrate()でしょうね。 私が言いたかった事は、物体の位置を移動させるということです。 例えば、最初は原点に表示されていて、キーボードのkeyを押して物体が動き始め 一定の条件を満たしたら止まるというような事です。 このプログラムの場合、右に移動して、一定の時間が経ったら逆に動くというような事をやりたいのです。 私の質問の言い方が良くなかった事をお詫びします。 お忙しい中、回答をして頂き、どうも有難うございました。