GMU:Techniken des Virtuellen/Miaomiao Ning

From Medien Wiki

Miaomiao Ning: TOMBSTONE,Memorial of the Great Chinese Famine in Virtual Reality, 2017


Mixed media / interaktiv
HTC Vive - Virtual Reality Glasses, Unity 3D, Arduino Uno, Pulse Sensor, Bluetooth Module

Conception:
36 million people starved to death in the three years of the Great Chinese Famine, but any monument or memorial is forbidden in China. So I want to tell the story in virtual environment, set virtual monuments for the people dying in this period.
Monuments are arranged in matrix, with the data and texts chosen from a documentary literature “Tombstone” randomly (Fig. 1). When people experience the environment with a head mounted device, the monuments rotate and always face to the person (Fig. 2), which seems that the history is eager to be seen.Getting close to a certain monument, the visitor can hear someone is reading the text. At the same time, it simulates the visitor’s heart beat with the wave on the top, which reflects the mood swings.Height of the monument depends on the BPM(beat per minute) data collected from the person with pulse sensor.

Videodokumentation des Projektes

Interface:
Visitor wears a htc vive glasses connected with computer and running a application developed by Unity. A pulse sensor and bluetooth module are attached on the visitor’s arm with arm band, which can collect and deliver the pulse data to the computer.Then Unity get the human data and generate changes of models with script (Fig. 3).

Background:
36 million people starved to death between 1958-1962 in china, which called The great Chinese famine. It was caused by a combination of adverse weather conditions, social pressure, economic mismanagement, and radical changes in agriculture imposed by government regulations(Collectivization of Agriculture and the Great Leap Forward). Any kind of memorials, discussion or study on the topic are forbidden in china even now.
“Tombstone : The Untold Story of Mao's Great Famine”- first documentary book wrote by Chinese journalist Yang Jisheng, describes the event in detail and is filled with large number of shocking data collected from his field investigation and reports.
https://en.wikipedia.org/wiki/Great_Chinese_Famine/


Technique:
1. pulse sensor + arduino UNO board  

———arduino code————————————————————————————————————————————
int PulseSensorPurplePin = 0; // Pulse Sensor PURPLE WIRE connected to ANALOG PIN 0
void setup( ) {
Serial.begin(9600); // Set's up Serial Communication at certain speed.
}
void loop( ) {
Serial.println(map(analogRead(PulseSensorPurplePin),0,600,0,360));
delay(10);
}
———arduino code————————————————————————————————————————————
source:
https://pulsesensor.com/
https://github.com/WorldFamousElectronics/


2.connect pulse sensor with Unity
A test was done, in which the pulse data collected from person is used to control the angle of blocks in Unity. Test video:Use pulse sensor in unity3D

———Unity script——————————————————————————
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO.Ports;
using System.Threading;
public class blockmove : MonoBehaviour {
SerialPort serial = new SerialPort ("/dev/cu.usbmodem1411", 9600);
void Update () {
if (!serial.IsOpen)
serial.Open ();
int rotation = int.Parse (serial.ReadLine ());
transform.localEulerAngles = new Vector3(0, rotation,0);}}
———Unity script——————————————————————————


3.realize the rotation and wave of monuments
Since the pulse sensor is not so sensitive and have delay in any way, I simulate the heart beat with sine trigonometric function.
———Unity script ————————————————————————————————————————————
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class simulatepulse : MonoBehaviour {
Vector3 tempos;
float amplitudeY = 0.5f;
float omegaY = 2.0f;
float index;
void Start () {
float a = Random.value;
amplitudeY = amplitudeY + a;
}
void Update () {
float x0 = transform.position.x;
float z0 = transform.position.z;
float camerax = Camera.main.transform.position.x;
float cameraz = Camera.main.transform.position.z;
float dx = camerax - x0;
float dz = cameraz - z0;
index += Time.deltaTime;
float y = Mathf.Abs (amplitudeY*Mathf.Sin (amplitudeY+(omegaY*index)));
if((Mathf.Abs(dx) < 2) & (Mathf.Abs(dz) < 2) ){
transform.localScale= new Vector3(1,1,y);
}
———Unity script ————————————————————————————————————————————


The monuments change angles and always face to the visitor.Here I use tangent trigonometric function.


———Unity script ————————————————————————————————————————————
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class movewithcamera : MonoBehaviour {
float radian ;
void Start () {
}
void Update () {
var rotationVector = transform.rotation.eulerAngles;
radian = Mathf.Atan (Mathf .Abs (Camera.main.transform.position.x -
transform.position.x)/Mathf .Abs (Camera.main.transform.position.z -
transform.position.z));
if(Camera.main.transform.position.x >transform.position.x &
Camera.main.transform.position.z < transform.position.z){
rotationVector.y = - (radian * 180) / Mathf.PI ;
} else if(Camera.main.transform.position.x < transform.position.x &
Camera.main.transform.position.z > transform.position.z){
rotationVector.y = - (radian * 180) / Mathf.PI ;
}else if(Camera.main.transform.position.x < transform.position.x &
Camera.main.transform.position.z < transform.position.z){
rotationVector.y = (radian * 180) / Mathf.PI ;
}else{
rotationVector.y = (radian * 180) / Mathf.PI ;
}
transform.rotation = Quaternion.Euler(rotationVector);
}
}
———Unity script ————————————————————————————————————————————