MRが楽しい

MRやVRについて学習したことを書き残す

Blenderで子オブジェクトの位置を固定したまま親オブジェクトのみ移動する

本日はBlenderの小ネタ枠です。
子オブジェクトの位置を固定したまま親オブジェクトのみ移動する方法についてです。

子オブジェクトの位置を固定したまま親オブジェクトのみ移動する

通常子オブジェクトを持つ親オブジェクトのトランスフォームを移動すると、子オブジェクトも一緒に移動します。

オブジェクトモードで[オプション]のプルダウンを開き、[親]にチェックを入れます。

これで子オブジェクトを固定したまま親オブジェクトのトランスフォームのみを変更できるようになります。
以下のように親オブジェクトを移動しても子オブジェクトが移動しなくなりました。

回転、スケールの変更も同様に子オブジェクトは影響を受けなくなります。

Blenderでオブジェクトの原点を移動する

本日はBlenderの小ネタ枠です。
Blenderでオブジェクトの原点を移動する方法についてです。

オブジェクトの原点を移動する

オブジェクトを変形せずに原点のみ移動したい場合、オブジェクトモードに切り替えます。

[オプション]のプルダウンを開き、[原点]にチェックを入れます。

これで原点を表す黄色い点を選択できるようになります。
移動したい原点を左クリックで選択します。

これで通常の移動操作で原点位置を移動できます。
ショートカットキーの G -> X or Y or Z -> (移動量) で移動軸を固定したり、指定の数値だけ動かすことが可能です。

Unity Learnのビジュアルスクリプティング学習を試す その9(ビジュアルスクリプトを使ってSwitchを用いた制御を行う)

本日はUnityの技術調査枠です。
Unity Learnのビジュアルスクリプティング学習を試した内容を記事にします。
今回はビジュアルスクリプトを使った基本プログラムの続きを試します。

前回記事

以下の前回記事の続きです。
bluebirdofoz.hatenablog.com

入力されたキーを取得する

前回作成したスクリプトを改修して、更にSキーが押下されているタイミングではCubeを下降させるようにしていきます。

入力されたキーを文字列で取得し、それをSwitchノードで判定するようにします。
SpaceキーをチェックするGet Keyノードを右クリックから[Delate]で削除します。

Graphウィンドウの何もないところを右クリックしてInput: Get Input Stringノードを検索して追加します。
本ノードは押されたキーをチェックして、そのキーストロークの文字列を出力します。

Switchで分岐を判定する

次のIfノードを右クリックから[Delate]で削除します。

Graphウィンドウの何もないところを右クリックしてSwitch On Stringノードを検索して追加します。
本ノードは入力された文字列に応じてフローを分岐することができます。

On Updateノードのフロー出力をSwitch On Stringノードのフロー入力に接続し、Get Input Stringノードの値出力をSwitch On Stringノードの値入力に接続します。

次に以下の設定を行ってSwitchの分岐を設定します。
・Ignore Caseにチェックを入れる
・Optionsで+アイコンを選択して空白(Space)を入力する
・Optionsで+アイコンを選択してWを入力する
・Optionsで+アイコンを選択してSを入力する

これでSpace, W, S, それ以外のキー入力に応じてフロー分岐を行うSwitchノードが作成できました。

オブジェクトを下降させる

オブジェクトを下降させる処理フローを新たに作成します。
上昇フローのGet Upノードを使っていた箇所をVector 3: Get Downノードに差し替えたフローを作成します。

Translateノードに値を引き渡すためのGet Variableノードを別途作成し、上昇と下降ノードからは実行フローのみを接続しておきます。

今回はキーによる分岐を利用するため、上昇フローのGet KeyノードとIfノードは不要になります。

フローに応じた処理を接続する

SwitchノードのSpaceの出力ポートにRotateノードに接続します。
これでSpaceキー入力時はCubeオブジェクトが回転するようになります。

