コード例 #1
0
    void HandleInput()
    {
        Ray        inputRay = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        // if we hit something
        if (Physics.Raycast(inputRay, out hit))
        {
            // and that something has a MeshDeformer component, then we can deform that something!
            MeshDeformer deformer = hit.collider.GetComponent <MeshDeformer>();
            if (deformer)
            {
                Vector3 point = hit.point;
                point += hit.normal * forceOffset;
                deformer.AddDeformingForce(point, force);
            }
        }
    }
コード例 #2
0
    private void HandleInput()
    {
        Ray        inputRay = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        if (Physics.Raycast(inputRay, out hit))
        {
            MeshDeformer deformer = hit.collider.GetComponent <MeshDeformer>();

            if (deformer)
            {
                Vector3 point = hit.point;
                //point += hit.normal * deformRatio;
                //deformer.AddDeformingForce(point, deformRadius, deformPower);
                deformer.SelectClosestVertices(point, digRadius, digLevel);
            }
        }
    }
コード例 #3
0
    private void HandleInput()
    {
        Ray        inputRay = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        if (Physics.Raycast(inputRay, out hit))
        {
            MeshDeformer deformer = hit.collider.GetComponent <MeshDeformer>();
            if (deformer)
            {
                // Where the ray hit the object
                Vector3 point = hit.point;
                // Move the "force" point slightly away from impact point
                point += hit.normal * forceOffset;
                deformer.AddDeformingForce(point, force);
            }
        }
    }
コード例 #4
0
ファイル: MeshDeformerInput.cs プロジェクト: Rlhoste/DAC
    void HandleInput2()
    {
        Ray        inputRay = cam.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        if (Physics.Raycast(inputRay, out hit))
        {
            MeshDeformer deformer = hit.collider.GetComponent <MeshDeformer>();
            if (deformer)
            {
                Vector3 point = hit.point;

                point -= hit.normal * forceOffset2;

                deformer.AddDeformingForce2(point, force2);
            }
        }
    }
コード例 #5
0
    void HandleInput()
    {
        Ray        inputRay = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        Debug.Log(Physics.Raycast(inputRay, out hit));

        if (Physics.Raycast(inputRay, out hit))
        {
            MeshDeformer deformer = hit.collider.GetComponent <MeshDeformer>();
            if (deformer)
            {
                Vector3 point = hit.point;
                point += hit.normal * forceOffset;
                deformer.AddDeformingForce(point, force);
            }
        }
    }
コード例 #6
0
ファイル: Scaffold.cs プロジェクト: tonotonoken/projectFPS
        private static Vector3 WrapAroundAxisTransform(MeshDeformer deformer, Vector3 vertex, Vector3 center, float curvature = 0.1f)
        {
            Vector3 result = vertex;

            if (deformer.Axis == Axis.X)
            {
                result.y += Mathf.Pow((vertex.z - center.z), 2) * curvature * 0.01f;
            }
            else if (deformer.Axis == Axis.Y)
            {
                result.z += Mathf.Pow((vertex.x - center.x), 2) * curvature * 0.01f;
            }
            else
            {
                result.y += Mathf.Pow((vertex.x - center.x), 2) * curvature * 0.01f;
            }

            return(result);
        }
コード例 #7
0
    void HandleInput()
    {
        //Now we have to figure out where the user is pointing. We do this by casting a ray from the camera into the scene.
        Ray        inputRay = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        if (Physics.Raycast(inputRay, out hit))
        {
            //We use the physics engine to cast the ray and store information about what it hit. If the ray collided with something, we can retrieve the MeshDeformer component from the object that was hit.
            MeshDeformer deformer = hit.collider.GetComponent <MeshDeformer>();

            if (deformer)
            {
                Vector3 point = hit.point;
                point += hit.normal * forceOffset;
                deformer.AddDeformingForce(point, force);
            }
        }
    }
