问题是这样的: 我使用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);
}
}