新しく発言する EXIT インデックスへ
カー・アニメーション続編

  カー・アニメーション続編 SECOND 2007/05/18 02:29:36  (修正1回)
  !続く。 SECOND 2007/05/18 02:30:51  (修正1回)
   └!上書き、修正した。個所は以下。 SECOND 2007/05/19 08:27:24 
    └!付録、行ベクトルと列ベクトル。 SECOND 2007/05/22 19:39:31  (修正1回)
     └リアルな3Dが表現されていて感動です。 山中和義 2007/05/23 09:43:16 
      └あの教示は、ありがとうございました。 SECOND 2007/05/23 17:52:26 

  カー・アニメーション続編 SECOND 2007/05/18 02:29:36  (修正1回) ツリーへ

カー・アニメーション続編 返事を書く ノートメニュー
SECOND <cszcthjjdj> 2007/05/18 02:29:36 ** この記事は1回修正されてます
!このアニメは、山中和義氏の過去掲示のガイドによって、発展させたものです。

!-----
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 !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(i,j)_Mp(行,列)

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

MAT READ Mp
DATA 1,0,0,0 !X→1X 投影面Z=1 で等倍。視点Z=0
DATA 0,1,0,0 !Y→1Y
DATA 0,0,1,1 !Z→1Z(無効) Z→倍率逆数(分母) 1/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)|1 0 0 0|=(X-x,Y-y,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=10 ! 10m/s 初速度
LET a=-1/3 ! -1m/s^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) まで、※奥から描く

!続く。

  !続く。 SECOND 2007/05/18 02:30:51  (修正1回) ツリーへ

Re: カー・アニメーション続編 返事を書く ノートメニュー
SECOND <cszcthjjdj> 2007/05/18 02:30:51 ** この記事は1回修正されてます
!続く。

LET dd=d-1.5
!----視点dd の位置( 2+yaw(d),1.5+pitch(d),dd )が、相対座標(X,Y,Z)の原点。
CALL MatrixTranslation(Mv, -2-yaw(d),-1.5-pitch(d),-dd) !左右上下動、左車線
!----
FOR i=2.5*INT(d/2.5)+170 TO dd+0.1 STEP -2.5
! ----パーツの位置
CALL MatrixTranslation(Tr, yaw(i),pitch(i),i) !左右上下動、z座標=i
!----
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,0,3,3,1) WITH mx !(x,y,幅,高,奥)
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=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.1-RND*0.2)*SHIFT(0.6-RND*1.2,2.7+0.75-RND*1.5)
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

   └!上書き、修正した。個所は以下。 SECOND 2007/05/19 08:27:24  ツリーへ

Re: !続く。 返事を書く ノートメニュー
SECOND <cszcthjjdj> 2007/05/19 08:27:24
!上書き、修正した。個所は以下。

!速度が、機種によって違いすぎるのを、修正。 IF t<>tb THEN → IF t>tb+0.15 THEN

!注釈訂正。 投影面Z=2 で等倍。→ 投影面Z=1 で等倍。

!注釈訂正。 200m地点 から、視点dd(Z=0)の 0.2m前方(Z=0.2)
 → 170m地点 から、視点dd(Z=0)の 0.1m前方(Z=0.1)

!FOR i=2.5*INT(d/2.5)+170 TO dd+0.2 STEP -2.5
 → FOR i=2.5*INT(d/2.5)+170 TO dd+0.1 STEP -2.5

    └!付録、行ベクトルと列ベクトル。 SECOND 2007/05/22 19:39:31  (修正1回) ツリーへ

Re: !上書き、修正した。個所は以下。 返事を書く ノートメニュー
SECOND <cszcthjjdj> 2007/05/22 19:39:31 ** この記事は1回修正されてます
!付録、行ベクトルと 列ベクトル。

!DRAW picture WITH 変形関数(行列)で写像するとき、

!十進BASIC の“ 絵 ”の各画素は、4次の“行ベクトル”。

! 左から実行 → SHIFT(x,y)*SCALE(a)

!原画_行ベクトル             出力画_行ベクトル
!  (X,Y,0,1)|1 0 0 0| |a 0 0 0|=(aX+ax, aY+ay, 0, 1)
!       |0 1 0 0| |0 a 0 0|
!       |0 0 1 0| |0 0 a 0|
!       |x y 0 1| |0 0 0 1|


!数学の講義などに、よく出てくる“列ベクトル”で、上の式を、表現すると、
!その実行の順序が、左右逆で、行列自体も、互いに行と列が逆(転置行列)。

!         SCALE(a)*SHIFT(x,y) ← 右から実行 ・・!仮定、注意!

!出力画_列ベクトル            原画_列ベクトル ・・!仮定、注意!
!    |aX+ax|= |a 0 0 0| |1 0 0 x| | X |
!    |aY+ay| |0 a 0 0| |0 1 0 y| | Y |
!    | 0 | |0 0 a 0| |0 0 1 0| | 0 | ・・!仮定、注意!
!    | 1 | |0 0 0 1| |0 0 0 1| | 1 |


!--------------------
!実際の変形関数の行列を、確かめる事ができる。
!(ヘルプ、目次→ 手続き定義→ 変形指示MAT文)

DIM A(4,4)
DRAW a_pict WITH SHIFT(2,3)
DRAW a_pict WITH SCALE(4)
DRAW a_pict WITH SHIFT(2,3)*SCALE(4)

PICTURE a_pict
MAT A=TRANSFORM
MAT PRINT USING "|--% --% --% --% |":A
PRINT
END PICTURE

!--------------------
!X,Y,Z の 3x3 行列を使わず、なぜ、4x4 になっているのか・・
! 1次追加すると、
! 上の例の、+ax とか +ay の様な、独立する平行移動 SHIFT(,) が、
! 行列の積のみで、実現できる。アファイン変換(線形+平行移動)

END

     └リアルな3Dが表現されていて感動です。 山中和義 2007/05/23 09:43:16  ツリーへ

Re: !付録、行ベクトルと列ベクトル。 返事を書く ノートメニュー
山中和義 <drdlxujciw> 2007/05/23 09:43:16
リアルな3Dが表現されていて感動です。

いくつかのプログラミングで、数学の「楽しさ」、
学生時代には見えなかった(能力不足)ことが最近少し見えてきたような気がします。


プログラミングのときに、小生も陥った内容(グラフィックス関連)のメモ書きです。

どっちの料理ショー
http://www.urban.ne.jp/home/kz4ymnk/supple/cg07.txt

      └あの教示は、ありがとうございました。 SECOND 2007/05/23 17:52:26  ツリーへ

Re: リアルな3Dが表現されていて感動です。 返事を書く ノートメニュー
SECOND <cszcthjjdj> 2007/05/23 17:52:26
あの教示は、ありがとうございました。
恩師にほめてもらえるのは、恐縮します。
あれ以来、十進BASIC のマトリクス機能に魅せられています。


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