[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) )