Vegetation studio

本家マニュアル

導入編
Burstコンパイラが必要なので、burst,jobs,collectionなど、必要なパッケージをひととおりインストールする。あと、Meadow Environment – Dynamic Natureも必須かと。

Biomeを使って草木を生やす
あらかじめBiomeを作成しておき、あとは空のGameObjectにBiomeを割り当てると、草や木が勝手に生える。

Biomeを使わないで草木を生やす
VegetationSystemProのVegetationメニューからPersistentVegetationStorageを選び、Storageを作成してそこに個別の草木を保存する仕組みのようだ。草木を選んでブラシで描画すると生える。Ctrl+クリックで刈ることができる。Biomeで生やした草をPersistentVegetationとしてBakeすることもできる。Bakeすると個々に移動したりできるようになる。・・・がRuntimeSpawnはしなくなる(カルされなくなり遅くなりそう?)。

Terrainを扱う
TerrainのPaintも自動で行われるが、高さ等を確認しながらセッティングができる補助ツールがTerrainSystemの中に存在する。個別に書き換えたいときは、普通にUnityのTerrainエディタから編集できる(そうなのか・・・)。

MeadowsEnvironmentでVSProを使うデモ

・Burstなどをインストールする
・VSProをインストールする
・Meadiwをインストールする

なんぞやという話

Vegetationstudio(非Pro)の2

Vegetation Studio – Getting Started part 1
・・・なんかこれだけで良いような・・・
最初にDemoをダウンロードしたほうが良いようだ。

非Proの紹介動画2本

セットアップがすでに面倒くさい!

EasyLoadと組み合わせて草をカルなどのエクステンション(!)
ダウンロードしたパッケージの保存場所

Oculus Questアプリを作る

OculusIntegrationを入れてQuestとUnityを連動させる
今日はQuestとUnityを連動させる方法を学びましょう。まずは、OculusIntegrationの使い方ですが、Unityやアセット側のアップデートに応じてどんどん使い方が変わっていくので、 なかなかややこしいですよね。Unityで作成したワールドに、FPSコントローラーとして入るだけなら、下記の動画の方法で十分だと思います。

AutoHandの導入
HalfLifeAlyxというVRゲームが、今世界的に注目を集めています。 特に、ハンドコントローラーの使い方が非常に便利で、多くの人がインスピレーションを受けているようです。 OculusIntegrationだけでもいろいろできるはずなのですが、難しいです。そこで、HalfLifeAlyxばりの高度なハンドアクションができるようなアセットが、 人気を集めつつあります。ここでは、AutoHandというアセットの使用方法を説明してみます。

下記では、Autohandの機能を手っ取り早く自分のコンテンツに反映させる方法を説明してみました。本当に、スクリプト一本入れるだけで、ワールド内のものを自由につかめるようになるんですよ。このアセットなかなか良いですよ。

神経・生理心理学-14

前回授業へのリアクション
 先週はリラクゼーションの話をしました。 自律訓練法や、 漸進的筋弛緩法、バイオフィードバックなどを扱いました。香りや音楽を使ったリラクゼーションに関しても、色々なご意見を頂きました。 ストレスマネジメントについて考える機会にしてくださればと思います。(すいませんキャプチャ失敗しました↓)

記憶・感情等の生理学的反応の機序、高次脳機能障害の概要
 今日扱う高次脳機能障害などのテーマは、公認心理師の資格試験に必要な知識となりますので、志望するかたは頑張って理解するようにしてください。「同棲相手「困った人」実は脳に障害「人が変わった」後も別れない理由(←マンガの紹介で読みやすい)」などを読むと、誰にでも起こりうることで、他人事とは言えないなと思います。脳血管、大事にしたいですね。

次回のテストに関して
 本授業の最終回(1/19(金)13:10〜14:40)は、試験を行います。回答の際、資料の参照は「可」としますが、制限時間があるため、事前に復習してから臨むようにしてください。

リアクションの提出
 こちらのリンクから本日中にリアクションを登録してください(リアクションには、2本の動画を見て考えたこと、感じたことをお書き下さい。リアクションは出欠記録を兼ねており、かつ成績評価の対象となることにご留意ください)。リアクションは、原則として、授業開催日を含む3日以内に提出するようにしてください。課題ファイルは、レポートなどの課題がある回のみ添付するようにしてください。

心理サイエンス基礎演習Ⅱ-13