コード例 #8
0
ファイル: Scaffold.cs プロジェクト: tonotonoken/projectFPS
        public void SlerpContacts(MeshDeformer deformer, Mesh original, Mesh colliderOriginal, Scaffold prev, Scaffold next, bool isRigid)
        {
            if (isRigid)
            {
                return;
            }

            Mesh prevMesh = null;
            Mesh nextMesh = null;

            if (prev != null)
            {
                prevMesh = prev.m_mesh;
            }

            if (next != null)
            {
                nextMesh = next.m_mesh;
            }
            SlerpContacts(deformer, m_mesh, deformer.Contacts, prev, prevMesh, next, nextMesh);


            if (colliderOriginal == null)
            {
                return;
            }
            if (prev != null)
            {
                prevMesh = prev.m_colliderMesh;
            }

            if (next != null)
            {
                nextMesh = next.m_colliderMesh;
            }
            SlerpContacts(deformer, m_colliderMesh, deformer.ColliderContacts, prev, prevMesh, next, nextMesh);

            if (m_collider != null)
            {
                m_collider.sharedMesh = null;
                m_collider.sharedMesh = m_colliderMesh;
            }
        }
コード例 #9
0
    void HandleInput()
    {
        //Cast ray to mousepos
        Ray        inputRay = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        //Check for collision
        if (Physics.Raycast(inputRay, out hit))
        {
            MeshDeformer deformer = hit.collider.GetComponent <MeshDeformer>();
            if (deformer)
            {
                //Apply force to mouse click position
                Vector3 point = hit.point;
                point += hit.point * forceOffset;
                deformer.AddDeformingForce(point, force);
            }
        }
    }
コード例 #10
0
        public static void CombineAndSave()
        {
            GameObject   selected = Selection.activeObject as GameObject;
            MeshDeformer deformer = selected.GetComponentInParent <MeshDeformer>();

            GameObject[] gameObjects = deformer.GetComponentsInChildren <Scaffold>().Select(s => s.gameObject).ToArray();

            CombineResult combineResult = MeshUtils.Combine(gameObjects, deformer.gameObject);

            if (combineResult != null)
            {
                CleanupCombined(combineResult.GameObject);
                MeshUtils.SaveMesh(new[] { combineResult.GameObject }, "Battlehub/");
            }
            else
            {
                Debug.LogWarning("Unable to Combine and Save");
            }
        }
コード例 #11
0
        public static void RemoveDeformer()
        {
            GameObject   selected = Selection.activeObject as GameObject;
            MeshDeformer deformer = selected.GetComponentInParent <MeshDeformer>();

            ControlPoint[] controlPoints = deformer.GetComponentsInChildren <ControlPoint>(true);
            for (int i = 0; i < controlPoints.Length; ++i)
            {
                Undo.DestroyObjectImmediate(controlPoints[i].gameObject);
            }

            Scaffold[] scaffolds = deformer.GetComponentsInChildren <Scaffold>();
            for (int i = 0; i < scaffolds.Length; ++i)
            {
                Undo.DestroyObjectImmediate(scaffolds[i]);
            }

            Undo.DestroyObjectImmediate(deformer);
        }
コード例 #12
0
    void HandleInput()
    {
        Ray        inputRay = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        if (Physics.Raycast(inputRay, out hit))
        {
            MeshDeformer deformer = hit.collider.GetComponent <MeshDeformer>();
            if (deformer)
            {
                particlesystem.transform.position = hit.point;
                particlesystem.Play();
                Vector3 point = hit.point;
                point += hit.normal * forceOffset;
                deformer.AddDeformingForce(point, force);
                //deformer.Addparticles(point);
            }
        }
    }