次にSwitchノードのWの出力ポートにオブジェクトの上昇フローを接続します。
これでWキー入力時はCubeオブジェクトが上昇するようになります。

最後にSwitchノードのSの出力ポートにオブジェクトの下降フローを接続します。
これでSキー入力時はCubeオブジェクトが下降するようになります。

最終的に完成したGraphは以下のようになります。

動作を確認する

シーンの再生ボタンを押して動作を確認します。
何もしない状態ではCubeオブジェクトは移動しません。

Spaceキーを押下するとCubeが回転し、Wキーを押下するとCubeが上昇、Sキーを押下すると下降したら成功です。

Unity Learnのビジュアルスクリプティング学習を試す その8(ビジュアルスクリプトを使ってVector3を用いた位置変更を行う)

本日はUnityの技術調査枠です。
Unity Learnのビジュアルスクリプティング学習を試した内容を記事にします。
今回はビジュアルスクリプトを使った基本プログラムの続きを試します。

前回記事

以下の前回記事の続きです。
bluebirdofoz.hatenablog.com

キー入力による分岐を増やす

前回作成したスクリプトを改修して、Wキーが押下されているタイミングではCubeを上昇させるようにしていきます。

初めにWキーが押下されているかどうかを判定するフローを追加します。
IfノードのFalseの出力ポートから先にGet KeyノードとIfノードを接続して追加します。

Get Keyノードの[Key]欄は W を設定します。
これでSpaceキーが押下されていない場合はWキーが押下されているかどうかの判定を行います。

位置変更の変数を作成する

次に位置変更の量を記録するGraph変数を作成します。
[Blackboard -> Graph]パネルから ChangePos という名前を入力して[+]ボタンで変数を作成します。

[Type]を[Vector3]、[Value]を[0,0,0]に設定します。
本変数にはCubeを現在の位置から移動させる相対的な移動距離を格納します。

移動距離を計算する

移動距離を計算するフローを作成します。
Graphウィンドウの何もないところを右クリックしてVector 3: Get Upノードを検索して追加します。

Vector 3: Get Upノードは X:0 Y:1 Z:0 の値を返します。
これはVector3.upと同じ値で上方向のベクトルを示します。
docs.unity3d.com

これをそのまま移動距離とすると単位が1mとなって値が非常に大きいので、0.01を乗算して1cmの移動距離に演算します。
Graphウィンドウの何もないところを右クリックしてFloat Literalノードを検索して追加します。

Float LiteralノードはFloat型の任意の値を出力できます。今回は0.01を設定します。
更に乗算を行うためのMultiply (in Math/Generic)ノードも追加して検索して追加します。

追加したノードを以下のように接続してGet Upノードの値を0.01で乗算します。

計算した値をChangePos変数に設定するため、Set Graph Variableノードを追加して接続します。
Set VariableノードにChangePosの参照を設定すれば計算した移動距離が反映されるようになります。

Wキー押下時にCubeオブジェクトを上昇させる

移動距離を計算する実行タイミングを指定するため、Wキーの判定を行うIfノードのTrue出力ポートからSet Variableノードにトリガーを接続します。
これでWキーが押下されたタイミングでChangePosの値が計算されるようになりました。

更に計算した値を使ってCubeオブジェクトを実際に移動させる必要があります。
Transform: Translate (Translation, Relative To)ノードを検索して追加します。

Translateノードは指定のVector3の値でオブジェクトを移動します。
Set Variableノードのトリガーと値の出力ポートをTranslateノードの入力ポートに接続すれば、ChangePosの値の分だけオブジェクトが移動するようになります。

最終的に完成したGraphは以下のようになります。

動作を確認する

シーンの再生ボタンを押して動作を確認します。
何もしない状態ではCubeオブジェクトは移動しません。

Wキーを押下するとCubeが上昇したら成功です。Wキーから手を離すと停止します。