前回リアクションへのフィードバック
 前回は、M5StickCを使用してみました。今回初めてArduinoに触れ、ものづくり特有のワクワク感、充実感を感じたかたも多かったようです。一方で、トラブルでうまく進められなかった方もいらっしゃったようでした。 M5StickCがうまく認識されない場合は、下記の動画をリンクからドライバーインストールをお試し下さい。
USB to Serial Driverのインストールはこちらから
Arduino開発環境のインストールはこちらから

温度センサーと環境センサーを同時に用いる
 今回はより本格的な実験を想定して、部屋の温度や湿度と、指先の温度を同時に測定できる環境を整えてみましょう。まずは温度センサーだけを接続し、それができることを確認したら、温度センサーと環境センサー同時に接続し動作を確認してみます。 これらのプログラムは、MCP342xというライブラリを必要としますので、あらかじめインストールをお願いします。
※下記動画ですが、昨年度貸与した環境センサーが一部返却されず、十分な数が確保できなかったため、今年は配布しておりません。温度センサーを動作させる部分のみ行って下さい。

MCP9700という温度センサーで温度を測るプログラム

//TEMP2
#include <M5StickC.h>
#include <Wire.h>
#include <MCP342x.h>
uint8_t address = 0x68;
MCP342x adc = MCP342x(address);
float temp;
 
void setup(void)
{
  M5.begin();
  M5.Lcd.setRotation(1);
  M5.Lcd.setTextSize(3);

  Serial.begin(115200);
  Wire.begin();
  MCP342x::generalCallReset();
  delay(1);
 
  Wire.requestFrom(address, (uint8_t)1);
  if (!Wire.available()) {
    Serial.print("指定のデバイスが見つかりません。");
    Serial.println(address, HEX);
    while (1);
  }
}
 
void loop(void)
{
  long value = 0;
  MCP342x::Config status;
 
  uint8_t err = adc.convertAndRead(MCP342x::channel1, MCP342x::oneShot,
           MCP342x::resolution16, MCP342x::gain1,
           100000, value, status);
  if (err) {
    Serial.print("Convert error: ");
    Serial.println(err);
  }
  else {
    temp=  value * 2.048 / 32767 * 100 - 50;
    Serial.println(temp);

    String buf="";
    buf=temp;
    M5.Lcd.fillScreen(BLACK);
    M5.Lcd.setCursor(0, 0);
    M5.Lcd.print(buf);
  }
  delay(100);
}

温度センサーと環境センサーを同時に用いるプログラム

//TEMP_ENV
#include <M5StickC.h>
#include "ClosedCube_SHT31D.h"
#include <Wire.h>
#include "Adafruit_Sensor.h"
#include <Adafruit_BMP280.h>
#include <MCP342x.h>
uint8_t address = 0x68;
MCP342x adc = MCP342x(address);
float temp;
ClosedCube_SHT31D sht3xd;
SHT31D result;
Adafruit_BMP280 bme;

 
void setup(void)
{
  M5.begin();
  M5.Lcd.setRotation(1);
  M5.Lcd.setTextSize(2);

  Serial.begin(115200);
  Wire.begin();               // I2Cを初期化する
 
  MCP342x::generalCallReset();
  delay(1);
 
  Wire.requestFrom(address, (uint8_t)1);
  if (!Wire.available()) {
    Serial.print("指定のデバイスが見つかりません。");
    Serial.println(address, HEX);
    while (1);
  }

  while (!bme.begin(0x76)) {  // BMP280を初期化する
      M5.Lcd.println("BMP280 init fail");
  }  
  sht3xd.begin(0x44); // I2C address: 0x44 or 0x45
  if (sht3xd.periodicStart(SHT3XD_REPEATABILITY_HIGH, SHT3XD_FREQUENCY_10HZ) != SHT3XD_NO_ERROR)
    Serial.println("[ERROR] Cannot start periodic mode");
}
 
void loop(void)
{
  long value = 0;
  MCP342x::Config status;
 
  uint8_t err = adc.convertAndRead(MCP342x::channel1, MCP342x::oneShot,
           MCP342x::resolution16, MCP342x::gain1,
           100000, value, status);
  if (err) {
    Serial.print("Convert error: ");
    Serial.println(err);
  }
  else {
    temp=  value * 2.048 / 32767 * 100 - 50;
    result=sht3xd.periodicFetchData();
    float pressure = bme.readPressure();
    double vbat = M5.Axp.GetVbatData() * 1.1 / 1000;  // バッテリー電圧を取得 ----D

    M5.Lcd.setCursor(0, 0, 1);
    M5.Lcd.printf("Ftemp:%.2f\r\n", temp);
    M5.Lcd.printf("Etemp:%.2f\r\n", result.t);
    M5.Lcd.printf("humid:%.2f\r\n", result.rh);
    M5.Lcd.printf("press:%.2f\r\n", pressure / 100);
    M5.Lcd.printf("vbat:%.2f\r\n", vbat);

    String buf="";
    Serial.printf("%.2f,", temp);
    Serial.printf("%.2f,", result.t);
    Serial.printf("%.2f,", result.rh);
    Serial.printf("%.2f,", pressure / 100-1000);
    Serial.printf("%.2f,\r\n", vbat);
  }
 
  delay(100);
}

