AIプログラムとかUnityゲーム開発について

探索や学習などを活用したAI系ゲームを作りたいと思います。

Unityで肺循環を作ってみる

f:id:yasu9780:20160202133830p:plain

一番難しいのは血圧をどう表現するかですね。
簡易的に、今は、上部の血管では右向きにAddForce、下部の血管では左向きにAddForceしてますが
本来は、密度が薄いところに移動しようとする力が圧力ですよね。
液体だと浸透圧って言いますけど。
気体だと、気体の運動方程式で、壁に気体分子がぶつかる回数を圧力とみなすみたいなモデルもありますけど。
Unityは物理エンジンあるし、重力も表現できるし、5.3で浮力も追加されたけど、
圧力を物理エンジンでどう表現するのが一番なんだろうか?
水分子が高速に動きまわって、赤血球を押すから赤血球が液体の中で動くんですよね。
水分子から作った方がいいのかな?


http://rafeel.s602.xrea.com/human/Web.html
chorme以外のFirefoxとかIEならUnitywebPlayerを入れていたら動くはず

赤い丸は赤血球
青い丸は酸素を手放してる赤血球(還元ヘモグロビン)
黒い丸は、寿命を迎えて壊された元赤血球ビリルビン(120日)

脾臓は、寿命を迎えた赤血球を壊してビリルビン(黒丸)にする
腎臓は、ビリルビンを削除する(尿で出す)
骨髄は、新しい赤血球を作る
肺は、赤血球に酸素を供給する(還元ヘモグロビンを酸化する)

なお各臓器は、赤血球から酸素を貰う(赤血球は酸素を失って青くなっていく)

あと、血管や血球は跳ねる物理マテリアルを貼ってあります。
コライダーを装備し、血球にはRigidbodyをつけています(重力なし)
臓器は、コライダーを設置し、IsTriggerにしてます。
これで、血球がTriggerしたときに、臓器によって振る舞いを定義しています。

本当は直列回路じゃなくて並列回路なんだけど、血管作るのがめんどうくさくてw
でも、実際作って動かしてみると、医学的な知見が深まりますね。
ホルモンとか作ってみても面白いかも
腎臓がレニンホルモンを作ると、血管が縮小=血圧上昇する


血球に貼ってるスクリプト

using UnityEngine;
using System.Collections;

public class blood : MonoBehaviour {
	float age=0f;
	float oxigen=0f;
	float spendOxy=0.25f;
	float bloodAge=20f;
	void Start () {
		oxigen=0f;
		GetComponent<Renderer>().material.color = new Color(oxigen,0f,1f-oxigen,1f);
	}
void Update () {
	age += Time.deltaTime;
	if(transform.position.y>1.5f)
		GetComponent<Rigidbody>().AddForce( new Vector3(5f,0,0) );
	if(transform.position.y<-1.4f)
		GetComponent<Rigidbody>().AddForce( new Vector3(-5f,0,0) );
}
void OnTriggerEnter(Collider other) {
	if( other.name=="Kidney")
	{
		if(age<bloodAge && oxigen>0f) oxigen-=spendOxy;
		if(age>bloodAge) Destroy( this.gameObject );
	}
	if( other.name=="Spleen")
	{
		if(age<bloodAge && oxigen>0f) oxigen-=spendOxy;
		if(age>bloodAge) GetComponent<Renderer>().material.color = Color.black;
	}
	if( other.name=="Lung")
	{
		if(age<bloodAge && oxigen>0f) oxigen-=spendOxy;
		if(age<bloodAge) oxigen=1f;
	}
	if(age<10f)
		GetComponent<Renderer>().material.color = new Color(oxigen,0f,1f-oxigen,1f);
}
}