次回はビジュアルスクリプトを使ってSwitchを用いた制御を試します。
bluebirdofoz.hatenablog.com

Unity Learnのビジュアルスクリプティング学習を試す その7(ビジュアルスクリプトを使って入力に応じた分岐を行う)

本日はUnityの技術調査枠です。
Unity Learnのビジュアルスクリプティング学習を試した内容を記事にします。
今回はビジュアルスクリプトを使った基本プログラムの続きを試します。

前回記事

以下の前回記事の続きです。
bluebirdofoz.hatenablog.com

キーボード入力を検出する

前回作成したスクリプトを改修して、Spaceキーが押下されているタイミングだけCubeを回転するようにします。

実行タイミングを変更するため、一旦On UpdateノードとRotateノードの接続を解除します。
接続部をドラッグするか右クリックから[]で接続を解除できます。

次にキーボード入力を検出するノードを追加します。
Graphウィンドウの何もないところを右クリックしてInput: Get Key (Key)ノードを検索して追加します。

Get Keyノードは[Key]で指定したキーが入力されている間Trueを返します。
Spaceキーの入力を検出するため、ドロップダウンを開いて[Space]を選択します。

次にGraphウィンドウの何もないところを右クリックしてIfノードを検索して追加します。

Get Keyノードのトリガーと値の出力ポートをIfノードの入力ポートに接続します。
これでGet Keyノードが出力中の値がTrueかFalseで処理を分岐できるようになります。

今回はTrueの出力ポートをRotateの入力ポートに接続します。
これでGet KeyノードがTrueのときのみ、Rotateノードによる回転が実行されるようになります。

動作を確認する

シーンの再生ボタンを押して動作を確認します。
何もしない状態ではCubeオブジェクトが回転しなくなっています。

Spaceキーを押下するとCubeが回転しだしたら成功です。Spaceキーから手を離すと停止します。

次回はビジュアルスクリプトを使ってVector3を用いた位置変更を試します。
bluebirdofoz.hatenablog.com

Unity Learnのビジュアルスクリプティング学習を試す その6(ビジュアルスクリプトを使った基本プログラムを試す2)

本日はUnityの技術調査枠です。
Unity Learnのビジュアルスクリプティング学習を試した内容を記事にします。
今回はビジュアルスクリプトを使った基本プログラムの続きを試します。

前回記事

以下の前回記事の続きです。
bluebirdofoz.hatenablog.com

[コンピュータの表示速度 (秒 / フレーム)]を取得する

実行トリガーとしてOn Updateノードを追加します。
Graphウィンドウの何もないところを右クリックしてOn Updateを検索して追加します。

次に実行トリガーが呼ばれたときの[コンピュータの表示速度 (秒 / フレーム)]を取得するため、Get Delta Timeノードを利用します。
Graphウィンドウの何もないところを右クリックしてTime: Get Delta Timeノードを検索して追加します。

Get Delta Timeノードは前回のUpdateの実行フレームから今回のUpdateの実行フレームまでの秒数を返します。
以下のTime.deltaTimeと同じ機能を持ちます。
docs.unity3d.com

[Update実行時の回転度数 / フレーム]を計算する

以下の計算式に必要な数値を準備できたのでビジュアルスクリプト内で[Update実行時の回転度数 / フレーム]を計算します。

[1秒あたりの回転度数 / 秒]×[コンピュータの表示速度 (秒 / フレーム)]=[Update実行時の回転度数 / フレーム]

乗算を行うためにMultiplyノードを追加します。Multiplyノードにはいくつかのオーバーロードが存在します。
今回はFloatの数値を乗算するMultiply (in Math/Scalar)ノードを検索して追加します。

Time: Get Delta Timeノードの出力ポートをクリックドラッグしてMultiplyノードのAまたはBの入力ポートに接続します。

Get Variableノードの出力ポートをクリックドラッグしてMultiplyノードのもう一方の入力ポートに接続します。

算出した値を回転に適用する