コード例 #13
0
    void Update()
    {
        if (handModel == null)
        {
            return;
        }
        Vector3 palmPos = handModel.GetPalmPosition();

        if (!pickedUp)
        {
            Debug.Log("Picked up !");
            RaycastHit hit;


            Vector3 fwd         = handModel.GetPalmNormal();
            Vector3 destination = tracker.position - palmPos;

            if (Physics.Raycast(palmPos, destination, out hit, Mathf.Infinity))
            {
                float distanceToGround = hit.distance;
                Debug.Log("Hitting " + hit);
                Debug.DrawRay(palmPos, destination, Color.red);

                deformer = hit.collider.GetComponent <MeshDeformer>();
                if (deformer)
                {
                    tracker.SetParent(null);


                    deformPoint  = hit.point;
                    deformPoint += hit.normal * forceOffset;
                    pickedUp     = true;
                    inTransport  = true;
                }
            }
        }

        if (inTransport)
        {
            deformer.AddDeformingForce(deformPoint, force * Vector3.Distance(tracker.transform.position, palmPos));
        }
    }
コード例 #14
0
ファイル: Scaffold.cs プロジェクト: tonotonoken/projectFPS
        private Vector3[] Deform(Slice[] slices, Mesh mesh, MeshDeformer deformer, bool isRigid)
        {
            Vector3[] vertices = mesh.vertices;
            for (int s = 0; s < slices.Length; ++s)
            {
                Slice slice = slices[s];

                Vector3 center = deformer.GetPoint(slice.T, slice.CurveIndex);
                center = deformer.transform.InverseTransformPoint(center);

                Vector3 dir = deformer.transform.InverseTransformVector(deformer.GetDirection(slice.T, slice.CurveIndex));
                float   t   = slice.T;
                if (isRigid)
                {
                    t = 1.0f;
                }

                if (dir == Vector3.zero)
                {
                    continue;
                }


                float   twistAngle    = deformer.GetTwist(t, slice.CurveIndex);
                Vector3 thickness     = deformer.GetThickness(t, slice.CurveIndex);
                float   wrapCurvature = deformer.GetWrap(t, slice.CurveIndex);

                Quaternion rotation = Quaternion.AngleAxis(twistAngle, dir) * Quaternion.LookRotation(dir, m_up) * m_axisRotation;
                Matrix4x4  matrix   = Matrix4x4.TRS(center, rotation, Vector3.one);
                int[]      indices  = slice.Indices;
                for (int i = 0; i < indices.Length; ++i)
                {
                    int     index  = indices[i];
                    Vector3 vertex = vertices[index];
                    vertex          = AxisTransform(deformer, vertex, slice.Center, thickness);
                    vertex          = WrapAroundAxisTransform(deformer, vertex, slice.Center, wrapCurvature);
                    vertex          = matrix.MultiplyPoint(vertex);
                    vertices[index] = vertex;
                }
            }
            return(vertices);
        }
コード例 #15
0
    void HandleInput()
    {
        Ray        inputRay = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        if (Physics.Raycast(inputRay, out hit))
        {
            MeshDeformer deformer = hit.collider.GetComponent <MeshDeformer>();
            if (deformer)
            {
                Vector3 point = hit.point;
                point += hit.normal * forceOffset;
                deformer.Deform.Fire(new MeshDeformer.Ops.Deform
                {
                    Point = deformer.transform.InverseTransformPoint(point),
                    Force = force
                });
            }
        }
    }
コード例 #16
0
        public void Deform(MeshDeformer deformer, Mesh original, Mesh colliderOriginal, bool isRigid)
        {
            if (original != null)
            {
                if (AltMesh)
                {
                    original = AltMesh;
                }
                m_mesh.vertices = Deform(m_slices, original, deformer, isRigid);
                m_mesh.RecalculateBounds();
            }

            if (colliderOriginal != null && m_collider != null)
            {
                m_colliderMesh.vertices = Deform(m_colliderSlices, colliderOriginal, deformer, isRigid);
                m_colliderMesh.RecalculateBounds();
                m_collider.sharedMesh = null;
                m_collider.sharedMesh = m_colliderMesh;
            }
        }
