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

[Java3Djp:00500] Re: about Behavior



==================================
★★★柏市・我孫子市にお住まいの皆様へ            ★★★
     今、話題のケーブルモデムによる高速インターネットサービス
△△△            タイタス ALLNET      △△△
=========== http://www.ALLNET.ne.jp ===========

>ですが、ユーザが任意に作成したイベントに対応してオブジェクトの状態を
>変化させることができるのでしょうか?
>例えばこのような例です。
>
>class AAA extends ... imprements runnable{
>  public void init(){
>    //オブジェクトの作成
>  }
>  public void start{ ...}
>  public void stop{...}
>  public void run{
>    while(true){
>      //オブジェクトの回転角度を指定
>    }
>  }
>}

私はこれに類したことをやってしまいました。
Behaviorを書いたのですがうまく行かなくて、
自分で書いたThreadからTransformGroupを操作していました。
これは、マウスプレスの際にプレスし続けるとズーム(物体のz軸方向への移動)
するという機能を実現したものです。
このときはSceneGraphにはaddChild()せずに、独立してコーディングしました。
納期前に1〜2日で書いた悪いコードで、バグもあるのでここには書かないでおきます。

>
>APIリファレンスにフレーム数をイベントにしてBehaviorを
>起動する等の記述があるのを見つけましたが、これが使
>えるのかどうか良く分かりませんでした。
>
>ご存知の方がいらっしゃいましたら、ご教授お願いいたします。

Java 3D API Specification に以下の記述があります。

> 9.1.3 WakeupCriterion Object
> 
>   Java 3D provides a rich set of wakeup criteria that Behavior objects can
>   use in specifying a complex WakeupCondition. These wakeup criteria can
>   cause Java 3D's behavior scheduler to invoke a behavior's
>   processStimulus method whenever 
> 
>     The center of a ViewPlatform enters a specified region
> 
>     The center of a ViewPlatform exits a specified region
> 
>     A behavior is activated
> 
>     A behavior is deactivated
> 
>     A specified TransformGroup node's transform changes
> 
>     Collision is detected between a specified Shape3D node's Geometry
>     object and any other object
> 
>     Movement occurs between a specified Shape3D node's Geometry object
>     and any other object with which it collides
> 
>     A specified Shape3D node's Geometry object no longer collides with
>     any other object
> 
>     A specified Behavior object posts a specific event
> 
>     A specified AWT event occurs
> 
>     A specified time interval elapses
> 
>     A specified number of frames have been drawn
> 
>     The center of a specified Sensor enters a specified region
> 
>     The center of a specified Sensor exits a specified region
> 
>   A Behavior object constructs a WakeupCriterion by constructing the
>   appropriate criterion object. The Behavior object must provide the
>   appropriate arguments (usually a reference to some scene graph object
>   and possibly a region of interest). Thus, to specify a
>   WakeupOnViewPlatformEntry, a behavior would specify the region that will
>   cause the behavior to execute if a ViewPlatform enters it. 

time interval というのが謎ですが、
その次にある number of frame has been drawn というのが、後の方にあるこれです。

> 9.5.3.5 WakeupOnElapsedFrames
> 
>   This WakeupCriterion object specifies that Java 3D should awaken this
>   behavior after it has rendered the specified number of frames. A value
>   of 0 implies that Java 3D will awaken this behavior at the next frame. 
> 
>   Constructors
> 
>   public WakeupOnElapsedFrames(int frameCount)
> 
>   This constructor creates a WakeupOnElapsedFrames object that informs the
>   Java 3D scheduler to wake up the specified Behavior object after it has
>   drawn frameCount frames. A frameCount value of 0 means wake up at the
>   next frame. 
> 
>   Methods
> 
>   public int getElapsedFrameCount()
> 
>   This method returns the frame count used in creating this
>   WakeupCriterion. 
> 
>   9.5.3.6 WakeupOnElapsedTime
> 
>   This WakeupCriterion object specifies that Java 3D should awaken this
>   behavior after an elapsed number of milliseconds. 
> 
>   Constructors
> 
>   public WakeupOnElapsedTime(long milliseconds)
> 
>   This constructor creates a WakeupOnElapsedTime object that informs the
>   Java 3D scheduler to wake up the specified Behavior object after the
>   specified number of milliseconds. 
> 
> 
>   Note: The Java 3D scheduler will schedule the object after the
>   specified number of milliseconds have elapsed, not before. However, the
>   elapsed time may actually be slightly greater than the time specified. 
> 
> 
>   Methods
> 
>   public long getElapsedFrameTime()
> 
>   This method returns the WakeupCriterion's elapsed time value in
>   milliseconds. 

具体的には、自分で書いた Behavior の initialize() の中で WakeupCriterion を
セットするときに WakeupOnElapsedFrames を使用することになると思います。

私は Behavior を書いて失敗したので、以下を参考にしてください。

com.sun.j3d.utils.behaviors.mouse パッケージのソース
com.sun.j3d.utils.behaviors.picking パッケージのソース

「Java3DTips Behaviorを作ろう」
 http://www.ipc-tokai.or.jp/~atusi/java3d/particulars/behavior.html
------------------------------------------------------------------
遠藤靖之 (えんどう やすゆき) <yasuyuki@xxxxxxxxxx>
http://www.javaopen.org/jfriends/ (Java互助会ホームページ)
株式会社タイムインターメディア 情報通信サービス部 TEL 03-5362-9009
〒162-0065 新宿区住吉町3-11    新宿スパイアビル   FAX 03-5362-9008