takeyohのおぼえがき

気になったこと、試したことの記録です。

アナログの時計(針)の動かし方

クロエさん(twitterのお友達)から、素敵な情報を頂きました。ありがとうございます!

フィガロには、メーターの中にアナログ時計(短針のみ)があるんです。

これの動かし方がわからず困ってました。

KUNOSのマニュアルにはそれっぽいことは書いてあっても、実際の動かし方まで書かれておらず、行き詰っていたのですが、CSP側で対応されていることがわかりました。

元情報はこちら。

Cars – Instruments inputs · ac-custom-shaders-patch/acc-extension-config Wiki · GitHub

で、実際の実装方法です。

まず、ほかのメータ類と同じように、時計用のエンプティと針オブジェクトを用意します。これはフィガロの例。

12時間時計と短針があります。エンプティ名はARROW_TIMEで、COCKPIT_HRの配下に入れます。(ARROW_TIMEはACの決まりで、CSPでの制御なら、違う名前でも動くかも)

まず、針のオブジェクトですが、後述するCSPの制御では、エンプティで制御するのではなく、オブジェクトの原点を中心に回転するようです。
ですので、オブジェクトの針の原点を回転する場所に合わせておく必要があります。

(以前書いたアナログメータの針設置の記事に合わせ方、書いてあります。)
アナログメータの設置 - takeyohのおぼえがき (hatenablog.com)

 

エンプティARROW_TIMEの向きも、ほかのメータ同様、上の絵の向きです。
(青が奥、緑が針の方向)

そして、エンプティの向きが決まったら、ARROW_TIMEエンプティの配下に針オブジェクト(上記例ではClock)を入れます。

これでモデルはOK。fbxでエクスポートし、ksEditorでkn5を作成し、車のmodフォルダにコピーします。

 

次に設定の方。下記は、CSP用なので、extension/ext_config.iniに追記します。
(data/analog_instruments.iniではないので注意!)

[ANALOG_INDICATOR_...]
NAME = Clock          ; name of mesh to move
INPUT = TIME_HOURS               ; any of supported inputs
UPPER_BOUND = 12                 ; maximum input value for arrow to move with
LOWER_BOUND = 0                  ; minimum input value
START = 0                     ; offset for starting point, degress
RANGE = 360                      ; full range of arrow to move to at the upper bound, degress
;POS_OFFSET_START = 0, -0.1, 0.1  ; position offset for the minimum value
;POS_OFFSET_END = 0, -0.1, 0.1    ; position offset for the upper bound
;SCALE_START = 0, 1, 1            ; scale for the minimum value
;SCALE_END = 1, 1, 1              ; scale for the upper bound (allows to create progress bars and such)
;SPEED_LAG = 0.2                  ; lag for speed, adding inertia of movement
;G_FACTOR = 0.1, 0, 0             ; adds a bit of needle offset bound to G-forces for those axis
;LUT = (| 60=-1| 90=-62 |)        ; optionally maps input values to degrees

一旦最初のリンク先情報をコピペしたので長いですが、コメントアウトしたところを除くと、以下の通りです。

NAMEは針のオブジェクト名(この例だとClock)
INPUTは入力される情報。時はTIME_HOURSでした。
UPPER_BOUNDはINPUTの最大値。
LOWER_BOUNDはINPUTの最小値。
STARTは針を動かす最初の角度。blenderで作成するとき、12時を指すように動かしてからkn5作ってますので、0時=0度となります。
RANGEは最大の回転角度。12時間で360度回るように設定。
それ以降の設定は特に不要でした。

ちなみに時間って24時間じゃね?という話ですが、最初はUPPER_BOUNDを24、RANGEを720に設定して動かしてみました。確かに、24時間なので、2回転でまた12時に戻っては来るのですが、23時59分から0時に変わった瞬間、針がぐるぐるっと一瞬戻るアニメーションが出ます。ほとんど見ることはないですが、ちょっと気になります。

で、試しに半分のUPPER_BOUNDを12、RANGEを360にしてみると、なんと午後になってももう一周普通に回り、0時に変わる瞬間も変なアニメーションは出ません。なので、12時間で制御しても、24時間にはちゃんと対応できます。

そしてもう一つ、時(短針)があるなら、分(長針)と秒(秒針)もあるのでは?と思い、こちらもテスト。結論は「可能」でした。

分(長針)の場合はこれ。

[ANALOG_INDICATOR_...]
NAME = arrowMinutes          ; name of mesh to move
INPUT = TIME_MINUTES               ; any of supported inputs
UPPER_BOUND = 60                 ; maximum input value for arrow to move with
LOWER_BOUND = 0                  ; minimum input value
START = 0                     ; offset for starting point, degress
RANGE = 360                      ; full range of arrow to move to at the upper bound, degress

NAMEは環境に合わせてください。
INPUTの名前がTIME_MINUTESです。
分なのでUPPERは60(分)、で一周するので360ですね。

同じく秒はこちら。

[ANALOG_INDICATOR_...]
NAME = arrowSeconds          ; name of mesh to move
INPUT = TIME_SECONDS               ; any of supported inputs
UPPER_BOUND = 60                 ; maximum input value for arrow to move with
LOWER_BOUND = 0                  ; minimum input value
START = 0                     ; offset for starting point, degress
RANGE = 360                      ; full range of arrow to move to at the upper bound, degress

NAMEは環境に合わせてください。
INPUTの名前がTIME_SECONDSです。
秒なのでUPPERは60(秒)、で一周するので360ですね。

今回フィガロは短針しかありませんでしたが、針を3つ用意すれば、普通のアナログ時計も作成が可能です。アナログ時計がついた車ってあまり見たことないですけどねっ!

最後にフィガロで短針が動いている様子の動画です。

youtu.be

 

/* -----codeの行番号----- */