コード例 #17
0
        private void Start()
        {
            if (m_deformer == null)
            {
                m_deformer = GetComponentInParent <MeshDeformer>();
            }

            /*
             #if UNITY_EDITOR
             * //Something strange happening when removing MeshDeformerExt obj and then pressing CTRL+Z. (Can't deform recovered object)
             * //And now I am unable to find good solution.
             * //This needed to fix this behavior...
             * ScaffoldWrapper wrapper = m_deformer.Scaffolds.Where(s => s.ObjInstanceId == InstanceId).FirstOrDefault();
             * if (wrapper != null)
             * {
             *  wrapper.Obj = this;
             * }
             #endif
             */
        }
コード例 #18
0
    // Use this for initialization
    void Start()
    {
        meshRenderer = GetComponent <Renderer> ();
        meshFilter   = GetComponent <MeshFilter> ();
        meshDeformer = GetComponent <MeshDeformer> ();

        this.gameObject.layer = FromDimension().layer;

        dimension1.connectedPortals.Add(this);
        dimension2.connectedPortals.Add(this);

        dimension1.showChildrenWithTag(this.ignoreRigidbodyTag);
        dimension2.showChildrenWithTag(this.ignoreRigidbodyTag);

        minimumDeformRangeSquared = maximumDeformRange * maximumDeformRange;

        Vector3 convertedPoint = transform.InverseTransformPoint(mainCamera.transform.position);

        triggerZDirection = (convertedPoint.z > 0);
    }
コード例 #19
0
    void HandleInput()
    {
        Ray inputRay = Camera.main.ScreenPointToRay(Input.mousePosition);   // Ray 的数据结构是两个 Vec3,分别是 origin, direction
        //  这里是从 camera 到 a screen point.

        RaycastHit hit;

        // hit 是储存Raycast相关信息的数据结构
        if (Physics.Raycast(inputRay, out hit)) // out 可以让函数传递出多个返回值
        {
            Debug.Log("hit");
            MeshDeformer deformer = hit.collider.GetComponent <MeshDeformer>();  // 挂载在 与Ray碰撞的 mesh 上的 deformer
            if (deformer)
            {
                Debug.Log("call deformer");
                Vector3 point = hit.point;
                point += hit.normal * forceOffset;        // 偏移到一个很接近表面的位置
                deformer.AddDeformingForce(point, force); // 调用 Ray 接触点物体的 deformer
            }
        }
    }
コード例 #20
0
    void HandlePinchInput(Leap.Unity.PinchDetector detector)
    {
        Debug.Log("Hit something");
        RaycastHit hit;

        if (Physics.Raycast(detector.Position, Vector3.down, out hit, .5f))
        {
            deformer = hit.collider.GetComponent <MeshDeformer> ();
        }
        else if (Physics.Raycast(detector.Position, Vector3.down, out hit, .5f))
        {
            deformer = hit.collider.GetComponent <MeshDeformer> ();
        }

        if (deformer)
        {
            deform           = true;
            originalPosition = detector.Position;
            point            = hit.point;
        }
    }
コード例 #21
0
        public static void Fit()
        {
            GameObject selected = Selection.activeObject as GameObject;
            SplineBase spline   = selected.GetComponentInParent <SplineBase>();

            if (spline is MeshDeformer)
            {
                MeshDeformer deformer = (MeshDeformer)spline;
                Undo.RecordObject(deformer, "Battlehub.MeshDeformer.Fit");
                MeshDeformerEditor.RecordScaffolds(deformer, "Battlehub.MeshDeformer.Fit");
                EditorUtility.SetDirty(deformer);
            }
            else
            {
                Undo.RecordObject(spline, "Battlehub.MeshDeformer.Fit");
                EditorUtility.SetDirty(spline);
            }


            spline.Smooth();
        }
