Digital Paradise

Interaction Art
Individual work (not academic)
Tianqi Wei
12.2021-11.2022

There is no such thing as eternal assessments. Whether good or bad, their shelf life grows shorter and shorter, like gardenias that are worn on the head for hours and then discarded or plastic water bottles held in the palm of the hand and then trodden on and tossed into the garbage.

In 1980, Osamu Nakano appraised contemporary people who were nourished by the media environment of television to grow up as container people in The Information Behavior of Modern People. Their inner world is like a jar for them: secluded, closed, estranged from others and authority. Nonetheless, they are subconsciously pulled into the picture-rich tin can of television, creating dependency and trust. 

It has been a hard time since 2020. The “current generation,” which is more contemporary than modern humans, has infused the clouds with all of its vibrant energy. The age of television has ended. The great, noble, progressive, and redemptive "Web 3.0" and the "Metaverse" are embracing everyone in their loving arms. We seem to be no longer enclosed. We can smash all containers. Everyone may assess everyone, praise everyone, adore everyone, attack everyone, and spit on everyone at any time, anywhere, and at will.

Moreover, we are all like the drifting waves on the ocean. We are like the weeds on the mutilated plain, traveling straight forward or continually swinging with every spring breeze, impending downpour, new autumn, or overcast, windy, and stormy days. A false rumor might take the boat of reality's contradiction, riding the wave of the green cloud, and become a loud name, a heated jest. It will be tossed to an infinite number of people and an infinite future. A random individual who was just being himself is now progressively pushed closer to the center of acclaim or criticism. One minute he is a hero. The next minute, he is a national traitor, smeared with divided assessment, laughter, or fury. The grass is loud, straining on their walls and waving in the air.

In the olden days, we believed that "do not laud a day before dusk"—when individuals pass away, the lights go off, and future generations may finally evaluate and remember them. The grave was a person's last container. When the coffin lid and the posthumous title were combined, we might finally evaluate him. However, the olden days have departed. With its casket opened, toppled sculptures and graffitied emblems may be found within it.

After the clouds have touched everyone to their heart's content, the contemporary home is no longer the cold ground, the tiny container. Every tombstone in the cloud cemetery may be rated at will by anyone, and any visitors' remarks about the individual in the tomb can be broadcasted in real-time in the cloud, generating jumping bytes and shaking wave points. Where has the world's peace gone? The rating jingles, the body is buried eternally, and the digits are suspended in paradise.

       没有好恶与评价是永恒的,它们的保鲜期愈来愈短,就像被戴在头上数小时后丢弃的栀子花,就像被捧在手心又被踩一脚扔进垃圾桶的塑料水瓶。

        1980年,中野收在《现代人的信息行为》中,把被电视的媒介环境喂养长大的现代人评价为容器人。他们的内心世界就像一个罐子,孤立、封闭,疏远他人,疏远权威。但他们却会潜移默化地被电视这一画面丰富的铁罐子吸引,产生依赖与相信。

        2020年以来,发生了许多事情。而比现代人更现代的“当代人”,几乎将全部鲜活的生命注入了云间。电视的时代过去了,而伟大的、高尚的、先进的、救赎般的“web3.0”、“元宇宙”正用它慈爱的臂膀拥所有人入怀。我们似乎已经不再封闭,似乎可以打碎一切容器,一切人可以随时随地随性随意评价一切人,赞美一切人,崇拜一切人,攻击一切人,唾弃一切人。

        不仅如此,在每一个春风徐来、暴雨将至、秋高气爽、阴风怒号的日子里,我们都如海洋上的浮浪,都如莽原上的野草,一往直前,或者反复摇曳。一则莫须有的传闻可凭现实的矛盾好风借力,乘风破浪青云直上,成为一个个响亮的名号,火热的玩笑,用以投掷向无尽的人们和无穷的远方。一个始终如一的人亦因逐渐推近的聚焦褒贬难一,前一刻是英雄后一秒是国贼,沾满一个个分化的评价,嬉笑与怒骂。青草嘈杂,靠着它们的墙头,在微风中左右摇摆。

        在古老的年代,我们相信“盖棺定论”。我们认为人走茶凉,人离灯熄,后人便终于能以此臧否人物,凭吊缅怀。坟墓是一个人最后的容器,棺盖随着谥号共同发落,我们也终于可以为他落下一个确定的评价。但古老的时代已经过去了——张开着它的棺椁,里面是被推倒的雕塑与被涂鸦的圣像。

        在云端尽情触及所有人之后,当代人的归宿不再是那清冷的地面,那小小的容器。在你所见的云端墓园,每一个墓碑都可以供所有人随意评分,任何游客对墓中人的评价都将实时展示在云端,成为跃动的字节,震颤的波点。入土何以为安?评分叮当作响,肉身永眠于地下,数字悬浮在天堂。

