Emulate3Dで単位を扱おう

皆さんこんにちは、Emulate3Dの技術担当の小嶋です。

突然ですが、私は単位が苦手です。小学校の算数の授業で、単位を変換する文章題でいつもつまずいていました。
「時間」や「センチ」や「ミリ」から始まったかと思えば、高学年になって習う「速さ・時間・距離」の「は・じ・き」の変換と、ずっとついて回るんですよね。

小学校 授業 イメージ

単位ごとの変換についても、 「10ミリが1センチ」、「100センチが1メートル」はまだ分かりやすいですが、テレビの大きさで「55インチ」といわれても、どれくらいの大きさかいまいちピンとこない、そんな経験はないでしょうか。

テレビ インチ イメージ

1メートルは39.370インチですが、このように単位が混在するとややこしくて仕方がありません。テレビでは「▲▲V型」とも言いますし、日本ではあまり馴染みがないですが、ヤード、フィートといった単位もあります。いろいろな単位を学ぶアメリカの小学生は大変そうですね。

Emulate3Dなら、このような単位の扱いも簡単に行えます。

目次

■Emulate3Dで普通に単位を扱うと・・・?

■Optionsから単位の設定

■Script上で設定した単位を使用する

■独自の単位を定義する

■おわりに

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]に変更します。

Emulate3D Options Units 単位を変更

以上の設定で、プロパティウインドウ上の表示が該当単位に変化します。
インチ単位で、Boxのサイズを変更できるようになりました。

Emulate3D プロパティウインドウ 任意の単位に設定

長さの単位では、メートル、インチ以外にも、ミリメートル、マイル、ヤードなどが設定可能です。
 

他にも多数の単位を設定可能です。

重さの場合・・・グラム、キログラム、オンス、ポンド
時間の場合・・・ミリ秒、秒、分、時間、日、週
国内では馴染みのない単位も設定可能です。
 

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を用いて設定した単位(インチ)に出力できることがわかります。

Emulate3D 単位 インチ単位で表記

※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と表記されます。

Emulate3D 0,1mを1とする 独自単位ITAGEを定義

他の活用例としては、面積の単位である坪、ヘクタールなども独自で定義することが可能です。下記がヘクタールを定義したコード例になります。

// 10000平方メートルを1ヘクタールと定義する
var newHaPref = new UnitDescriptor("ha", UnitType.Area, "ha", 10000);

print(newHaPref.ToString(senderBox.Width * senderBox.Depth, true)); 

おわりに

オプションから単位を設定することで、机上で計算をしなくても、Emulate3D上で細かい値の操作が可能になりました。

サポートサイトには、Scriptだけではなく、便利なEmulate3Dの使い方も掲載しています。こちらも併せてご活用ください。