コード例 #22
0
        public static void Remove()
        {
            GameObject   selected  = Selection.activeObject as GameObject;
            ControlPoint ctrlPoint = selected.GetComponent <ControlPoint>();
            MeshDeformer deformer  = selected.GetComponentInParent <MeshDeformer>();

            Selection.activeGameObject = deformer.gameObject;

            Undo.RecordObject(deformer, "Battlehub.MeshDeformer.Remove");
            MeshDeformerEditor.RecordScaffolds(deformer, "Battlehub.MeshDeformer.Remove");

            GameObject removeObject;

            deformer.Remove((ctrlPoint.Index - 1) / 3, out removeObject);
            if (removeObject != null)
            {
                Undo.DestroyObjectImmediate(removeObject);
            }

            EditorUtility.SetDirty(deformer);
        }
コード例 #23
0
        private void OnDrawGizmosSelected()
        {
            MeshDeformer deformer = m_spline as MeshDeformer;

            if (deformer == null)
            {
                return;
            }

            if (Selection.activeGameObject != gameObject)
            {
                return;
            }

            if (!deformer.DrawGizmos)
            {
                return;
            }
            // Display the explosion radius when selected
            Gizmos.color = Color.white;

            ScaffoldWrapper scaffold = deformer.Scaffolds.Where(s => s.CurveIndices.Contains((Index - 1) / 3)).FirstOrDefault();

            if (scaffold != null && !scaffold.IsEmptySpace)
            {
                if (scaffold.Obj != null)
                {
                    MeshFilter filter = scaffold.Obj.GetComponent <MeshFilter>();
                    if (filter != null)
                    {
                        Mesh mesh = filter.sharedMesh;
                        if (mesh != null)
                        {
                            Gizmos.matrix = deformer.transform.localToWorldMatrix;
                            Gizmos.DrawWireMesh(mesh);
                        }
                    }
                }
            }
        }
コード例 #24
0
        public static void SetMode(MeshDeformer deformer, ControlPointMode mode, bool isRigid)
        {
            ScaffoldWrapper[] scaffolds = deformer.Scaffolds;
            for (int s = 0; s < scaffolds.Length; ++s)
            {
                ScaffoldWrapper scaffold = scaffolds[s];
                for (int i = 0; i < scaffold.CurveIndices.Length; ++i)
                {
                    int curveIndex = scaffold.CurveIndices[i];
                    if (mode == ControlPointMode.Free)
                    {
                        deformer.SetIsRigid(curveIndex * 3, isRigid);
                    }

                    if (!isRigid)
                    {
                        deformer.SetControlPointMode(curveIndex * 3, mode);
                        deformer.SetControlPointMode(curveIndex * 3 + 3, mode);
                    }
                }
            }
        }
コード例 #25
0
ファイル: Scaffold.cs プロジェクト: tonotonoken/projectFPS
        private static Vector3 AxisTransform(MeshDeformer deformer, Vector3 vertex, Vector3 center, Vector3 scale)
        {
            Vector3 toVertex = vertex - center;

            if (deformer.Axis == Axis.X)
            {
                toVertex.x = 0;
                center.x   = vertex.x - center.x;
            }
            else if (deformer.Axis == Axis.Y)
            {
                toVertex.y = 0;
                center.y   = vertex.y - center.y;
            }
            else
            {
                toVertex.z = 0;
                center.z   = vertex.z - center.z;
            }

            return(center + Vector3.Scale(toVertex, scale));
        }
コード例 #26
0
    void OnCollisionEnter(Collision col)
    {
        Ray        inputRay = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        if (Physics.Raycast(inputRay, out hit))
        {
            MeshDeformer deformer = hit.collider.GetComponent <MeshDeformer>();
            if (deformer)
            {
                Vector3 point = hit.point;
                point += hit.normal * forceOffset;
                deformer.AddDeformingForce(point, force);
            }
        }

        if (col.gameObject.name == "Plane")
        {
            Debug.Log("Points colliding: " + col.contacts.Length);
            Debug.Log("First point that collided: " + col.contacts[0].point);
        }
    }
