[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Java3Djp:01409] Re: RotationInterpolator の実行と停止について





池田@NISです。

2000/05/23 18:57:06 +0900にyasuyuki@xxxxxxxxxxxxさんに頂いた
「[Java3Djp:01404] Re: RotationInterpolator の実行と停止について」への返事です。
>
>えんどうです。
>
>>  推測ですが、RotationInterpolatorにセットしたAplhaは停止せずに動いているのではないかと思います。
>
>その通りです。ずっと動いています。
>
>>  そこで質問なのですが、Alphaを一時停止したり再実行したりすることはできるのでしょうか。
>
>うろおぼえですが下記でそのようなことをやっている痕跡があります。
>
>http://www.javaopen.org/j3dbook/examples/AlphaTest/AlphaPanel.java
>
>Alpha#setStartTime(System.getCurrentTimeMillis());
>
>でリスタートできますが、alpha 値は 0 に戻っていると思いました。

>
>Alpha には値をセットするメソッドは無いので、
>停止させたときの alpha 値をおぼえておくのではなく、
>
>停止させたときの角度を覚えておいて
>そこから再開させることになるのかも知れません。
>

  停止したときの角度を保存し、再実行するとき保存した角度を設定し
 Aalpha.setStartTime( System.currentTimeMillis() )の設定を行いましたが、
 今度は、再実行すると常に初期の角度から回転するようになり、やはりうまく行きません。

 RotationInterpolatorに関するクラスのコードを添付します。
 このクラスは、Behavierを継承したクラス内で生成し、キーの入力により回転を実行するとき
 setEnabel( true )を設定し、停止するときsetEnable( false )を設定します。

 角度を出力してみるとsetAxisOfRotationに設定される角度は停止時の角度がちゃんと
 設定されるように見えるのですが。

------------------------------------------------------------
import javax.media.j3d.*;
import javax.vecmath.*;

public class AutoRotator {

    static public int AXIS_X = 0;
    static public int AXIS_Y = 1;
    static public int AXIS_Z = 2;

    TransformGroup model;
    Alpha alpha;
    Transform3D axis,rot;
    int axisIndex;
    long loopTime = 10000L;
    RotationInterpolator rotator;
    Transform3D xyz[];
    BoundingSphere bounds;

    public AutoRotator( TransformGroup model , int axisIndex ) {
        this.model = model;
        this.axisIndex = axisIndex;

	    rot = new Transform3D();
	    model.getTransform( rot );

        bounds=new BoundingSphere( new Point3d( 0.0,0.0,0.0 ) , 100.0 );

        alpha = new Alpha();
	    alpha.setIncreasingAlphaDuration( loopTime );
	    axis = new Transform3D( rot );
        rotator = new RotationInterpolator( alpha , model );
        rotator.setSchedulingBounds( bounds );

        model.addChild( rotator );

        xyz = new Transform3D[3];
        xyz[0] = new Transform3D();
        xyz[0].rotX( Math.PI/2.0 );
        xyz[1] = new Transform3D();
        xyz[2] = new Transform3D();
	    xyz[2].rotY( Math.PI/2.0 );
	    rotator.setEnable( false );
    }

    public void setEnable( boolean state ) {
        if( state ) {
	        System.out.println("AutoRotation + axis"+axisIndex+"=\n"+axis);
	        System.out.println("AutoRotation + rot"+axisIndex+"=\n"+rot);

	        axis.set( rot );

	        System.out.println("AutoRotation + axis"+axisIndex+"=\n"+axis);

	        axis.mul( xyz[axisIndex] );
	        rotator.setAxisOfRotation( axis );
	        alpha.setStartTime( System.currentTimeMillis() );
	    }
        rotator.setEnable( state );
	    if( !state ) {
	        model.getTransform( rot );
	        System.out.println("AutoRotation - model"+axisIndex+"=\n"+rot);
	    }
    }

    public boolean getEnable() {
        return rotator.getEnable();
    }
}
---------------------------------------------------------------
池田 隆志 ( E-Mail : ikeda@xxxxxxxxxxxxxxxxx )
      (株)NEC情報システムズ