如何根据另一个对象的移动来移动LineRenderer?

时间:2019-07-04 17:56:35

标签: c# unity3d drawing line leap-motion

问题是这样的: 我使用Unitys LineRenderer在对象上绘制线条。我创建了几个以LR为组件的对象,因为我需要许多不同的线。线条的点是根据worldspace = true创建的,因为如果将其更改为localspace,则线条将生成在错误的位置。原因如下:我使用Leap Motion和Raycaste通过笔资产生成一个对象(见图)。然后,笔会向我提供被网格碰撞器击中的点的坐标,然后我将这一点保存到列表中。然后,我使用此列表创建行。对于笔的每次触摸和放下,我都会创建一个带有LR的新GameObject。如果现在移动包含MeshCollider的对象,则所有其他线应以正确的位置比例移动。 换句话说,用例是: -在对象上画几条线(->使用LR自动创建新的Gos) -移动对象,例如职位变动 所需的行为:根据绘制对象的移动来移动所有线条。

我已经尝试将raycaster返回的点转换为本地(transform.InvereseTransformPoint),并将所有LineRenderer转换为本地空间。但是,这不会更改线条的位置,因为实际的光线投射对象不包含LR本身,而是其他外部创建的游戏对象。


private void LateUpdate()
    {
        if (raycasterInstance != null && raycasterInstance.ColliderHitByRaycast != null && raycasterInstance.LastHittingPoint.HasValue)
        {
            cHBR = raycasterInstance.ColliderHitByRaycast;
            Vector3 lhp = raycasterInstance.LastHittingPoint.Value;

            CheckForLr();

            if (currentLr != null || firstCall == true)
            {
                if (drawingActivated)
                {
                    Vector3 Smoothedpos = /*ExpMovAvg.ExponentialWeightedAvg(lhp)*/ lhp;

                    Vector3 lhpWOffset = /*(Smoothedpos - Smoothedpos.normalized * 0.003f)*/Smoothedpos;

                    currentLr.positionCount = ++i;
                    markers.Add(lhpWOffset);

                    currentLr.SetPositions(markers.ToArray());
                    //currentLr.Simplify(0.0005f);
                }
                firstCall = false;
            }

            lastColliderID = cHBR.GetInstanceID();
            currentLr.transform.position = cHBR.gameObject.transform.position;
        }
        else
        {
            currentLr = null;
        }
    }

    /// <summary>
    /// Sehr primitive Variante zur Erstellung einer Skizze. (Siehe usdrsc um Begründung anzugeben)
    /// </summary>
    private void CheckForLr()
    {
        if (currentLr == null || lastColliderID != cHBR.GetInstanceID())
        {
            GameObject gO = new GameObject();
            currentLr = gO.gameObject.AddComponent(typeof(LineRenderer)) as LineRenderer;

            currentLr.positionCount = 0;
            currentLr.motionVectorGenerationMode = MotionVectorGenerationMode.Object;
            currentLr.useWorldSpace = true;
            currentLr.startWidth = 0.003f;
            currentLr.endWidth = 0.003f;
            currentLr.receiveShadows = false;
            currentLr.lightProbeUsage = UnityEngine.Rendering.LightProbeUsage.BlendProbes;
            currentLr.reflectionProbeUsage = UnityEngine.Rendering.ReflectionProbeUsage.BlendProbes;
            currentLr.material = Resources.Load("Materials/Black", typeof(Material)) as Material;
            currentLr.transform.parent = liverGo.transform;

            ExpMovAvg.ResetRefData();
            markers.Clear();
            i = 0;
            gOsWithLR.Add(gO);
        }
    }

0 个答案:

没有答案