時刻サーバーとリアルタイムクロックを使う
 今日は最後にインターネットに接続して時刻を取得するというプログラムを動かしてみましょう。M5StickCをインターネットに接続する練習となります。NTPサーバーとは、インターネットで正確な時刻を発信しているサーバーのことで、これに定期的に接続することにより携帯電話などの電子機器は、正確な時刻を保つことができます。さらに、時刻を電子機器に内蔵されているリアルタイムクロックに書き込み、保持することで、ネットがない環境でも正確な時間を刻むことができるようになります。

NTPとRTCを使うプログラム

//NTP_RTC
#include <M5StickC.h>
#include <WiFi.h>
#include "time.h"

const char* ssid       = "HELL";            //SSID
const char* password   = "hogehoge";  //パスワード
const char* ntpServer =  "ntp.jst.mfeed.ad.jp";

RTC_TimeTypeDef RTC_TimeStruct;
RTC_DateTypeDef RTC_DateStruct;

void setup() {
  // put your setup code here, to run once:
  M5.begin();
  M5.Lcd.setRotation(1);
  M5.Lcd.fillScreen(BLACK);

  M5.Lcd.setTextSize(1);
  M5.Lcd.setCursor(40, 0, 2);
  M5.Lcd.println("RTC NTP TEST");

  // connect to WiFi
  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" CONNECTED");

  // Set ntp time to local
  configTime(9 * 3600, 0, ntpServer);

  // Get local time
  struct tm timeInfo;
  if (getLocalTime(&timeInfo)) {
    M5.Lcd.print("NTP : ");
    M5.Lcd.println(ntpServer);

    // Set RTC time
    RTC_TimeTypeDef TimeStruct;
    TimeStruct.Hours   = timeInfo.tm_hour;
    TimeStruct.Minutes = timeInfo.tm_min;
    TimeStruct.Seconds = timeInfo.tm_sec;
    M5.Rtc.SetTime(&TimeStruct);

    RTC_DateTypeDef DateStruct;
    DateStruct.WeekDay = timeInfo.tm_wday;
    DateStruct.Month = timeInfo.tm_mon + 1;
    DateStruct.Date = timeInfo.tm_mday;
    DateStruct.Year = timeInfo.tm_year + 1900;
    M5.Rtc.SetData(&DateStruct);
  }

  //disconnect WiFi
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);
}

void loop() {
  static const char *wd[7] = {"Sun","Mon","Tue","Wed","Thr","Fri","Sat"};
  
  // put your main code here, to run repeatedly:
  M5.Rtc.GetTime(&RTC_TimeStruct);
  M5.Rtc.GetData(&RTC_DateStruct);
  M5.Lcd.setCursor(0, 30);
  M5.Lcd.printf("Data: %04d-%02d-%02d\n", RTC_DateStruct.Year, RTC_DateStruct.Month, RTC_DateStruct.Date);
  M5.Lcd.printf("Week: %s\n", wd[RTC_DateStruct.WeekDay]);
  M5.Lcd.printf("Time: %02d : %02d : %02d\n", RTC_TimeStruct.Hours, RTC_TimeStruct.Minutes, RTC_TimeStruct.Seconds);
  delay(500);
}

 課題が終わった方は、下記アドレスからリアクションを登録してください。今日は特に送っていただくものはありません。リアクションは出欠記録を兼ねています。また、成績評価の対象となることに留意して下さい。リアクションは原則として授業配信日を含む3日以内にお送りください。
心理サイエンス基礎演習2リアクション

卒業論文演習-14

前回授業リアクションへのフィードバック 
 まだ授業は終わってないのですが笑、全体を振り返っての感想をいただき、「多くの学びがあった」という意見が多く少し安心しました。「集まればいいってもんじゃない、卒論が完成するかは、結局は本人次第だ」とは思いつつ、一方で 「オンラインのディスカッションも必要だったのでは?」と未だに思っています。来年度の卒論では、仮に遠隔授業を余儀なくされたとしても、定期的にオンラインのミーティングとディスカッション行いたいと思っています。ディスカッションの時間が来たら、ちゃんと他の人に質問してあげてくださいよ?

