!スカイ・ウェイ

 投稿者:SECOND  投稿日:2009年 5月10日(日)13時25分52秒
  !こんなものが、出て来た。(再投稿?、再々・・不明)
!このアニメは、山中和義氏のガイドにより、大昔しに、作成したものです。

!スカイ・ウェイ
!-----
DIM Tr(4,4),Mv(4,4),Mp(4,4) !被写体移動、視点移動、プロジェクション変換
DIM mx(4,4),Xz(4,4),zY(4,4) !作業用、XY_Xz変換、XY_zY変換

MAT Tr=IDN
MAT Mv=IDN

!-----Y軸→Z軸 XY平面図→XZ平面図
MAT READ Xz
DATA 1,0,0,0
DATA 0,0,1,0 !Xz(2,1)=Z軸水平傾斜、Xz(2,2)=Z軸垂直傾斜
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 !zY(1,1)=Z軸水平傾斜、zY(1,2)=Z軸垂直傾斜
DATA 0,1,0,0
DATA 0,0,0,0
DATA 0,0,0,1 !zY(4,1)=増設X座標

!-----3D(X,Y,Z)→2D(X,Y)/Z プロジェクション変換 Mp(行,列)

SET WINDOW -1,1,-1,1 ! 画面スケールで、投影距離調整。
!           行列は、1に正規化した。
MAT READ Mp
DATA 1,0,0,0 !(X,Y,Z,1)→(1X,1Y,1Z,1Z) 3列目の1Z は無効。
DATA 0,1,0,0 !
DATA 0,0,1,1 !      4列目の1Z→ 描画倍率=1/1Z で 遠近効果する。
DATA 0,0,0,0 !             (距離1への投影)

!-----
!原画_行ベクトル 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)|1 0 0 0| →(X-x,Y-y,Z-z,Z-z) Z 座標を、縮小率へ転写。
!        |0 1 0 0|
!        |0 0 1 1|
!        |0 0 0 0|
!4列目Z-z:倍率逆数(分母)= 1/{Z-z} Z座標→投影縮小率。

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

LET v0=15 ! m/s 初速度
LET a=-v0^2/2/298 ! m/s^2 減速加速度, -v0^2/2/移動距離
!
LET t0=TIME !開始
DO WHILE v(t)>0 !減速、停止するまで
   LET t=TIME-t0 !経過時間を得る
   IF t>tb+0.15 THEN
      LET tb=t
      PRINT USING "時間=###.## 速度=##.##  走行距離=###.##":t,v(t),d(t)
      SET DRAW mode hidden !裏ページに書く、ちらつき防止の開始
      CALL Animation( d(t)) !位置d(t)の前方描画
      SET DRAW mode explicit !裏ページの表示、ちらつき防止の終了
   END IF
LOOP

DEF yaw(z)=10*SIN((z-2)*0.1) !カーブ、横の偏差
DEF d_yaw(z)= COS((z-2)*0.1) !カーブ、微分係数
DEF pitch(z)=5*SIN(z*0.1) !ピッチ、縦の偏差
DEF d_pitch(z)=0.5*COS(z*0.1) !ピッチ、微分係数

