YU-RIS サポート掲示板

0231 拡縮&回転
投稿者:たくみ 2005/06/09(木) 21:33

どうもです〜(^^

> ただ、私のPCでは約30度おきに1枚しか描画できませんでした。(涙)

うわぁ…そんなに遅くなってしまいますか…。
やっぱり拡大縮小させながら回転処理させるとそのくらいになってしまうのかな…。
今のところ、とりあえず実装できたという段階なので、まだチューン出来ていないんですよね…。
まだまだ速度改善できそうなので、近いうちにチューンしてみます。

> 最終的に今回つくってみたかったものがありまして、それは「加速度的に拡大しながら回転」だったりします。

なるほどなるほど。
いろいろYU-RISを触ってくださって有り難うございますm(^^)m

> とりあえずその前段階として、等速度で回転しながら拡大してゆく様子を表現したかったので以下のように書いてみました。

> Q1.どのように記述すれば実現できるでしょうか。

はい。まず、SET の値の代入方法に関してですが、
例えば SET=1.3*5 とすると、式の中に少数(実数)がありますので、式が自動的にFLOATで計算されるようになっています。
で、1.3 * 5 = 6.5 となり、その時点で整数に置き換えられ(小数以下が切り捨てられ)、SET に 6 の値がセットされます。
ですので、そこに関しては問題無いはずなのですが、
下のスクリプトを拝見しましたところ、エラーの原因が分かりました。
「設定できる値は1〜」というエラーが出てしまうとのことですが、

CG[NO=5 A=0 FILE="cg/back5"]
CG[NO=6 FILE=""]
CG[NO=7 FILE=""]
INT[@ZOOMX=1]
INT[@ZOOMY=1]
INT[@ROTC=0]
INT[@CNTR=0]//※3
LOOP[]
CGACT[NO=5 BNO=6 SIZE=1 SET=@ZOOMX SET2=@ZOOMY] //※1
CGACT[NO=6 BNO=7 ROTATION=1 SET=@ROTC]
WAIT[FRAME=1]
@ZOOMX=6.4*@CNTR //※2
@ZOOMY=4.8*@CNTR //※2
@ROTC+=1
//※4
IF[@CNTR>100] LOOPBREAK[] IFEND[]
LOOPEND[]

えと、※1の部分でSETに0が入ってしまったために出てしまったエラーだと思います。
つまり @ZOOMX に0が入ってしまう場面が存在します。
具体的には、まず最初から順に命令が実行されていき、初めて※2の部分を通った時点で、
その時点での @CNTR の値が0なので、@ZOOMX, @ZOOMY の値が0になります。
そして、LOOPEND を通って※1のところに戻り、そこで@ZOOMX, @ZOOMY の値が0であるために
SET=0 となり、エラーになっているようです。
解決策としては、※3の@CNTRの初期値を1にして、あとは ※4の部分あたりに「@CNTR+=1」を追加すれば
OKだと思います。一応修正バージョンを書きますと、

CG[NO=5 A=0 FILE="cg/back5"]
INT[@ZOOMX=1]
INT[@ZOOMY=1]
INT[@ROTC=0]
INT[@CNTR=1]
LOOP[]
CGACT[NO=5 BNO=6 SIZE=1 SET=@ZOOMX SET2=@ZOOMY]
CGACT[NO=6 BNO=7 ROTATION=1 SET=@ROTC]
WAIT[FRAME=1]
@ZOOMX=6.4*@CNTR
@ZOOMY=4.8*@CNTR
@ROTC+=1
@CNTR+=1
IF[@CNTR>100] LOOPBREAK[] IFEND[]
LOOPEND[]

これで動くかと思います。

> Q2.今回書こうとしている表現方法のように、拡大縮小回転を、等速度あるいは等加速度運動として表現したい場合ですが、
> 処理の重いPCでも軽いPCでも、等しく一定時間で同じ動作を表現したいと思います。重いPCではコマ落ちしながらの表現になります。
> WAIT[FLAME=???]の???を増やす方法では、増やした分だけ1描画更新時間が延びてしまい実現できません。うまい記述の方法はありますか。

現状でなんとか解決させるとしたら、一回の移動量を3フレーム分に増やすとか、くらいでしょうか…。
回転だけ、あるいは拡大だけなら、いくらか処理は速いのですが、両方となるとさすがに現状では厳しいようです。
現在のところ、YU-RIS内部の拡大縮小回転の演算があまりに遅いため、
それをチューンする以外に解決法がなさそうです…。
ひとまず参考になればと、今、拡大縮小&回転それぞれのサンプルを作ってますので、しばらくお待ちくださいませ。
明日の朝までには公開できるかと思います。

> Q3.WAIT[FLAME=????]とは違うアプローチですが、WAITせず普通に画面に更新してくれと伝える命令と、
> なるべく精度の高い経過時間を検出して処理を分岐したいので、高精度タイマーが欲しいのですが(timeGetTime()またはマルチメディア系の
> 高精度タイマーのような)、ございますか?

はい。ありますです。システム変数に @_OS_TIME() という変数がありまして、これは中で timeGetTime() を呼び出しています。
なので精度はミリ秒と、十分高いですよ(^^
例えばスクリプトのA地点で @TIME1=@_OS_TIME(0) を処理し、また別のB地点で @TIME2=@_OS_TIME(0) を処理して、
@TIME3 = @TIME2 - @TIME1 とすれば、A地点を通ってからB地点に到達するまでの時間が
ミリ秒単位で @TIME3 に代入されます(^^


- 関連一覧ツリー (■ をクリックするとツリー全体を一括表示します)