本年度の卒論を紹介
 今日は2020年度の卒論として、以下のの2本を紹介したいと思います。いずれも大変興味深い内容であり、卒論としての完成度も高いものです。自分の卒業論文提出をイメージし、これから一年のスケジュールを考えるきっかけにして下さればと思います。

リアクションの回答
 今日は、2つの卒論紹介動画を見て、今後自身の研究計画にどのように活かしていくかを考えて、リアクションに記入してください。リアクションは原則として開催日のうちに提出するようにしてください(リアクションの内容は評価の対象になることにご注意ください)。
 また、次回は修正・発展させた自分の研究計画書を提出していただきますので、今のうちに準備を進めておいてください。次回提出日に行うのは無理がありますよ!卒論計画の改善で相談がある場合は、いつでもチャットからご連絡ください。

心理サイエンス応用演習Ⅱ-13

オリジナル実験の実施
 そろそろ実験を実施されている方も出てきつつありますね。来週は結果をご報告いただきたいので、今一度自分の進行状況をご確認いただき、来週までに間に合うよう調整してください。

・花城さん
12/12実験刺激完成,~12/18測定完了,~12/21分析,レポート化及び提出を予定しております。

・菅谷さん
12/9完成12/13までに測定終了12/19-20 分析&レポート化完了の予定で進めていきます。

・神澤 さん
刺激をシンプルなものに作り変える。

・松井さん
➀~12/7:実験刺激&アンケートの完成  ➁12/8~12/9:不具合の検証  ③12/10~12/16:実験の実施  ④12/17~12/19:結果の分析とまとめ ・感想

・吉田さん
12/9日実験刺激完成、12/15日測定終了、12/19日分析&レポート化完了 を予定しています。

今日の課題
 来週は、実験結果の報告を行っていただきますが、以下の点にご注意ください。

1.パワーポイントで5~10枚程度にまとめること。
2.1枚目は表紙とし、研究のタイトルと、名前と学籍番号を記載すること。
3.目的と方法を2~3枚程度のページでまとめること。
4.方法は、参加者、課題、指標、手続き、の小見出しを設けて記述すること。その際、実験課題はなるべく画像を用い、わかりやすさを重視して記述すること。
5.結果・考察を2~5枚程度のページでまとめること。結果はグラフを用いてわかりやすく示すこと。

来週はこれらの結果を皆で共有するため、完成したパワーポイントファイルを本授業チームのファイル>オリジナル実験実施結果フォルダに入れてください。締切は、12/20(日)の深夜までとします。実験結果が揃わない場合は、方法までで結構ですので「○○のような実験をしようとしていた。○○のような結果が得られることが期待される」とお書きください。

リアクションの記入
 課題が終わった方は、下記アドレスからリアクションを登録してください。現状をパワーポイントファイルにまとめ、一緒に添付してください。リアクションは出欠記録を兼ねています。また、成績評価の対象となることに留意して下さい。原則として授業の当日中に送るようにしてください。
心理サイエンス応用演習2リアクション

神経・生理心理学-13

前回授業へのリアクション
 先週はストレス科学の話を扱いました。セリエのストレス学説や、キャノンの緊急反応、 ライフイベント法、いずれも大切な話ではありますが、特にラザルスの認知的評価モデルには多くのコメントをいただきました。フィードバックを作成しましたので御覧ください。

リラクセーション
 今日の話題はリラクセーションです。ストレスの話ばかりで、その対処方法を学ばないのは片手落ちだろうということで、心理学で研究されてきた自律訓練法、漸進的筋弛緩法、バイオフィードバックなどのリラクセーション法について学びます。ストレスが体の反応ベースの概念であったように、リラクセーションも身体反応と密接に結びついている事を理解していただけますと幸いです。

リアクションの提出
 こちらのリンクからリアクションを登録してください(リアクションには、動画を見て考えたこと、感じたことをお書き下さい。リアクションは出欠記録を兼ねており、かつ成績評価の対象となることにご留意ください)。リアクションは、原則として、授業開催日を含む3日以内に提出するようにしてください。課題ファイルは、レポートなどの課題がある回のみ添付するようにしてください。

心理サイエンス基礎演習Ⅱ-12