Stories behind the work

How profound is the impact of online public opinion on people and the society?

George Floyd, 46, died after a police officer knelt on his neck for almost nine minutes while he was held face down in a street in Minneapolis on May 25, 2020.
Some of the civil action has focused on monuments glorifying countries' imperialist past, which some people see as offensive in today's multi-ethnic society. Protesters have torn down statues of Christopher Columbus across the US.

*reference: Baijiahao, Guanchazhewang, June 11, 2020: Christopher Columbus statues destroyed in multiple locations in the U.S.

Tsinghua schoolgirl incident:
A female art student posted that she was sexually harassed in the cafeteria, and she wanted the male student in question to "be perceived as a social piranha" among her WeChat friends.
Although the two students have apologized and reconciled, the story has still been maliciously spread to Weibo and Zhihu, sparking massive online violence against the girl herself, females and art students.

*reference: Posts on THU Hole

Yang Qian won a gold medal at the 2021 Tokyo Olympics, and her Weibo account gained a lot of fans.
Then people found Yang's collection of Nike shoes, comments changed from "China's pride" to "kneeling girl get out of China" within a few minutes. Later, the person who led the attack on Yang Qian for being unpatriotic was scolded, and then posted "The world is too malicious to girls."

*reference: Weibo@西莉雅厨

Production Process

sketch
virtual scenes made with Unity
// Digital Paradise by Bob Tianqi Wei
// Main program

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using UnityEngine.Networking;
using UnityEngine.EventSystems;
using System;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json;
using System.Text;


[System.Serializable]
public class Tomb
{
    public int tombID;
    public int localCommentScore;
    public int[] numberOfEachComment;
    public float totalCommentScore;
    public int totalCommentNumber;
    public ButtonControl[] buttons;
    public SingleTombUI stu;
    public bool ifCommented;

}

public struct UpdatedData
{
   public string result;
    public string star_one;
    public string star_two;
    public string star_three;
    public string star_four;
    public string star_five;

}

public class TombControl : MonoBehaviour
{
    public static TombControl tc;
    private void Awake()
    {
        
        tc = this;
    }

    string getDataURL="http://localhost/tombdatabase/GetTombData.php";
    string updateDataURL= "http://localhost/tombdatabase/TombUpdate.php";
    public string[] tombData;//�����洢��ȡ�������ݣ�ÿ��Ĺ�����ᵥ����ȡһ��
    
    

    public List<Tomb> tomb_List = new List<Tomb>();


    private void Start()
    {
        //服务器搭建好后把这个注释删掉
        /*
        foreach (Tomb t in tomb_List)
        {
            StartCoroutine(GetScoreHTTP(t.tombID));

        }
        */
        CaculateCommentScore();
        
    }


    // Update is called once per frame
    void Update()
    {
        
    }

    


    public void CaculateCommentScore()
    {
        
        //
        foreach(Tomb t in tomb_List)
        {
            t.totalCommentNumber = t.numberOfEachComment[0]+ t.numberOfEachComment[1] + t.numberOfEachComment[2] + t.numberOfEachComment[3] + t.numberOfEachComment[4];
            if (t.totalCommentNumber!=0)
            {
                t.totalCommentScore = (float)(t.numberOfEachComment[0] * 1 + t.numberOfEachComment[1] * 2 + t.numberOfEachComment[2] * 3 + t.numberOfEachComment[3] * 4 + t.numberOfEachComment[4] * 5) / t.totalCommentNumber;
            }
            else if(t.totalCommentNumber==0)
            {
                t.totalCommentScore = 0.0f;
            }
            RefreshLocalUI();
            Debug.Log(t.totalCommentScore);
           
        }
        
       
    }


    public void ButtonAnim(int tombIndex,int awakeButtonNumber)
    {
        for(int i =0;i<awakeButtonNumber;i++)
        {
            tomb_List[tombIndex].buttons[i].transform.parent.GetComponent<Animator>().Play("Press" + i);
        }

    }

    public void RefreshLocalUI()
    {
        foreach(Tomb t in tomb_List)
        {
            if(t.stu!=null)
            {
                t.stu.GetSingleData();
            }
            
        }

    }

    
    public void UpdateByButton(int id,int star)
    {
        StartCoroutine(UpdateScoreHTTP(id, star));

    }

    public void GetByButton(int id)
    {
        StartCoroutine(GetScoreHTTP(id));

    }

