コード例 #1
0
        void CreateSensor()
        {
            GameObject go = new GameObject("sensor");

            go.transform.parent        = m_vtm.transform;
            go.transform.localPosition = Vector3.zero;
            go.transform.localRotation = Quaternion.identity;
            go.transform.localScale    = Vector3.one;
            VertExmotionSensor s = go.AddComponent <VertExmotionSensor>();

            s.m_params.translation.motionFactor = m_sensorMotionFactor;
            //we want a smooth interraction from the object motion
            s.m_params.damping  = 1f;
            s.m_params.bouncing = .1f;
            m_vtm.m_VertExmotionSensors.Add(s);

            //add a smooth object for computing the position
            PID_V3 smooth = new PID_V3();

            smooth.m_params.kp = 1f;  //damping
            smooth.m_params.ki = .1f; //bouncing

            if (m_smoothPositions.Count < m_vtm.m_VertExmotionSensors.Count)
            {
                m_smoothPositions.Add(smooth);
            }
        }
コード例 #2
0
    // Use this for initialization
    void Start()
    {
        m_sensor = GetComponent <VertExmotionSensor> ();
        m_sensor.m_params.translation.amplitudeMultiplier = 0;

        if (m_target != null)
        {
            m_target.m_VertExmotionSensors.Add(m_sensor);
        }
    }
コード例 #3
0
        // Use this for initialization
        void Start()
        {
            m_sensor = GetComponent <VertExmotionSensor>();
            m_sensor.m_params.translation.motionFactor = 0;

            if (m_target != null)
            {
                //m_target.m_VertExmotionSensors.Add(m_sensor);
                m_target.AddSensor(m_sensor, true);
            }
        }
コード例 #4
0
        /// <summary>
        /// Create a new sensor to the trail
        /// </summary>
        /// <param name="pos"></param>
        void AddSensorToTrail(Vector3 pos)
        {
            GameObject go = new GameObject("Sensor_" + m_sensorsTrail.Count);

            go.transform.position = pos;
            VertExmotionSensor s = go.AddComponent <VertExmotionSensor>();

            //m_target.Sensors.Add(s);
            s.m_params.translation.motionFactor = 0f;
            m_target.AddSensor(s, true);

            m_sensorsTrail.Add(s);
        }
