新しく発言する EXIT インデックスへ
3DCGライブラリ

  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の?)モジュールっていまいち使いどころがわからなかったのですが、これは勉強になります。
(でも同時に言語の限界も見え隠れ(笑)。コールバック関数渡せなかったり。)


インデックスへ EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。