新しく発言する EXIT インデックスへ
続:バス発車、停車のプログラム

  続:バス発車、停車のプログラム 山中和義 2006/11/06 15:44:32 
  座標平面上のグラフの動きだけでなく、実際... zyam56 2006/11/06 22:05:02 
  画面がきれいで、楽しい。なんども走らせて... SECOND 2006/11/07 00:44:50 
  カー・シミュレーションへのカスタマイズ 山中和義 2006/11/07 11:44:04 
  │└!おもいっきり、いじりました。WITHマトリク... SECOND 2006/11/12 00:24:54 
  │ └!続き SECOND 2006/11/12 00:26:44 
  │  └脱帽!! zyam56 2006/11/12 11:26:16 
  山中様、SECOND様。ありがとうございました... zyam56 2006/11/16 19:02:38 

  続:バス発車、停車のプログラム 山中和義 2006/11/06 15:44:32  ツリーへ

続:バス発車、停車のプログラム 返事を書く
山中和義 2006/11/06 15:44:32
!等加速度運動
!!!DEF a(t)=1 !1m/秒/秒 ※正は加速、負は減速
DEF a(t)=-1 !−1m/秒/秒 ※正は加速、負は減速
DEF v(t)=v0+a(t)*t !速度
DEF d(t)=a(t)*t*t/2+v0*t !移動距離 ※∫v(t)dt

!!!LET v0=0 !初速度0m/秒
LET v0=10 !初速度10m/秒

LET t0=TIME !減速開始
!!!DO WHILE v(t)<10 !速度10m/秒になるまで
DO WHILE v(t)>0 !停止するまで
LET t=TIME-t0 !経過時間を得る

IF t<>tb THEN
PRINT USING "時間=###.## ":t;
PRINT USING "速度=###.## ":v(t);
PRINT USING "移動距離=####.###":d(t)
LET tb=t

CALL Animation(t,v(t),d(t)) !アニメーション
END IF
LOOP

END

EXTERNAL PICTURE BusStop(c) !停留場マーク
SET AREA COLOR c
PLOT AREA:-0.025,0; 0.025,0; 0.025,2; -0.025,2
DRAW disk WITH SCALE(0.5)*SHIFT(0,2)
END PICTURE

EXTERNAL PICTURE Road !道路
PLOT LINES:0,0; 2.9,0
PLOT LINES:3.1,0; 6,0
END PICTURE

EXTERNAL SUB Animation(t,v,d)
SET WINDOW -5,5,-5,5 !投影面の大きさ

SET DRAW mode hidden !ちらつき防止(開始)
CLEAR
SET AREA COLOR 17 !空
PLOT AREA:-5,0; 5,0; 5,5; -5,5

LET dd=d-2 !視界に入るように2m下げる
DIM Mv(4,4),Mp(4,4) !ビュー変換行列、プロジェクション変換行列
CALL MoveCamera(2,1.5,dd, Mv,Mp) !バスを移動する
!!!CALL MoveCamera(5,1.5,dd, Mv,Mp) !対抗車線を走る
!!!CALL MoveCamera(-1,1.5,dd, Mv,Mp) !歩道を走る

FOR i=200 TO 0 STEP -10 !10m間隔 ※奥ゆきを考慮
IF i>dd THEN !視点の後ろ側はカリングする
DIM Tr(4,4) !平行移動
CALL MatrixTranslation(Tr, 0,0,i) !ワールド座標へ
IF i=50 THEN
DRAW BusStop(3)WITH Tr*Mv*Mp !停留場を描く
ELSE
DRAW BusStop(4)WITH Tr*Mv*Mp
END IF
END IF
NEXT i

FOR i=200 TO 0 STEP -2.5 !2.5m間隔
IF i>dd THEN
CALL MatrixTranslation(Tr, 0,0,i)
DRAW Road WITH Tr*Mv*Mp
END IF
NEXT i

SET DRAW mode explicit !ちらつき防止(終了)
END SUB


!視点が投影の中心位置、投影面Z=d(XY平面)とする射影
EXTERNAL SUB MoveCamera(vx,vy,vz, Mv(,),Mp(,))
CALL MatrixTranslation(Mv, -vx,-vy,-vz) !視点を原点とする座標へ

MAT Mp=IDN !※正射影の場合は単位行列となる
LET Mp(1,1)=5 !投影面Z=5(XY平面)
LET Mp(2,2)=5
LET Mp(3,3)=5
LET Mp(3,4)=1
LET Mp(4,4)=0
END SUB

