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

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



紀香: たまには豪勢なホテルにゆっくり泊まりたいな、でも高いしなー...
良子: あなた“一休.com”知らないの〜?
紀香: なにそれ、一休さんとホテルとどう関係あるのよ??
良子: 超高級ホテルの格安予約サイトよ。今入会するとプレゼントいっぱい!
…早く登録しよ!"一休.com" http://www.ikyu.com/present/present007.htm でね



池田@NISです。

えんどうさん・阿部晃久さん、アドバイスありがとうございました。
いろいろ試した結果、以下のような方法でうまく実行することができました。

今までシーングラフを、

   BranchGroup(scene)
        |
   TransformGroup(modelGroup)
        |
   Node(colorCube)

とし、modelGroupをRotationInterpolator( alpha , modelGroup )として
回転していましたが、modelGroupの上にもう1つTransformGroup(rootGroup)
をいれて、

   BranchGroup(scene)
        |
   TransformGroup(rootGroup) --- Transform3D( rootRot )
        |
   TransformGroup(modelGroup) --- Transform3D( modelRot )
        |
   Node(colorCube)

とし、rootGroupをRotationInterpolator( alpha , rootGroup )として
回転するようにしました。そして、回転を停止したとき、rootRotを保存して
回転が再開したときに modelRot.mul( rootRot , modelRot ) としてmodelGroupを
変換し、rootRot,alphaを初期化して回転は再実行することにより停止した状態から
回転を再開することができるようになりました。
以下がソースです。

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 rootGroup,modelGroup;
    Alpha alpha;
    Transform3D axis,initRot,modelRot,rootRot;
    int axisIndex;
    long initTime = 10000L;
    long stepTime = 100L;
    long loopTime;
    RotationInterpolator rotator;
    Transform3D xyz[];

    public AutoRotator( TransformGroup rootGroup , TransformGroup modelGroup ) {
        this.rootGroup = rootGroup;
        this.modelGroup = modelGroup;

        rootRot = new Transform3D();
        rootGroup.getTransform( rootRot );

        modelRot = new Transform3D();
        modelGroup.getTransform( modelRot );
        initRot = new Transform3D( modelRot );

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

        alpha = new Alpha();
        alpha.setIncreasingAlphaDuration( loopTime );
        
        rotator = new RotationInterpolator( alpha , rootGroup );
        rotator.setSchedulingBounds( bounds );

        rootGroup.addChild( rotator );
        rotator.setEnable( false );
    }

    public void setAxisIndex( int axisIndex ) {
        this.axisIndex = axisIndex;
        xyz = new Transform3D[3];
        xyz[0] = new Transform3D();
        xyz[0].rotZ( Math.PI/2.0 );
        xyz[1] = new Transform3D();
        xyz[2] = new Transform3D();
        xyz[2].rotX( Math.PI/2.0 );
    }

    public void setEnable( boolean state ) {
        if( state ) {
            modelGroup.getTransform( modelRot );
            modelRot.mul( rootRot , modelRot );
            modelGroup.setTransform( modelRot );

            axis = new Transform3D( xyz[axisIndex] );
            rotator.setAxisOfRotation( axis );
            rootGroup.setTransform( new Transform3D() );

            alpha.setStartTime( System.currentTimeMillis() );
        }
        rotator.setEnable( state );
        if( !state ) {
           rootGroup.getTransform( rootRot );
        }
    }

    public void reset() {
        modelRot = new Transform3D( initRot );
        modelGroup.setTransform( modelRot );
        rootRot = new Transform3D();
        rootGroup.setTransform( new Transform3D() );
    }

    public boolean getEnable() {
        return rotator.getEnable();
    }
}
---------------------------------------------------------------
池田 隆志 ( E-Mail : ikeda@xxxxxxxxxxxxxxxxx )
      (株)NEC情報システムズ
   科学技術システム事業部 
( TEL 0298-50-2607(8-273-5664) : FAX 0298-56-6173(8-273-5739) )