SUB Animation(d) !-----バス位置d の外界を描く
   CLEAR
   !----空
   SET AREA COLOR 17
   PLOT AREA:-1,0; 1,0; 1,1; -1,1
   !----地
   SET AREA COLOR 42
   PLOT AREA:-1,0; 1,0; 1,-1; -1,-1
   !----文字
   SET TEXT COLOR 0
   SET TEXT FONT "",90
   !
   !バス位置d が固定(Z=1.5m)する様に 視点dd (Z=0m)を後ろへ下げる。
   !視点dd(Z=0)を中心、バス位置d(Z=1.5)を画面の枠に合わせる。投影面(Z=1.5)に射影。
   !前方170m から、視点dd(Z=0)の 0.1m前方(Z=0.1)を限界に、※奥から描く
   !
   !----視点移動のマトリクス Mv
   LET dd=d-1.5
   LET Mv(4,1)=-2-yaw(d) !車道左端から2m と左右動
   LET Mv(4,2)=-1.5-pitch(d) !高さ1.5m と上下動
   LET Mv(4,3)=-dd !バス位置d の後方1.5m
   !----
   ! 1    ,0      ,0 , 0|
   ! 0    ,1      ,0 , 0|
   ! 0    ,0      ,1 , 0|
   !-2-yaw(d) ,-1.5-pitch(d),-dd, 1|
   !----
   FOR i=2.5*INT(d/2.5)+170 TO dd+0.1 STEP -2.5
   ! ----被写体移動のマトリクス Tr
      LET Tr(4,1)=yaw(i) !左右動
      LET Tr(4,2)=pitch(i) !上下動
      LET Tr(4,3)=i !z座標
      !----
      ! 1   ,0    ,0, 0|
      ! 0   ,1    ,0, 0|
      ! 0   ,0    ,1, 0|
      ! yaw(i) ,pitch(i) ,i, 1|
      !----
      MAT mx=Tr*Mv*Mp
      DRAW 道路 WITH mx
      IF REMAINDER(i,10) =5 THEN DRAW 街路樹 WITH mx
      IF REMAINDER(i,10) =0 THEN
         IF REMAINDER(i,50)=0 THEN DRAW バス停(2)WITH mx ELSE DRAW バス停(4)WITH mx !(終点=3 途中=4)
         DRAW 建物(8,-9,3,3,1) WITH mx !(x,y,幅,高,奥)
         DRAW 建物(-8,-9,3,3,1) WITH mx !(x,y,幅,高,奥)
      END IF
   NEXT i
END SUB

!パーツのサイズ。バスの位置d (Z=1.5m)で、表示倍率 1/z=1/1.5

PICTURE 建物(x,y,w,h,d1)
! ---顔面
   LET zY(1,1)=d_yaw(i+w/2) !Z軸水平傾斜、カーブの微分
   LET zY(1,2)=0 !d_pitch(i+w/2) !Z軸垂直傾斜、ピッチの微分
   LET zY(4,1)=x !増設X軸
   DRAW 前後面(y,w,h) WITH zY !元のX軸→Z軸
   !---背面
   LET zY(4,1)=x+d1 !増設X軸
   DRAW 前後面(y,w,h) WITH zY !元のX軸→Z軸
   !---屋上
   LET Xz(2,1)=d_yaw(i+w/2) !Z軸水平傾斜、z軸カーブの微分
   LET Xz(2,2)=0 !d_pitch(i+w/2) !Z軸垂直傾斜、z軸ピッチの微分
   LET Xz(4,2)=y+h !増設Y軸
   DRAW 水平面(x,w,d1) WITH Xz !元のY軸→Z軸
   !---床面
   LET Xz(4,2)=y !増設Y軸
   DRAW 水平面(x,w,d1) WITH Xz !元のY軸→Z軸
   !---側面
   SET AREA COLOR 22
   PLOT AREA:x,y; x+d1,y; x+d1,y+h; x,y+h
END PICTURE
!
PICTURE 前後面(y,w,h)
   SET AREA COLOR 25
   PLOT AREA:0,y; w,y; w,y+h; 0,y+h !(Z,Y)座標として描く。
END PICTURE
PICTURE 水平面(x,w,d1)
   SET AREA COLOR 25 !26
   PLOT AREA:x,0; x+d1,0; x+d1,w; x,w !(X,Z)座標として描く。
END PICTURE

PICTURE 道路
   LET Xz(2,1)=d_yaw(i+2.2/2) !Z軸水平傾斜、z軸カーブの微分
   LET Xz(2,2)=d_pitch(i+2.2/2) !Z軸垂直傾斜、z軸ピッチの微分
   LET Xz(4,2)=0 !増設Y軸
   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,2.2; 0,2.2 !(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 !葉
   FOR w=1 TO 7
      DRAW disk WITH SCALE(0.3+0.05-RND*0.1)*SHIFT(0.4-RND*0.8, 2.7+0.325-RND*0.75)
   NEXT W
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)
   PLOT TEXT,AT -.35,1.74,USING ">%%":STR$(i)
END PICTURE

END
 

戻る