EXTERNAL SUB MatrixTranslation(M(,), tx,ty,tz) !ワールド変換- 平行移動
MAT M=IDN
LET M(4,1)=tx
LET M(4,2)=ty
LET M(4,3)=tz
END SUB

  座標平面上のグラフの動きだけでなく、実際... zyam56 2006/11/06 22:05:02  ツリーへ

Re: 続:バス発車、停車のプログラム 返事を書く
zyam56 2006/11/06 22:05:02
座標平面上のグラフの動きだけでなく、実際にバスの車窓から見ているような感覚が体験できとても面白いです。
PC教室で併用で使わせていただきます。
それにしても、すごいことができるものなんですね。

  画面がきれいで、楽しい。なんども走らせて... SECOND 2006/11/07 00:44:50  ツリーへ

Re: 続:バス発車、停車のプログラム 返事を書く
SECOND 2006/11/07 00:44:50
画面がきれいで、楽しい。なんども走らせてます。

  カー・シミュレーションへのカスタマイズ 山中和義 2006/11/07 11:44:04  ツリーへ

Re: 続:バス発車、停車のプログラム 返事を書く
山中和義 2006/11/07 11:44:04
カー・シミュレーションへのカスタマイズ

パーツは、正面の絵(ビルボード)を用意することで市街地などのアニメーションを作成できます。
ビルなど厚みのある絵を描く場合、十進BASICでは描画命令にZ座標の値がないため、
左右の側面部分は正面の絵を回転させる必要があります。(難)

EXTERNAL PICTURE tree !街路樹
SET AREA COLOR 12 !幹
PLOT AREA:-0.075,0; 0.075,0; 0.025,3; -0.025,3
SET AREA COLOR 10 !葉
DRAW disk WITH SCALE(0.4)*SHIFT(0,3)
DRAW disk WITH SCALE(0.5)*SHIFT(-0.5,2.5)
DRAW disk WITH SCALE(0.5)*SHIFT(0.5,2)
END PICTURE


道路のカーブ、勾配は、擬似的にヨー(頭の左右ねじり)、ピッチ(縦振り)を追加します。
3Dでは回転ですが、ここでは横・縦移動(スライド)で処理します。
そうすると、ファミコン時代のゲームが実現できるかと思います。

EXTERNAL SUB Animation(t,v,d)
DEF yaw(x)=2*SIN(x*5*PI/180) !カーブ
DEF pitch(x)=SIN(x*5*PI/180) !勾配

SET WINDOW -5,5,-5,5 !投影面の大きさ

SET DRAW mode hidden !ちらつき防止(開始)
CLEAR
SET AREA COLOR 17 !空
PLOT AREA:-5,0; 5,0; 5,5; -5,5

LET dd=d-2 !視界に入るように2m下げる
DIM Mv(4,4),Mp(4,4) !ビュー変換行列、プロジェクション変換行列
CALL MoveCamera(2+yaw(dd),1.5+pitch(dd),dd, Mv,Mp) !バスを移動する

FOR i=200 TO 0 STEP -2.5 !2.5m間隔 ※奥ゆきを考慮して、奥から描く
IF i>dd THEN !視点の後ろ側はカリングする
DIM Tr(4,4) !平行移動
CALL MatrixTranslation(Tr, 0+yaw(i),0+pitch(i),i) !ワールド座標へ
DRAW Road WITH Tr*Mv*Mp !道路を描く
END IF
NEXT i

FOR i=200 TO 0 STEP -10 !10m間隔
IF i>dd THEN
CALL MatrixTranslation(Tr, 0+yaw(i),0+pitch(i),i)
DRAW tree WITH Tr*Mv*Mp !街路樹を描く
END IF
NEXT i

SET DRAW mode explicit !ちらつき防止(終了)
END SUB



道路の陰線消去を行うには、道路の絵を次のように変更してください。
 SET AREA COLOR 2 !道路の背景色で塗る ※陰線消去
とするとからくりがわかると思います。

EXTERNAL PICTURE Road !道路
SET AREA COLOR 0 !道路の背景色で塗る ※陰線消去
PLOT AREA:0,0; 6,0; 6,-1; 0,-1
PLOT LINES:0,0; 2.9,0 !道路の面
PLOT LINES:3.1,0; 6,0
END PICTURE

  │└!おもいっきり、いじりました。WITHマトリク... SECOND 2006/11/12 00:24:54  ツリーへ

