Проблема заключается в следующем:
Я использую 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);
}
}