今回は↓の動画のように、現実での直方体とUnity上の直方体の動きをリンクさせました。
手順
①前回の状態を再現する
今回は、前回(http://blog.livedoor.jp/chisato_tofu/archives/26199124.html)の発展形なので前回の状態を再現できていることを前提とします。
②センサーを作る
今回用いたセンサーは可変抵抗を直方体のxyz軸に配置し、その値を角度(°)に変換しUnityに送っています。そのため今回は、三軸に可変抵抗を配置する構造をFusion360で設計し3Dプリンタで制作しています。↓の図のようなモデルをFusion360で作り、赤円の場所に可変抵抗を配置します。
ちさと@chisao_62動作環境物理入力でUnity内のキューブを動かせた https://t.co/59898GmJ0j
2021/02/04 22:58:46
- Windows10
- Unity 2018.4.31f1 Personal
- Visual Studio Community 2019 16.8.4
- Arduino1.8.10
手順
①前回の状態を再現する
今回は、前回(http://blog.livedoor.jp/chisato_tofu/archives/26199124.html)の発展形なので前回の状態を再現できていることを前提とします。
②センサーを作る
今回用いたセンサーは可変抵抗を直方体のxyz軸に配置し、その値を角度(°)に変換しUnityに送っています。そのため今回は、三軸に可変抵抗を配置する構造をFusion360で設計し3Dプリンタで制作しています。↓の図のようなモデルをFusion360で作り、赤円の場所に可変抵抗を配置します。
これを3Dプリンターで印刷し組み立て配線を行い下のような状態にしました。
②Arduinoのコードを書く
前回のコードを発展させる形で3つのデータを送れるようにします。Unity側で","区切りで読み取ることができるため、データの切れ目に","を挿入して送ります。
シリアル入力を","で区切りそれぞれをcubeの角度に対応させるようなプログラムを書きました。これを"SerialCube"というC#のファイルに格納しています。
②Arduinoのコードを書く
前回のコードを発展させる形で3つのデータを送れるようにします。Unity側で","区切りで読み取ることができるため、データの切れ目に","を挿入して送ります。
- int val1;
- int val2;
- int val3;
- void setup() {
- Serial.begin(115200) ;
- }
- void loop() {
- val1 = analogRead(0);
- val2 = analogRead(1);
- val3 = analogRead(2);
- val1 = map(val1, 880, 160, -90, 90);
- val2 = map(val2, 840, 145, 0, -180);
- val3 = map(val3, 873, 176, -90, 90);
- Serial.print(val1);
- Serial.print(",");
- Serial.print(val2);
- Serial.print(",");
- Serial.println(val3);
- delay(50) ;
- }
シリアル入力を","で区切りそれぞれをcubeの角度に対応させるようなプログラムを書きました。これを"SerialCube"というC#のファイルに格納しています。
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEngine.UI;
- public class SerialCube : MonoBehaviour{
- public SerialHandler serialHandler;
- public Text text;
- public GameObject Cube1;
- void Start(){
- serialHandler.OnDataReceived += OnDataReceived;
- }
- void Update(){
- }
- void OnDataReceived(string message){
- try{
- string[] angles = message.Split(',');
- text.text = "x:" + angles[0] + "\n" + "y:" + angles[1] + "\n" + "z:" + angles[2] + "\n";
- Vector3 angle = new Vector3(float.Parse(angles[1]), float.Parse(angles[0]), float.Parse(angles[2]));
- Cube1.transform.rotation = Quaternion.Euler(angle);
- }
- catch (System.Exception e){
- Debug.LogWarning(e.Message);
- }
- }
- }
④C#とCubeの対応
③で書いたコードをCubeに対応させていきます。
まず、前回と同じように"Hierarchy"->"Creare"->"Create Empty"を行い、"SerialCube"という空オブジェクトを作成し、③で書いたコードをドラッグ&ドロップし対応させておきます。
"Hierarchy"->"Create"->"3D Object"->"Cube"で直方体を作成し、↓の画像のように"inspector"で調整します。今回は上から二項目目の"Rotation"をシリアル通信で変えていきます。
③で書いたコードをCubeに対応させていきます。
まず、前回と同じように"Hierarchy"->"Creare"->"Create Empty"を行い、"SerialCube"という空オブジェクトを作成し、③で書いたコードをドラッグ&ドロップし対応させておきます。
"Hierarchy"->"Create"->"3D Object"->"Cube"で直方体を作成し、↓の画像のように"inspector"で調整します。今回は上から二項目目の"Rotation"をシリアル通信で変えていきます。