Re: カー・シミュレーションへのカスタマイズ 返事を書く
SECOND 2006/11/12 00:24:54
!おもいっきり、いじりました。WITH マトリクス に魅せられています。
!-----
DIM Tr(4,4),Mv(4,4),Mp(4,4) !被写体移動、視点移動、フ゜ロシ゛ェクション変換
DIM mx(4,4),Xz(4,4),zY(4,4)

!-----Y軸→Z軸 XY平面図→XZ平面図
MAT READ Xz
DATA 1,0,0,0
DATA 0,0,1,0
DATA 0,0,0,0
DATA 0,0,0,1 !Xz(4,2)=Y座標_オフセット

!-----X軸→Z軸 XY平面図→ZY平面図
MAT READ zY
DATA 0,0,1,0
DATA 0,1,0,0
DATA 0,0,0,0
DATA 0,0,0,1 !zY(4,1)=X座標_オフセット

SET WINDOW -5,5,-5,5 !投影面の大きさ

!-----3D(X,Y,Z)→2D(X,Y)/Z フ゜ロシ゛ェクション変換 Mp(i,j)_Mp(行,列)
MAT READ Mp
DATA 5,0,0,0 !X→5X 投影面Z=5 視点Z=0
DATA 0,5,0,0 !Y→5Y
DATA 0,0,5,1 !Z→5Z(無効) Z→倍率逆数(分母)
DATA 0,0,0,0

!原画_行ヘ゛クトル  Tr   論理_行ヘ゛クトル
! (X,Y,0,1)|1 0 0 0|=(X,Y,Z,1)Z 座標の追加。
!      |0 1 0 0|
!      |0 0 1 0|
!      |0 0 Z 1|
!論理_行ヘ゛クトル  Mv    論理_行ヘ゛クトル
! (X,Y,Z,1)|1 0 0 0|=(X-x,Y-y,Z-z,1)視点(x,y,z)からの相対座標。
!      |0 1 0 0|
!      |0 0 1 0|
!      |-x -y -z 1|
!論理_行ヘ゛クトル    Mp    表示_行ヘ゛クトル
!(X-x,Y-y,Z-z,1)|5 0 0 0|=(5{X-x},5{Y-y},5{Z-z},Z-z)
!        |0 5 0 0|
!        |0 0 5 1|
!        |0 0 0 0|
!5{Z-z}:Z座標は無効。代わりに、Z-z を4列目にコピー。
!4列目:倍率逆数(分母)= 1/{Z-z}  総合倍率= 5/{Z-z}

!-----
!等加速度運動
DEF v(t)=v0 +a*t !速度
DEF d(t)=v0*t+a*t*t/2 !移動距離 ※∫v(t)dt

!LET v0= 0 ! 0m/s 初速度
!LET a=+1 ! 1m/s^2 加速
LET v0=10 ! 10m/s 初速度
LET a=-1 ! -1m/s^2 減速

LET t0=TIME !開始
!DO WHILE v(t)<10 !加速、速度10m/s になるまで
DO WHILE v(t)> 0 !減速、停止するまで
LET t=TIME-t0 !経過時間を得る
IF t<>tb THEN
LET tb=t
PRINT USING "時間=###.### ":t;
PRINT USING "速度=###.## ":v(t);
PRINT USING "移動距離=####.###":d(t)
SET DRAW mode hidden !ちらつき防止(開始)
CALL Animation( d(t)) !アニメーション
SET DRAW mode explicit !ちらつき防止(終了)
END IF
LOOP

!カー・シミュレーションへのカスタマイズ

  │ └!続き SECOND 2006/11/12 00:26:44  ツリーへ

Re: !おもいっきり、いじりました。WITHマトリク... 返事を書く
SECOND 2006/11/12 00:26:44
!続き
!カー・シミュレーションへのカスタマイズ

!視点dd(Z=0)を投影の中心位置として、投影面(XY平面 Z=5)に射影。

DEF yaw(x)= 5*SIN(x*0.1) !カーブ、 ヨー(頭の左右ねじり)
DEF pitch(x)=1*SIN(x*0.1) !勾配、 ヒ゜ッチ(縦振り)