前回リアクションへのフィードバック
 先週はArduinoと温度センサーを組み合わせて、ストレス刺激によって皮膚温がどのように変化するかを調べる、という題材を扱いました。対面授業にご参加いただいた方は実際に体験していただきましたが、動画のみの方からも様々なご意見を頂きましたので、共有していただければと思います。

M5StickCを使うための準備
 
今日から,より強力なマイクロコンピュータであるM5StickCを使っていきます。M5StickC等の電子部品一式は、助手室入って左側の箱に入れておきますので、各自自分の学籍番号が記載された袋を回収してご利用ください。回収できたら、下記の動画を見ながら、開発環境をインストールして、LED を点滅させてみてください。

※追加のボードマネジャーのURL↓
https://dl.espressif.com/dl/package_esp32_index.json

LEDを点滅させるプログラム

LEDの長い足をG26に短い足をGNDに入れましょう。

//blink32
//LEDを点滅させる
void setup()
{
  pinMode(26, OUTPUT); //13番のピンを出力モードに
}
 
void loop()
{
  digitalWrite(26, HIGH); //13をONにする
  delay(100); //1000ms待つ
  digitalWrite(26, LOW); //13をOFFにする
  delay(100); //
}

LCD(液晶ディスプレイ)を使ってみる
 
以下ではLCDを使ったプログラムをいくつか試してみましょう。ディスプレイの詳しい使い方はここに解説されています。

液晶ディスプレイを指定した色で塗りつぶす↓

//M5C_LCD1
#include <M5StickC.h>

void setup(void)
{
  M5.begin();
}
 
void loop(void)
{
  M5.Lcd.fillScreen(PURPLE); //黒で塗りつぶす
  M5.Lcd.setCursor(0, 0);   //左上から書き始める
  M5.Lcd.print("black");    //文字を表示
  delay(1000);              //1000ms停止する

  M5.Lcd.fillScreen(M5.Lcd.color565(255, 230, 200));
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.print("white");
  delay(1000);
}

ランダムな位置にランダムな大きさで円を描画する↓

//M5C_LCD2
#include <M5StickC.h>

void setup(void)
{
  M5.begin();
}
 
void loop(void)
{
  int x=random(0, 160); //x点を指定
  int y=random(0, 80);  //y点を指定
  int r=random(0, 40);  //半径を指定
  int red=random(0, 255); //red 0-255
  int green=random(0, 255); //green 0-255
  int blue=random(0, 255); //blue 0-255
  
  //M5.Lcd.fillCircle(x, y, r, M5.Lcd.color565(red, green, blue));
  M5.Lcd.drawCircle(x, y, r, M5.Lcd.color565(red, green, blue));
    
  delay(10);
}

リアクションの記入
 課題が終わった方は、下記アドレスからリアクションを登録してください。リアクションは出欠記録を兼ねています。また、成績評価の対象となることに留意して下さい。リアクションは原則として授業当日を含む6日以内にお送りください。
心理サイエンス基礎演習2リアクション

卒業論文演習-13

計画発表12:音楽による記憶と景色・情景の結びつき
 今週は、視覚刺激と聴覚刺激の結びつきをあつかった研究計画です。こういった身近な現象ほど、だれもが納得する形で行うのが難しいような気がします。みんなの意見を参考に、少しでも妥当な計画に改善していっていただけますと幸いです。

今後の流れ
 今週で全員分の計画発表が終わりました。皆さん予定通りに発表をしていただいたおかげで、全体としてスムーズに進めることができました。 自分の計画について、様々な意見をもらったと思うので、残りの時間は自分の研究計画を改善することに時間を使っていただきたく思います。 年を明けて1月15日はこの授業の最終回となりますので、その日までに 改善した研究計画を提出してください。各自の改善すべき点は動画の中で解説されていますので、それを参考に改善していただければと思います。どのように改善して良いのか迷ったりわからなかったりした場合は、チャットかチームの投稿欄からご質問いただければ、個別に回答いたします。
 皆さんが卒業研究を行う際には、対面でのデータ収集が可能になっていることを想定しています。本年度の卒論は、オンラインでのデータ収集を余儀なくされたのですが、 皆さんの卒論が同じようになってしまう可能性もゼロとは言えません。そこで来週と再来週は、本年度の卒論の完成形をいくつかご紹介します。現時点の自分の計画と、完成した卒論の違いからいろいろ学んで頂ければと思います。

リアクションの回答
 リアクションは開催日のうちに提出するようにしてください(リアクションの内容は評価の対象になることにご注意ください)。