カー・アニメーション続編 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 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 のマトリクス機能に魅せられています。 |