コード例 #27
0
    void HandleInput()
    {
        Ray inputRay = Camera.main.ScreenPointToRay(Input.mousePosition);

        RaycastHit hit;

        if (Physics.Raycast(inputRay, out hit))
        {
            MeshDeformer deformer = hit.collider.GetComponent <MeshDeformer>();
            if (deformer)
            {
                Vector3 point = hit.point;
                point += hit.normal * forceOffset;
                deformer.AddDeformingForce(point, force);
                Debug.Log("Force is applied ??");
            }
        }
        else
        {
            Debug.Log("Failed to find Ray collider to tooth. WTF ???????");
        }
    }
コード例 #28
0
 public override void Insert()
 {
     if (SplineRuntimeEditor.Instance != null)
     {
         MeshDeformer deformer = SplineRuntimeEditor.Instance.SelectedSpline as MeshDeformer;
         if (deformer != null)
         {
             GameObject selection = RuntimeSelection.activeGameObject;
             if (selection != null)
             {
                 ControlPoint ctrlPoint = selection.GetComponent <ControlPoint>();
                 if (ctrlPoint != null)
                 {
                     deformer.Insert((ctrlPoint.Index + 2) / 3);
                 }
             }
         }
         else
         {
             base.Insert();
         }
     }
 }
コード例 #29
0
    private void OnCollisionEnter(Collision collision)
    {
        var contact = collision.GetContact(0);

        if (contact.otherCollider.gameObject.tag == "Sword")
        {
            var stats = contact.otherCollider.gameObject.GetComponent <AttackStats>();
            if (stats && TakingDamageEvent != null)
            {
                TakingDamageEvent(stats.damage);
            }
            bloodSpill.transform.position = contact.point;
            bloodSpill.transform.forward  = contact.normal;
            bloodSpill.Play();
            MeshDeformer deformer = contact.thisCollider.GetComponent <MeshDeformer>();
            if (deformer)
            {
                Vector3 point = contact.point;
                point += contact.normal * forceOffset * -1f;
                deformer.AddDeformingForce(point, force);
            }
        }
    }
コード例 #30
0
 public override void Insert()
 {
     RunAction <SplineBase>((spline, go) =>
     {
         MeshDeformer deformer = spline as MeshDeformer;
         if (deformer != null)
         {
             GameObject selection = RuntimeSelection.activeGameObject;
             if (selection != null)
             {
                 ControlPoint ctrlPoint = selection.GetComponent <ControlPoint>();
                 if (ctrlPoint != null)
                 {
                     deformer.Insert((ctrlPoint.Index + 2) / 3);
                 }
             }
         }
         else
         {
             base.Insert();
         }
     });
 }
コード例 #31
0
	void GetMesh () {
        MeshDeformer oldMesh = selectedMesh;
        selectedMesh = null;
        meshMover = null;
        selectedVertex = -1;

        Ray inputRay = new Ray(Camera.main.transform.position, Camera.main.transform.forward);
		RaycastHit hit;
		
		if (Physics.Raycast(inputRay, out hit)) {
            grabPos = hit.point;
			MeshDeformer deformer = hit.collider.GetComponent<MeshDeformer>();
            MoveMesh moveMesh = hit.collider.GetComponent<MoveMesh> ();
			if (deformer) {
				selectedMesh = deformer;
                meshMover = moveMesh;

				MeshFilter mesh = hit.collider.GetComponent<MeshFilter>();
				int[] meshTris = mesh.mesh.triangles;

				selectedVertex = meshTris[hit.triangleIndex*3];
            }
            else if (moveMesh)
            {
                meshMover = moveMesh;
            }
        }

        if (zoomed && selectedMesh != oldMesh)
        {
            if(oldMesh != null)
                oldMesh.DeselectMesh();
            if (selectedMesh != null)
                selectedMesh.SelectMesh(selectedMat);
        }
	}