SUB Animation(d) !-----バスの位置d の外界を描く
CLEAR
SET AREA COLOR 17 !空
PLOT AREA:-5,0; 5,0; 5,5; -5,5

LET dd=d-2 !バスの位置d が(Z=2m)、一定になる様に 視点dd (Z=0m)を追従。

!-----視点dd の位置( 左車線の場合 x=2 y=1.5 z=dd )、相対座標(X,Y,Z)の原点。
!CALL MatrixTranslation(Mv, +1,-1.5,-dd) !歩道
!CALL MatrixTranslation(Mv, -5,-1.5,-dd) !右車線
!CALL MatrixTranslation(Mv, -2,-1.5,-dd) !左車線
CALL MatrixTranslation(Mv, -2-yaw(d),-1.5-pitch(d),-dd) !左右上下動、左車線

! 200m地点 から、視点dd(Z=0)の 0.2m前方(Z=0.2) まで、※奥から描く
FOR i=200 TO dd+0.2 STEP -2!-2.5
!-----パーツの位置
!CALL MatrixTranslation(Tr, 0,0,i) !z座標=i
CALL MatrixTranslation(Tr, yaw(i),pitch(i),i) !左右上下動、z座標=i
MAT mx=Tr*Mv*Mp
DRAW 道路 WITH mx
IF REMAINDER(i,10) =4 THEN DRAW 街路樹 WITH mx
IF REMAINDER(i,10) =0 THEN
IF i=50 THEN DRAW バス停(3)WITH mx ELSE DRAW バス停(4)WITH mx !(終点=3 途中=4)
DRAW 建物 WITH mx
END IF
NEXT i
END SUB

SUB MatrixTranslation(M(,), tx,ty,tz) !平行移動
MAT M=IDN
LET M(4,1)=tx
LET M(4,2)=ty
LET M(4,3)=tz
END SUB

!パーツの原形サイズの決め方。バスの位置d (Z=2m)の、表示倍率は 5/z= 5/2
!ここで、画面のフルスケール(x=y= -5~+5) に合せる。

PICTURE 建物
LET Xz(4,2)=3 !Y座標はココで設定。Y=3
DRAW 屋上 WITH Xz !Y軸→Z軸
LET zY(4,1)=8 !X座標はココで設定。X=8
DRAW 表側 WITH zY !X軸→Z軸
SET AREA COLOR 22
PLOT AREA:8,0; 9,0; 9,3; 8,3 !側面
END PICTURE
PICTURE 表側
SET AREA COLOR 25
PLOT AREA:0,0; 3,0; 3,3; 0,3 !(Z,Y)座標として描く。
END PICTURE
PICTURE 屋上
SET AREA COLOR 26
PLOT AREA:8,0; 9,0; 9,3; 8,3 !(X,Z)座標として描く。
END PICTURE

PICTURE 道路
LET Xz(4,2)=0 !Y座標はココで設定。Y=0
DRAW 路面 WITH Xz !Y軸→Z軸
PLOT LINES: 0,0; 2.9,0
PLOT LINES:3.1,0; 6,0
END PICTURE
PICTURE 路面
SET AREA COLOR 15
PLOT AREA:0,0; 6,0; 6,1; 0,1 !(X,Z)座標として描く。
END PICTURE

PICTURE 街路樹
SET AREA COLOR 12 !幹
PLOT AREA:-0.075,0; 0.075,0; 0.025,3; -0.025,3
SET AREA COLOR 10 !葉
DRAW disk WITH SCALE(0.4)*SHIFT(0,3)
DRAW disk WITH SCALE(0.5)*SHIFT(-0.5,2.5)
DRAW disk WITH SCALE(0.5)*SHIFT(0.5,2)
END PICTURE

PICTURE バス停(c)
SET AREA COLOR c
PLOT AREA:-0.025,0; 0.025,0; 0.025,2; -0.025,2
DRAW disk WITH SCALE(0.5)*SHIFT(0,2)
END PICTURE

END

  │  └脱帽!! zyam56 2006/11/12 11:26:16  ツリーへ

Re: !続き 返事を書く
zyam56 2006/11/12 11:26:16
脱帽!!

  山中様、SECOND様。ありがとうございました... zyam56 2006/11/16 19:02:38  ツリーへ

Re: 続:バス発車、停車のプログラム 返事を書く
zyam56 2006/11/16 19:02:38
山中様、SECOND様。ありがとうございました。教室で生徒達がおおよろこびでした。


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