Как мне переместить LineRenderer в зависимости от движения другого объекта? - PullRequest
0 голосов
/ 04 июля 2019

Проблема заключается в следующем: Я использую Unitys LineRenderer для рисования линий на объекте. Я создаю несколько объектов с LR в качестве компонента, потому что мне нужно много дифференцированных линий. Точки линий создаются на основе worldspace = true, потому что, если я изменю его на локальное пространство, линии будут появляться в неправильной позиции. Причина этого заключается в следующем: я использую Leap Motion и Raycaste для порождения объекта через актив пера (см. Рисунок). Затем перо дает мне координаты точки, попавшей в коллайдер сетки, после чего я беру эту точку и сохраняю ее в списке. Затем я использую этот список для создания линий. Для каждого прикосновения и падения пером я создаю новый GameObject с LR. Если я сейчас переместлю объект, который содержит MeshCollider, все остальные линии должны быть перемещены в правильном соотношении позиций. Другими словами, вариант использования: - Нарисуйте несколько линий на объекте (-> Автоматически создает новые Гос с LR) - Переместить объект, например изменение позиции Желаемое поведение: Переместите все линии в соответствии с движением нарисованного объекта.

Я уже пытался преобразовать точку, возвращенную raycaster, в локальную (transform.InvereseTransformPoint) и преобразовать все LineRenderers в локальное пространство. Однако это не меняет положение линий, поскольку фактический объект raycast не содержит самого 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);
        }
    }
...