3DCGライブラリ 山中和義 2005/10/20 21:38:59 ├プログラム 山中和義 2005/10/20 21:43:25 │├続き(サンプル本体) 山中和義 2005/10/20 21:51:17 │├続き 山中和義 2005/10/20 21:52:03 │├続き(3DCGAPI) 山中和義 2005/10/20 21:55:13 │├続き 山中和義 2005/10/20 21:56:53 │├続き 山中和義 2005/10/20 22:00:16 │├続き 山中和義 2005/10/20 22:02:32 │├続き 山中和義 2005/10/20 22:04:37 │└続き 山中和義 2005/10/20 22:05:12 └改修版 山中和義 2005/10/23 13:06:03 └すごい! 青木太一 2005/10/28 13:16:24
3DCGライブラリ 山中和義 2005/10/20 21:38:59 ツリーへ
3DCGライブラリ |
返事を書く |
山中和義 2005/10/20 21:38:59 | |
仕様 OpenGL/GLUTのAPI形式 ・座標系の種類 右手系 ・ジオメトリ処理(幾何計算) ┌ Sx ┐=┌スクリーン ┐┌フ゜ロシ゛ェクション┐┌ビュー ┐┌ワールド┐┌ Lx ┐ │ Sy │ └トランスフォーム┘└トランスフォーム ┘└トランスフォーム┘└トランスフォーム┘│ Ly │ │ Sz │ │ Lz │ └ 1 ┘ └ 1 ┘ ワールドトランスフォームは、モデルトランスフォームと言われる。 ┌ Wx ┐=┌ ┐┌ ┐┌ ┐┌ Lx ┐ │ Wy │ │移動││回転││拡大││ Ly │ │ Wz │ └ ┘└ ┘└ ┘│ Lz │ └ 1 ┘ └ 1 ┘ ・面(多角形)の表 反時計まわり ・描画プリミティブ 点、線、面(多角形) → ワイヤーフレーム表示 |
├プログラム 山中和義 2005/10/20 21:43:25 ツリーへ
Re: 3DCGライブラリ |
返事を書く |
山中和義 2005/10/20 21:43:25 | |
プログラム !3DCGライブラリ(OpenGL風)を使ったサンプルコーディング !#include <GL/gl.h> DECLARE EXTERNAL SUB GL.glGetFloatv DECLARE EXTERNAL SUB GL.glLoadIdentity DECLARE EXTERNAL SUB GL.glLoadMatrix DECLARE EXTERNAL SUB GL.glMultMatrix DECLARE EXTERNAL SUB GL.glPushMatrix DECLARE EXTERNAL SUB GL.glPopMatrix DECLARE EXTERNAL SUB GL.glRotatef DECLARE EXTERNAL SUB GL.glScalef DECLARE EXTERNAL SUB GL.glTranslatef DECLARE EXTERNAL SUB GL.glMatrixMode DECLARE EXTERNAL SUB GL.glFrustum DECLARE EXTERNAL SUB GL.glOrtho DECLARE EXTERNAL SUB GL.glViewport DECLARE EXTERNAL SUB GL.glColor3f DECLARE EXTERNAL SUB GL.glMaterialf DECLARE EXTERNAL SUB GL.glBegin DECLARE EXTERNAL SUB GL.glEnd DECLARE EXTERNAL SUB GL.glVertex3f DECLARE EXTERNAL SUB GL.glVertex3fv DECLARE EXTERNAL SUB GL.glVertex4f DECLARE EXTERNAL SUB GL.glVertex4fv DECLARE EXTERNAL SUB GL.glLightfv DECLARE EXTERNAL SUB GL.glEnable DECLARE EXTERNAL SUB GL.glDisable DECLARE EXTERNAL SUB GL.glFlush DECLARE EXTERNAL SUB GL.glClearColor DECLARE EXTERNAL SUB GL.glClear !#include <GL/glu.h> DECLARE EXTERNAL SUB GLU.gluLookAt DECLARE EXTERNAL SUB GLU.gluPerspective OPTION BASE 0 LET GL_POINTS=BVAL("1",16) !描画プリミティブ列挙型 LET GL_LINES=BVAL("2",16) LET GL_POLYGON=BVAL("9",16) LET GL_MODELVIEW=BVAL("1700",16) !変換モード列挙型 LET GL_PROJECTION=BVAL("1701",16) LET GL_MODELVIEW_MATRIX=BVAL("BA6",16) !変換行列列挙型 LET GL_PROJECTION_MATRIX=BVAL("BA7",16) !------------------------------------------------------------- !#include <GL/glut.h> !GLUT SUB glutInit SET COLOR mode "NATIVE" !RGB指定 SET TEXT font "",12 !文字サイズ END SUB SUB glutInitDisplayMode END SUB SUB glutInitWindowSize(w,h) SET BITMAP SIZE w,h !画面サイズ SET WINDOW 0,w,0,h !左下が原点。横がX、縦Y CALL reshape(w,h) END SUB SUB glutInitWindowPosition(x,y) END SUB SUB glutCreateWindow(c) END SUB SUB glutMainLoop DO CALL DISPLAY WAIT DELAY tmr/1000 CALL timer(0) MOUSE POLL x,y,left,right LET s$="" CHARACTER INPUT NOWAIT:s$ IF s$<>"" THEN CALL keyboard(ORD(s$),x,y) LOOP END SUB SUB glutSwapBuffers CALL glFlush END SUB SUB glutPostRedisplay END SUB SUB glutTimerFunc(t,m,p) LET tmr=t END SUB !------------------------------------------------------------- |
│├続き(サンプル本体) 山中和義 2005/10/20 21:51:17 ツリーへ
Re: プログラム |
返事を書く |
山中和義 2005/10/20 21:51:17 | |
続き(サンプル本体) SUB draw_axis(scl) !ワールド座標(XYZ軸)を描く CALL glBegin(GL_LINES) !線を描く CALL glColor3f(0.5,0.5,0.5) FOR i=-10 TO 10 !XZ平面 x方向 CALL glVertex3f(i*scl,0,-10*scl) IF i=0 THEN CALL glVertex3f(0,0,0) ELSE CALL glVertex3f(i*scl,0,10*scl) END IF NEXT i FOR i=-10 TO 10 !XZ平面 z方向 CALL glVertex3f(-10*scl,0,i*scl) IF i=0 THEN CALL glVertex3f(0,0,0) ELSE CALL glVertex3f(10*scl,0,i*scl) END IF NEXT i CALL glEnd CALL glBegin(GL_LINES) CALL glColor3f(1,0,0) !X軸 CALL glVertex3f(0,0,0) CALL glVertex3f(20*scl,0,0) CALL glColor3f(0,1,0) !Y軸 CALL glVertex3f(0,0,0) CALL glVertex3f(0,20*scl,0) CALL glColor3f(0,0,1) !Z軸 CALL glVertex3f(0,0,0) CALL glVertex3f(0,0,20*scl) CALL glEnd END SUB SUB DRAW !立方体を描く DIM v(2) DIM vertex(23) !頂点の定義 60 DATA 1, 1,-1 DATA -1, 1,-1 DATA -1,-1,-1 DATA 1,-1,-1 DATA 1, 1, 1 DATA -1, 1, 1 DATA -1,-1, 1 DATA 1,-1, 1 RESTORE 60 MAT READ vertex DIM face(23) !面の定義 70 DATA 0, 1, 2, 3 DATA 1, 5, 6, 2 DATA 5, 4, 7, 6 DATA 4, 0, 3, 7 DATA 4, 5, 1, 0 DATA 3, 2, 6, 7 RESTORE 70 MAT READ face CALL glMaterialf(GL_FRONT,G_DIFFUSE,1,1,0,1) FOR i=0 TO 5 !6面 CALL glBegin(GL_POLYGON) FOR j=0 TO 3 !4点(正方形) LET v(0)=vertex(face(4*i+j)*3) LET v(1)=vertex(face(4*i+j)*3+1) LET v(2)=vertex(face(4*i+j)*3+2) CALL glVertex3fv(v) NEXT j CALL glEnd NEXT i END SUB SUB DISPLAY !GLUTディスプレイコールバック関数 CALL glClear(f) !画面をクリアする CALL glLoadIdentity !モデルビュー変換を初期化する CALL gluLookAt(2,2,3, 0,0,0, 0,1,0) !ビュー変換にカメラ情報を反映する CALL draw_axis(0.2) !XYZ軸を描く !CALL glTranslatef(0,0,0) !モデル変換 - 平行移動 CALL glRotatef(theta,0,1,0) !モデル変換 - 回転 !CALL glScalef(1,1,1) !モデル変換 - 拡大・縮小 CALL DRAW !オブジェクトを描く CALL glutSwapBuffers END SUB SUB reshape(w,h) !GLUTシェイプコールバック関数 CALL glViewport(0,0,w,h) !スクリーンの位置、大きさを設定する CALL glMatrixMode(GL_PROJECTION) CALL glLoadIdentity !プロジェクション変換を初期化する CALL gluPerspective(60,w/h,2,10) !プロジェクション変換(パースペクティブ)を設定する !CALL glOrtho(-2,2,-1.5,1.5, 2,10) CALL glMatrixMode(GL_MODELVIEW) END SUB |
│├続き 山中和義 2005/10/20 21:52:03 ツリーへ
Re: プログラム |
返事を書く |
山中和義 2005/10/20 21:52:03 | |
続き SUB keyboard(c,x,y) !GLUTキーボード入力コールバック関数 IF c=27 THEN STOP !ESCキーなら終了 END SUB SUB timer(dummy) !GLUTタイマーコールバック関数 LET theta=theta+5 !5°回転させる IF theta>=360 THEN LET theta=0 !360以上なら0に戻す CALL glutTimerFunc(100,timer,0) !次回も呼び出してもらう CALL glutPostRedisplay !再描画を要求 END SUB SUB init !シーンの初期化 DIM diffuse(3) !光の設定 10 DATA 1,1,1,1 RESTORE 10 MAT READ diffuse DIM ambient(3) 20 DATA 0.2,0.2,0.2,1 RESTORE 20 MAT READ ambient CALL glClearColor(0,0,0,1) !背景色を設定する CALL glLightfv(GL_LIGHT0,GL_AMBIENT,ambient) !アンビエント光源 CALL glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuse) !ディフューズ光源 CALL glEnable(GL_LIGHT0) END SUB !main CALL glutInitWindowSize(320,240) !ウインドウサイズを指定する CALL init CALL glutMainLoop !あとのことはGLUTにまかせる END |
│├続き(3DCGAPI) 山中和義 2005/10/20 21:55:13 ツリーへ
Re: プログラム |
返事を書く |
山中和義 2005/10/20 21:55:13 | |
続き(3DCGAPI) !------------------------------------------------------------- !3DCGライブラリ(OpenGL風) v0.1α written by K.Yamanaka MODULE GLU !ワールド・ビュー変換モード PUBLIC SUB gluLookAt EXTERNAL SUB gluLookAt(px,py,pz, ex,ey,ez, ux,uy,uz) !ビュー変換(視点変換) OPTION BASE 0 DECLARE NUMERIC a(2),p(2),u(2),x(2),y(2),z(2),m(15) LET a(0)=px-ex LET a(1)=py-ey LET a(2)=pz-ez CALL Vec3Normalize(a,z) !Z=Normalize(P-E) ※E-P LET u(0)=ux LET u(1)=uy LET u(2)=uz CALL Vec3Cross(u,z,a) !X=Normalize(U×Z) CALL Vec3Normalize(a,x) CALL Vec3Cross(z,x,y) !Y=Z×X LET p(0)=px LET p(1)=py LET p(2)=pz LET m(0)=x(0) LET m(1)=x(1) LET m(2)=x(2) LET m(3)=-Vec3Dot(p,x) LET m(4)=y(0) LET m(5)=y(1) LET m(6)=y(2) LET m(7)=-Vec3Dot(p,y) LET m(8)=z(0) LET m(9)=z(1) LET m(10)=z(2) LET m(11)=-Vec3Dot(p,z) LET m(12)=0 LET m(13)=0 LET m(14)=0 LET m(15)=1 CALL GL.glLoadMatrix(m) END SUB !プロジェクション変換モード PUBLIC SUB gluPerspective EXTERNAL SUB gluPerspective(fov,asp,n,f) !プロジェクション変換(射影変換)- 透視射影 LET r=n*TAN(fov*PI/360) LET l=-r LET t=r/asp LET b=-t CALL GL.glFrustum(l,r,b,t, n,f) END SUB END MODULE |
│├続き 山中和義 2005/10/20 21:56:53 ツリーへ
Re: プログラム |
返事を書く |
山中和義 2005/10/20 21:56:53 | |
続き !------------------------------------------------------------- MODULE GL OPTION BASE 0 !行列 SHARE NUMERIC cMtx(15) !カレント行列 SHARE NUMERIC scMtx(15) !スクリーン変換行列 SHARE NUMERIC prMtx(15) !プロジェクション変換行列 SHARE NUMERIC wvMtx(15) !ワールド・ビュー変換行列 FOR i=0 TO 15 LET cMtx(i)=0 LET scMtx(i)=0 LET prMtx(i)=0 LET wvMtx(i)=0 NEXT i SHARE NUMERIC stMtx(255) !スタック領域 SHARE NUMERIC stCnt !スタックされた数 LET stCnt=0 SHARE NUMERIC GL_MODELVIEW !変換モード列挙型 SHARE NUMERIC GL_PROJECTION LET GL_MODELVIEW=BVAL("1700",16) LET GL_PROJECTION=BVAL("1701",16) SHARE NUMERIC mMode !変換モード(GL_MODELVIEW、GL_PROJECTION) LET fMode=GL_MODELVIEW SHARE NUMERIC GL_MODELVIEW_MATRIX !変換行列列挙型 SHARE NUMERIC GL_PROJECTION_MATRIX LET GL_MODELVIEW_MATRIX=BVAL("BA6",16) LET GL_PROJECTION_MATRIX=BVAL("BA7",16) PUBLIC SUB glGetFloatv EXTERNAL SUB glGetFloatv(k,m()) !行列を取得る IF k=GL_MODELVIEW_MATRIX THEN FOR i=0 TO 15 LET m(i)=wvMtx(i) NEXT i END IF IF k=GL_PROJECTION_MATRIX THEN FOR i=0 TO 15 LET m(i)=prMtx(i) NEXT i END IF END SUB PUBLIC SUB glLoadIdentity EXTERNAL SUB glLoadIdentity !単位行列を設定する FOR i=0 TO 15 LET cMtx(i)=0 NEXT i LET cMtx(0)=1 LET cMtx(5)=1 LET cMtx(10)=1 LET cMtx(15)=1 END SUB PUBLIC SUB glLoadMatrix EXTERNAL SUB glLoadMatrix(m()) !行列を設定する FOR i=0 TO 15 LET cMtx(i)=m(i) NEXT i END SUB PUBLIC SUB glMultMatrix EXTERNAL SUB glMultMatrix(m()) !カレント行列にかける OPTION BASE 0 DECLARE NUMERIC a(15) CALL MatrixMultiply(cMtx,m,a) CALL glLoadMatrix(a) END SUB EXTERNAL SUB MatrixMultiply(m1(),m2(),m()) !m=m1m2 FOR i=0 TO 3 FOR j=0 TO 3 LET t=0 FOR k=0 TO 3 LET t=t+m1(4*i+k)*m2(4*k+j) !PRINT m1(4*i+k),m2(4*k+j) NEXT k LET m(4*i+j)=t NEXT j NEXT i END SUB PUBLIC SUB glPushMatrix EXTERNAL SUB glPushMatrix !スタックに入れる IF stCnt>=16 THEN EXIT SUB FOR i=0 TO 15 LET stMtx(stCnt*16+i)=cMtx(i) NEXT i LET stCnt=stCnt+1 END SUB PUBLIC SUB glPopMatrix EXTERNAL SUB glPopMatrix !スタックから出す LET stCnt=stCnt-1 IF stCnt<0 THEN LET stCnt=0 FOR i=0 TO 15 LET cMtx(i)=stMtx(stCnt*16+i) NEXT i END SUB |
│├続き 山中和義 2005/10/20 22:00:16 ツリーへ
Re: プログラム |
返事を書く |
山中和義 2005/10/20 22:00:16 | |
続き PUBLIC SUB glRotatef EXTERNAL SUB glRotatef(theta, nx,ny,nz) !ワールド変換(絶対座標変換)- 回転 OPTION BASE 0 DECLARE NUMERIC a(2),n(2),m(15) LET a(0)=nx !軸ベクトルを正規化する LET a(1)=ny LET a(2)=nz CALL Vec3Normalize(a,n) LET sin_theta=SIN(theta*PI/360) !回転のクォータニオンをつくる LET qw=COS(theta*PI/360) LET qx=n(0)*sin_theta LET qy=n(1)*sin_theta LET qz=n(2)*sin_theta LET m(0)=1-2*(qy*qy+qz*qz) !回転行列をつくる LET m(1)=2*(qx*qy-qw*qz) LET m(2)=2*(qx*qz+qw*qy) LET m(3)=0 LET m(4)=2*(qx*qy+qw*qz) LET m(5)=1-2*(qx*qx+qz*qz) LET m(6)=2*(qy*qz-qw*qx) LET m(7)=0 LET m(8)=2*(qx*qz-qw*qy) LET m(9)=2*(qy*qz+qw*qx) LET m(10)=1-2*(qx*qx+qy*qy) LET m(11)=0 LET m(12)=0 LET m(13)=0 LET m(14)=0 LET m(15)=1 CALL glMultMatrix(m) END SUB PUBLIC SUB glScalef EXTERNAL SUB glScalef(sx,sy,sz) !ワールド変換(絶対座標変換)- 拡大・縮小 LET cMtx(0)=cMtx(0)*sx LET cMtx(5)=cMtx(5)*sy LET cMtx(10)=cMtx(10)*sz END SUB PUBLIC SUB glTranslatef EXTERNAL SUB glTranslatef(tx,ty,tz) !ワールド変換(絶対座標変換)- 平行移動 LET a=cMtx(0)*tx+cMtx(1)*ty+cMtx(2)*tz+cMtx(3)*1 LET b=cMtx(4)*tx+cMtx(5)*ty+cMtx(6)*tz+cMtx(7)*1 LET c=cMtx(8)*tx+cMtx(9)*ty+cMtx(10)*tz+cMtx(11)*1 LET d=cMtx(12)*tx+cMtx(13)*ty+cMtx(14)*tz+cMtx(15)*1 LET cMtx(3)=a LET cMtx(7)=b LET cMtx(11)=c LET cMtx(15)=d END SUB SHARE NUMERIC vx,vy,vw,vh !ビューポートの位置、大きさ PUBLIC SUB glViewport EXTERNAL SUB glViewport(x,y,w,h) !スクリーン変換(ビューポート変換) LET wd=w/2 LET ht=h/2 FOR i=0 TO 15 LET scMtx(i)=0 NEXT i LET scMtx(0)=wd LET scMtx(3)=wd+x LET scMtx(7)=ht+y LET scMtx(5)=ht LET scMtx(10)=1 LET scMtx(15)=1 LET vx=x !位置、大きさを保存する LET vy=y LET vw=w LET vh=h END SUB |
│├続き 山中和義 2005/10/20 22:02:32 ツリーへ
Re: プログラム |
返事を書く |
山中和義 2005/10/20 22:02:32 | |
続き PUBLIC SUB glFrustum EXTERNAL SUB glFrustum(l,r,b,t, n,f) !プロジェクション変換(射影変換)- 透視射影 OPTION BASE 0 DECLARE NUMERIC m(15) LET rl=r-l LET tb=t-b LET fn=f-n FOR i=0 TO 15 LET m(i)=0 NEXT i LET m(0)=2*n/rl LET m(2)=(r+l)/rl LET m(5)=2*n/tb LET m(6)=(t+b)/tb LET m(10)=-(f+n)/fn LET m(11)=-2*f*n/fn LET m(14)=-1 CALL GL.glLoadMatrix(m) END SUB EXTERNAL SUB glOrtho(l,r,b,t, n,f) !プロジェクション変換(射影変換)- 正射影 OPTION BASE 0 DECLARE NUMERIC m(15) LET rl=r-l LET tb=t-b LET fn=f-n FOR i=0 TO 15 LET m(i)=0 NEXT i LET m(0)=2/rl LET m(3)=(r+l)/rl LET m(5)=2/tb LET m(7)=(t+b)/tb LET m(10)=-2/fn LET m(11)=(f+n)/fn LET m(15)=1 CALL GL.glLoadMatrix(m) END SUB PUBLIC SUB glMatrixMode EXTERNAL SUB glMatrixMode(m) !変換モードの切替え CALL UpdateMatrix !カレント行列の内容を保存する LET mMode=m END SUB EXTERNAL SUB UpdateMatrix IF mMode=GL_MODELVIEW THEN FOR i=0 TO 15 LET wvMtx(i)=cMtx(i) NEXT i END IF IF mMode=GL_PROJECTION THEN FOR i=0 TO 15 LET prMtx(i)=cMtx(i) NEXT i END IF END SUB !ポリゴン描画 SHARE NUMERIC GL_POINTS !描画プリミティブ列挙型 SHARE NUMERIC GL_LINES SHARE NUMERIC GL_POLYGON LET GL_POINTS=BVAL("1",16) LET GL_LINES=BVAL("2",16) LET GL_POLYGON=BVAL("9",16) SHARE NUMERIC drwprim !描画プリミティブ(GL_POINTS、GL_LINES、GL_POLYGON) LET drwprim=GL_POLYGON SHARE NUMERIC lic !線色 LET lic=COLORINDEX(1,1,1) EXTERNAL SUB glColor3f(r,g,b) LET lic=COLORINDEX(r,g,b) END SUB SHARE NUMERIC mtc !背景色 LET mtc=COLORINDEX(1,1,1) EXTERNAL SUB glMaterialf(f,p, r,g,b,a) !材質(色)の定義 LET mtc=COLORINDEX(r,g,b) END SUB |
│├続き 山中和義 2005/10/20 22:04:37 ツリーへ
Re: プログラム |
返事を書く |
山中和義 2005/10/20 22:04:37 | |
続き SHARE NUMERIC tMtx(15) !合成した変換行列 SHARE NUMERIC vPtr,vBuf(500) !パケット書込み位置、バッファ(個数、色、頂点の位置) LET vPtr=0 LET vBuf(0)=-1 !EOF SHARE NUMERIC vCnt !個数 LET vCnt=0 PUBLIC SUB glBegin EXTERNAL SUB glBegin(f) !ポリゴン描画の開始 OPTION BASE 0 DECLARE NUMERIC m(15) LET drwprim=f !描画プリミティブを記録しておく CALL UpdateMatrix !カレント行列の内容を反映する CALL MatrixMultiply(scMtx,prMtx,m) !変換行列を作成する CALL MatrixMultiply(m,wvMtx,tMtx) LET vCnt=0 END SUB PUBLIC SUB glEnd EXTERNAL SUB glEnd !ポリゴン描画の終了 IF vCnt>0 THEN LET vBuf(vPtr)=vCnt !個数を記録する IF drwprim=GL_POLYGON THEN !面(多角形) LET vBuf(vPtr+1)=mtc !色を記録する ELSE LET vBuf(vPtr+1)=lic END IF LET vPtr=vPtr+2*vCnt+2 !個数、色、座標*個数分だけ格納位置を更新する END IF LET vBuf(vPtr)=-1 !とりあえずEOF END SUB PUBLIC SUB glVertex3fv EXTERNAL SUB glVertex3fv(v()) !頂点の定義 CALL glVertex4f(v(0),v(1),v(2),1) END SUB PUBLIC SUB glVertex3f EXTERNAL SUB glVertex3f(x,y,z) !頂点の定義 CALL glVertex4f(x,y,z,1) END SUB PUBLIC SUB glVertex4fv EXTERNAL SUB glVertex4fv(v()) !頂点の定義 CALL glVertex4f(v(0),v(1),v(2),v(3)) END SUB PUBLIC SUB glVertex4f EXTERNAL SUB glVertex4f(x,y,z,w) !頂点の定義 LET sx=tMtx(0)*x+tMtx(1)*y+tMtx(2)*z+tMtx(3)*w !ジオメトリ変換 LET sy=tMtx(4)*x+tMtx(5)*y+tMtx(6)*z+tMtx(7)*w LET sz=tMtx(8)*x+tMtx(9)*y+tMtx(10)*z+tMtx(11)*w LET z=tMtx(12)*x+tMtx(13)*y+tMtx(14)*z+tMtx(15)*w LET p=vPtr+2*vCnt+2 !スクリーン座標を記録する LET vBuf(p)=INT(sx/z) LET vBuf(p+1)=INT(sy/z) !PRINT p;":";vBuf(p);vBuf(p+1);sz/z !SX,SY,Z値(深度) LET vCnt=vCnt+1 !個数を更新する IF drwprim=GL_POINTS THEN !点 CALL glEnd !本パケットを閉じ、新しいものをつくる LET vCnt=0 END IF IF drwprim=GL_LINES AND vCnt=2 THEN !線 CALL glEnd LET vCnt=0 END IF END SUB |
│└続き 山中和義 2005/10/20 22:05:12 ツリーへ
Re: プログラム |
返事を書く |
山中和義 2005/10/20 22:05:12 | |
続き !レンダリング SHARE NUMERIC bgc !背景色 LET bgc=COLORINDEX(0,0,0) PUBLIC SUB glFlush EXTERNAL SUB glFlush SET DRAW mode hidden !ちらつき防止(開始) SET AREA COLOR bgc !ビューポートをクリアする PLOT AREA:vx,vy; vx+vw,vy; vx+vw,vy+vh; vx,vy+vh LET n=vBuf(0) !個数を取得する LET i=1 DO WHILE n>0 CALL draw_packet(i,n) !パケットを描く LET n=vBuf(i) !次へ LET i=i+1 LOOP LET vPtr=0 !バッファをクリアする LET vBuf(0)=-1 SET DRAW mode explicit !ちらつき防止(終了) END SUB EXTERNAL SUB draw_packet(i,n) !描画プリミティブを描く LET c=vBuf(i) !色を取得する SET LINE COLOR c LET i=i+1 SELECT CASE n !描画プリミティブ CASE 1 !点 SET POINT COLOR c PLOT POINTS:vBuf(i),vBuf(i+1) LET i=i+2 CASE 2 !線 PLOT LINES:vBuf(i),vBuf(i+1); vBuf(i+2),vBuf(i+3) LET i=i+4 CASE ELSE !面(多角形) LET p=i !始点位置を記憶しておく FOR k=0 TO n-1 !辺を描く PLOT LINES:vBuf(i),vBuf(i+1); LET i=i+2 NEXT k PLOT LINES:vBuf(p),vBuf(p+1) !閉じる END SELECT END SUB PUBLIC SUB glClearColor EXTERNAL SUB glClearColor(r,g,b,a) !背景の色を設定 LET bgc=COLORINDEX(r,g,b) END SUB PUBLIC SUB glClear EXTERNAL SUB glClear(f) !背景クリアする END SUB PUBLIC SUB glLightfv EXTERNAL SUB glLightfv(l,f,m()) END SUB PUBLIC SUB glEnable EXTERNAL SUB glEnable(f) END SUB PUBLIC SUB glDisable EXTERNAL SUB glDisable(f) END SUB END MODULE !------------------------------------------------------------- !ベクトル EXTERNAL FUNCTION Vec3Length(a()) !長さ |a| LET Vec3Length=SQR(a(0)*a(0)+a(1)*a(1)+a(2)*a(2)) END FUNCTION EXTERNAL SUB Vec3Normalize(a(),n()) !正規化 n=a/|a| LET l=Vec3Length(a) IF l>0 THEN LET n(0)=a(0)/l LET n(1)=a(1)/l LET n(2)=a(2)/l END IF END SUB EXTERNAL FUNCTION Vec3Dot(a(),b()) !内積 a・b LET Vec3Dot=a(0)*b(0)+a(1)*b(1)+a(2)*b(2) END FUNCTION EXTERNAL SUB Vec3Cross(a(),b(),c()) !外積 c=a×b LET c(0)=a(1)*b(2)-a(2)*b(1) LET c(1)=a(2)*b(0)-a(0)*b(2) LET c(2)=a(0)*b(1)-a(1)*b(0) END SUB |
└改修版 山中和義 2005/10/23 13:06:03 ツリーへ
Re: 3DCGライブラリ |
返事を書く |
山中和義 2005/10/23 13:06:03 | |
改修版 主プログラムへの参照が可能なようなので、 GLUTもサブルーチン化ができました。 プログラム構造がすっきりします。 インクルード部 メイン サブルーチン部 プログラムはこちらに記載しておきます。 http://www.urban.ne.jp/home/kz4ymnk/seminar/basic/3dcg_api.txt |
└すごい! 青木太一 2005/10/28 13:16:24 ツリーへ
Re: 改修版 |
返事を書く |
青木太一 2005/10/28 13:16:24 | |
すごい! 十進BASICの(FullBASICの?)モジュールっていまいち使いどころがわからなかったのですが、これは勉強になります。 (でも同時に言語の限界も見え隠れ(笑)。コールバック関数渡せなかったり。) |