    IEnumerator UpdateScoreHTTP(int id,int star){
        using (var client = new HttpClient())
        {
            
            int databaseID = id + 1;
            var url = new Uri("http://183.172.78.142:8000/set_tomb_score/");
            //string postJsonString = "{\"id\": \"" + databaseIDstring + "\",\"score\":\"" + star.ToString() + "\"}";
            //JObject postJson = JObject.Parse(postJsonString);
            //string postJson = JsonUtility.ToJson(postJsonString);
            string postString = "id=" + databaseID.ToString() + "&score=" + star.ToString();
            var stringcontent = new StringContent(postString, Encoding.UTF8, "application/x-www-form-urlencoded");
            var result = client.PostAsync(url, stringcontent).Result.Content.ReadAsStringAsync().Result;
            yield return new WaitForSeconds(0f);
        }
    }

    IEnumerator GetScoreHTTP(int id){
        using(var client = new HttpClient())
        {
            int databaseID = id + 1;
            var url = new Uri("http://183.172.78.142:8000/get_tomb_score/");
            //string postJsonString = "{\"id\": \"" + databaseIDstring + "\"}";
            //JObject postJson = JObject.Parse(postJsonString);
            //string postJson = JsonUtility.ToJson(postJsonString);
            string postString = "id=" + databaseID.ToString();
            var stringcontent = new StringContent(postString, Encoding.UTF8, "application/x-www-form-urlencoded");
            var result = client.PostAsync(url, stringcontent).Result.Content.ReadAsStringAsync().Result;
            int[] scores = {0,0,0,0,0};
            //scores[0] = result.star_one.parseInt();
            Debug.LogWarning(result);
            //string resultJson = JsonUtility.ToJson(result);
            UpdatedData d = JsonUtility.FromJson<UpdatedData>(result);
            //tomb_List[id].numberOfEachComment = scores;
            scores[0] = int.Parse(d.star_one);
            scores[1] = int.Parse(d.star_two);
            scores[2] = int.Parse(d.star_three);
            scores[3] = int.Parse(d.star_four);
            scores[4] = int.Parse(d.star_five);
            tomb_List[id].numberOfEachComment = scores;
            yield return new WaitForSeconds(0f);
        }
    }
source code: main control
// Digital Paradise by Bob Tianqi Wei
// Tomb UI

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;

public class ButtonControl : MonoBehaviour
{
    public int buttonID;
    public int TombID;

    public void ReturnIDOnRay()
    {
        if (TombControl.tc.tomb_List[TombID].ifCommented == false)
        {
            TombControl.tc.tomb_List[TombID].ifCommented = true;
            StartCoroutine(DelayForRecoverIfCommented());
            TombControl.tc.tomb_List[TombID].localCommentScore = buttonID + 1;
            TombControl.tc.ButtonAnim(TombID, buttonID + 1);
            TombControl.tc.tomb_List[TombID].numberOfEachComment[buttonID]++;
            
            TombControl.tc.CaculateCommentScore();
        }
        else if(TombControl.tc.tomb_List[TombID].ifCommented == true)
        {
            TombControl.tc.ButtonAnim(TombID, buttonID + 1);
            
        }
       
    }
   
    IEnumerator DelayForRecoverIfCommented()
    {
        yield return new WaitForSeconds(0.1f);
        TombControl.tc.tomb_List[TombID].ifCommented = false;

    }
   
}
source code:  tombstone UI
// Digital Paradise by Bob Tianqi Wei
// Buttons

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;

public class ButtonControl : MonoBehaviour
{
    public int buttonID;
    public int TombID;

    public void ReturnIDOnRay()
    {
        if (TombControl.tc.tomb_List[TombID].ifCommented == false)
        {
            TombControl.tc.tomb_List[TombID].ifCommented = true;
            StartCoroutine(DelayForRecoverIfCommented());
            TombControl.tc.tomb_List[TombID].localCommentScore = buttonID + 1;
            TombControl.tc.ButtonAnim(TombID, buttonID + 1);
            TombControl.tc.tomb_List[TombID].numberOfEachComment[buttonID]++;
            
            TombControl.tc.CaculateCommentScore();
        }
        else if(TombControl.tc.tomb_List[TombID].ifCommented == true)
        {
            TombControl.tc.ButtonAnim(TombID, buttonID + 1);
            
        }
       
    }
   
    IEnumerator DelayForRecoverIfCommented()
    {
        yield return new WaitForSeconds(0.1f);
        TombControl.tc.tomb_List[TombID].ifCommented = false;

    }
   
}
source code: buttons

ALL WORKS