コード例 #5
0
        /*
         * public void ChangeTarget(VertExmotion newtarget)
         * {
         *  if (m_target != null)
         *      m_target.m_VertExmotionSensors.Remove(m_sensor);
         *
         *  m_target = newtarget;
         *
         *  if (m_target != null)
         *      m_target.m_VertExmotionSensors.Add(m_sensor);
         * }
         */

        // Update is called once per frame
        void Update()
        {
            bool touchDetected = false;
            VertExmotionSensor lastFromTrail = null;

            //Raycast
            if (Input.GetMouseButton(0))
            {
                RaycastHit hitInfo;
                if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hitInfo))
                {
                    m_radius          += Time.deltaTime;
                    transform.position = hitInfo.point;
                    m_touchDir         = (hitInfo.collider.transform.position - hitInfo.point).normalized;

                    if (m_useTrail)
                    {
                        if (m_sensorsTrail.Count == 0)
                        {
                            AddSensorToTrail(hitInfo.point);
                        }


                        lastFromTrail = m_sensorsTrail[m_sensorsTrail.Count - 1];
                        float distanceFromTouch = Vector3.Distance(lastFromTrail.transform.position, hitInfo.point);

                        float f = Mathf.Clamp(1f - m_brushDensity, .01f, 1f);


                        if (distanceFromTouch > m_radiusMax * f)
                        {
                            lastFromTrail.m_envelopRadius = distanceFromTouch;
                            AddSensorToTrail(hitInfo.point);
                            lastFromTrail = m_sensorsTrail[m_sensorsTrail.Count - 1];
                        }
                        lastFromTrail.m_envelopRadius = distanceFromTouch;
                    }



                    if (m_lastPosition != Vector3.zero)
                    {
                        m_motionDir = Vector3.Lerp(m_motionDir, (transform.position - m_lastPosition).normalized, Time.deltaTime * 10f).normalized;
                    }

                    m_lastPosition = transform.position;
                    touchDetected  = true;
                }
            }


            m_radius = Mathf.Clamp(m_radius, 0, m_radiusMax);


            if (!touchDetected)
            {
                //No touch -> delete all sensors
                m_radius      -= Time.deltaTime;
                m_lastPosition = Vector3.zero;
                m_motionDir    = Vector3.zero;

                for (int i = 0; i < m_sensorsTrail.Count; ++i)
                {
                    m_sensorsTrailDelete.Add(m_sensorsTrail[i]);
                }
                m_sensorsTrail.Clear();
            }


            if (m_sensorsTrail.Count > 1)
            {
                //remove sensors when trail longer than m_trailLengthMax
                float trailLength = Vector3.Distance(m_lastPosition, m_sensorsTrail[m_sensorsTrail.Count - 1].transform.position);
                for (int i = m_sensorsTrail.Count - 2; i >= 0; --i)
                {
                    float dist = Vector3.Distance(m_sensorsTrail[i].transform.position, m_sensorsTrail[i + 1].transform.position);

                    if (trailLength + dist > m_trailLengthMax)
                    {
                        float newDist = m_trailLengthMax - trailLength;

                        if (newDist > 0.001f)
                        {
                            m_sensorsTrail[i].transform.position = m_sensorsTrail[i + 1].transform.position + (m_sensorsTrail[i].transform.position - m_sensorsTrail[i + 1].transform.position).normalized * newDist;
                        }
                        else
                        {
                            m_sensorsTrailDelete.Add(m_sensorsTrail[i]);
                            m_sensorsTrail.RemoveAt(i);
                        }
                        //break;
                    }

                    trailLength += dist;
                }
            }


            //Delete unwanted trail parts smoothly
            for (int i = 0; i < m_sensorsTrailDelete.Count; ++i)
            {
                m_sensorsTrailDelete[i].m_envelopRadius -= Time.deltaTime * m_resetDeformationSpeed;

                float offset = m_sensorsTrailDelete[i].m_params.translation.worldOffset.magnitude;
                offset -= Time.deltaTime * Time.deltaTime * m_resetDeformationSpeed;
                m_sensorsTrailDelete[i].m_params.translation.worldOffset = m_sensorsTrailDelete[i].m_params.translation.worldOffset.normalized * offset;

                //m_sensorsTrailDelete[i].m_params.translation.worldOffset -= m_sensorsTrailDelete[i].m_params.translation.worldOffset.normalized * Time.deltaTime * m_sensorsTrailDelete[i].m_envelopRadius * .8f;

                if (m_sensorsTrailDelete[i].m_envelopRadius < 0)
                //if (m_sensorsTrailDelete[i].m_params.translation.worldOffset.magnitude < 0.001f)
                //if (offset <= 0f)
                {
                    //m_target.m_VertExmotionSensors.Remove(m_sensorsTrailDelete[i]);
                    m_target.RemoveSensor(m_sensorsTrailDelete[i]);
                    Destroy(m_sensorsTrailDelete[i].gameObject);
                    m_sensorsTrailDelete.RemoveAt(i--);
                }
            }

            float scale = (transform.localScale.x + transform.localScale.y + transform.localScale.z) / 3f;


            switch (m_interactionType)
            {
            case eInteractionType.PUSH:
                m_sensor.m_params.translation.worldOffset = m_pushStrength * scale * Vector3.Lerp(m_touchDir, m_motionDir, m_directionThreshold);
                break;

            case eInteractionType.PULL:
                m_sensor.m_params.translation.worldOffset = m_pushStrength * scale * Vector3.Lerp(-m_touchDir, m_motionDir, m_directionThreshold);
                break;
            }

            m_sensor.m_params.inflate = m_inflateStrength;
            m_sensor.m_envelopRadius  = m_radius;


            if (lastFromTrail != null)
            {
                //update last trail
                lastFromTrail.m_params.inflate = m_inflateStrength;
                lastFromTrail.m_params.translation.worldOffset = m_sensor.m_params.translation.worldOffset;
            }

            for (int i = 0; i < m_sensorsTrail.Count; ++i)
            {
                if (i > 0)
                {
                    Debug.DrawLine(m_sensorsTrail[i - 1].transform.position, m_sensorsTrail[i].transform.position, Color.black);
                }



                m_sensorsTrail[i].m_envelopRadius = Mathf.Clamp(Vector3.Distance(m_sensorsTrail[i].transform.position, m_lastPosition), 0, m_radiusMax);
                m_sensorsTrail[i].m_params.translation.worldOffset = m_sensorsTrail[i].m_params.translation.worldOffset.normalized
                                                                     * m_sensor.m_params.translation.worldOffset.magnitude;
            }
        }