Emulate3Dで単位を扱おう
皆さんこんにちは、Emulate3Dの技術担当の小嶋です。
突然ですが、私は単位が苦手です。小学校の算数の授業で、単位を変換する文章題でいつもつまずいていました。
「時間」や「センチ」や「ミリ」から始まったかと思えば、高学年になって習う「速さ・時間・距離」の「は・じ・き」の変換と、ずっとついて回るんですよね。
単位ごとの変換についても、 「10ミリが1センチ」、「100センチが1メートル」はまだ分かりやすいですが、テレビの大きさで「55インチ」といわれても、どれくらいの大きさかいまいちピンとこない、そんな経験はないでしょうか。
1メートルは39.370インチですが、このように単位が混在するとややこしくて仕方がありません。テレビでは「▲▲V型」とも言いますし、日本ではあまり馴染みがないですが、ヤード、フィートといった単位もあります。いろいろな単位を学ぶアメリカの小学生は大変そうですね。
Emulate3Dなら、このような単位の扱いも簡単に行えます。
目次
Emulate3Dで普通に単位を扱うと・・・?
Emulate3Dでは、長さをメートルで表示しています。
では、Boxの幅(Widthプロパティ)をインチ単位で出力するにはどうすればよいでしょうか。
Emulate3Dのシーン上にBoxを追加し、下記Scriptを記入します。
[Auto]
void OnInitialize(Visual sender)
{
// 幅を取得するため、自分自身をBoxVisual型で定義する
// (Visual型のままでは取得できない)
var senderBox = sender as BoxVisual;
// 1メートル=39.370インチ
// Boxの幅はメートル単位なので、39.370を掛ければインチ数が求まる
print(senderBox.Width * 39.370);
}
以上のScriptを記載してモデルを再生すると、幅がインチに変換されて表示されます。
しかし、39.370という数字がインチ数を求めるために書いているということがScriptを見ただけではわからないうえ、実際にScriptを書くときにパッと浮かびません。
IT業界ではこのような数値は「マジックナンバー」と呼ばれ、別の人が見たらコードを見ても何をしているのかが分からないため、避けるべき表現です。
そこで、Emulate3Dの「Unitsクラス」を活用します。Units
クラス内のInches
メソッドではインチをメートルに変換できるため、これを応用してメートルをインチに変換します。
下記Scriptに書き換えます。
[Auto]
void OnInitialize(Visual sender)
{
// 幅を取得するため、自分自身をBoxVisual型で定義する
// (Visual型のままでは取得できない)
var senderBox = sender as BoxVisual;
// Unitsクラス内のInchesメソッドで割ることでインチ単位で出力できる。
print(senderBox.Width / Units.Inches(1));
}
このUnits.Inches()
メソッドに引数「1」を与えることで、1インチをメートルに換算した0.0254を返します。
そのため、senderBox.Width
から割り算することでメートルからインチ単位に変換が行えます。
しかし、扱う単位がインチから変わると、Scriptを書き直す必要があり不便です。
また、「幅を50インチにしたい」という場合、「プロパティウインドウに入力しながら50インチになるように微調整する」、「机上で電卓を使って計算する」などの方法がありますが、もっと簡単な方法があります。
Optionsから単位の設定
[Files]>[Options]>[Units]で、単位の設定画面が開きます。
Distanceのプルダウンメニューを開き、[Meter]を[Inch]に変更します。
以上の設定で、プロパティウインドウ上の表示が該当単位に変化します。
インチ単位で、Boxのサイズを変更できるようになりました。
長さの単位では、メートル、インチ以外にも、ミリメートル、マイル、ヤードなどが設定可能です。
他にも多数の単位を設定可能です。
重さの場合・・・グラム、キログラム、オンス、ポンド
時間の場合・・・ミリ秒、秒、分、時間、日、週
国内では馴染みのない単位も設定可能です。
Script上で設定した単位を使用する
設定した単位と、Script上の単位は異なります。
Emulate3Dの単位に関する情報はUnits.Preference
に格納されているので、そこから単位を取得します。
下記Scriptを記入します。
// 出力されるのはメートル単位となってしまう
print(senderBox.Width);
// オプションで設定した長さの表示単位を取得(当記事ではインチ)
var distancePref = Units.Preference.Distance;
// インチでBoxの幅を表示する
print(distancePref.ToString(senderBox.Width, true));
上記Scriptを実行すると下記画像のようになります。
「3」は3メートルの幅をprint(senderBox.Width)
で出力した結果です。
「118.1102 in」はToString
で変換した値を出力した結果です。
この結果から、Units.Preference.Distance
を用いて設定した単位(インチ)に出力できることがわかります。
※inの表示が不要な場合や、数値で取得したい場合は、下記Scriptとしてください。print(distancePref.ToUnits(senderBox.Width));
このScriptとすると、文字列ではなく数値で取得できます。
独自の単位を定義する
ここまでは、Emulate3Dに組み込まれている単位を扱う手順を紹介していましたが、業務で必要な独自単位を自分で定義することも可能です。
例として、0.1メートル =「1 ITAGE」とする単位を独自で作ってみましょう。
下記Scriptを記入します。
// 新しい単位を定義 0.1メートルごとに「1 ITAGE」とする
var newItagePref = new UnitDescriptor("ITAGE", UnitType.Distance, "ITAGE", 0.1);
// 当記事では3メートルなので「30 ITAGE」となる
print(newItagePref.ToString(senderBox.Width, true));
上記Scriptを実行すると下記画像のようになります。 0.1メートルごとに1 ITAGEとなっているため、30 ITAGEと表記されます。
他の活用例としては、面積の単位である坪、ヘクタールなども独自で定義することが可能です。下記がヘクタールを定義したコード例になります。
// 10000平方メートルを1ヘクタールと定義する
var newHaPref = new UnitDescriptor("ha", UnitType.Area, "ha", 10000);
print(newHaPref.ToString(senderBox.Width * senderBox.Depth, true));
おわりに
オプションから単位を設定することで、机上で計算をしなくても、Emulate3D上で細かい値の操作が可能になりました。
サポートサイトには、Scriptだけではなく、便利なEmulate3Dの使い方も掲載しています。こちらも併せてご活用ください。