最後に算出した値を回転に適用します。
オブジェクトを回転するTransform:Rotate (X Angle, Y Angle, Z Angle)ノードを検索して追加します。

On Updateノードの出力ポートをクリックドラッグしてRotateノードの実行トリガーに接続します。

Multiplyノードの出力ポートをクリックドラッグしてRotateノードのX Angleの入力ポートに接続します。

これでOn Updateのタイミングで[Update実行時の回転度数 / フレーム]がCubeオブジェクトに適用されるようになりました。

動作を確認する

シーンの再生ボタンを押して動作を確認します。
追加のCubeオブジェクトが回転し始めます。

実行中、追加のCubeオブジェクトのInspectorビューから変数の値を変更して回転のスピードを変更することができます。
ディスプレイ環境にかかわらず、設定した1秒あたりの回転度数で回転します。

次回はビジュアルスクリプトを使って入力に応じた分岐を行うプログラムを試します。
bluebirdofoz.hatenablog.com

Unity Learnのビジュアルスクリプティング学習を試す その5(ビジュアルスクリプトを使った基本プログラムを試す)

本日はUnityの技術調査枠です。
Unity Learnのビジュアルスクリプティング学習を試した内容を記事にします。
今回はビジュアルスクリプトを使った基本プログラムを試します。

前回記事

以下の前回記事の続きです。
bluebirdofoz.hatenablog.com

環境に依存しない回転速度

On Updateノードはディスプレイの更新タイミングで処理が実行されるため、前回作成したスクリプトはディスプレイ環境によって回転速度が変化してしまいます。
今回は以下の計算式を使って、どんなディスプレイ環境でも一定の回転速度になるスクリプトを作成します。

[1秒あたりの回転度数 / 秒]×[コンピュータの表示速度 (秒 / フレーム)]=[Update実行時の回転度数 / フレーム]

新しいCubeを作成する

前回作成したCubeと違いを比較できるように、ビジュアルスクリプトを設定したCubeオブジェクトをもう1つ作成します。
Hierarchy欄で右クリックから[Create -> 3D Object -> Cube]を実行します。

作成したCubeオブジェクトにもInspectorビューのAdd ComponentからScript Machineコンポーネントを追加します。
また、そのままでは前回のCubeと位置が重なってしまうため、PositionのXに 2 を設定して少しズラしました。

これで比較用のCubeオブジェクトができました。
次にGraphを作成します。前回とは少し異なる手順でGraphを作成してみます。

新しいGraphを作成する

作成したVisualScriptフォルダに移動し、Projectウィンドウ上で右クリックから[Create -> Visual Scripting -> Script Graph]を実行します。
これでScript Graphのassetファイルが作成されます。

今回は作成したGraphファイルを「RotateSpeed」と名付けました。

GraphファイルをScript Machineコンポーネントの[Graph]項目にドラッグして設定します。
この手順だとあらかじめ作成しておいたGraphをScript Machineコンポーネントに流用することができます。

[Edit Graph]をクリックして[Script Graph]の編集画面を開きます。

1秒あたりの回転度数のObject変数を作成する

今回のスクリプトでは1秒あたりの回転度数をInspectorビューから設定できるようにObject変数を作成します。
[Blackboard -> Object]パネルから RotationDegreesPerSecond という名前を入力して[+]ボタンで変数を作成します。

[Type]を[Integer(整数)]、[Value]を[45]に設定します。これが1秒で45度回転する設定になります。
Object変数で作成したのでInspectorビューからも値を変更できるようになっています。

変数の定義の左端にある横棒アイコンをGraphにドラッグします。
するとGraphにその変数を参照するGet Variableノードが追加されます。

これで計算式の内の[1秒あたりの回転度数 / 秒]は取得できるようになりました。
次回は[コンピュータの表示速度 (秒 / フレーム)]を計算するフローを作成します。
bluebirdofoz.hatenablog.com