我如何反映Unity中有关线的观点?

时间:2018-02-14 17:41:03

标签: unity3d

我正在使用线条渲染器绘制一条线,方法如下:

  public class MyLineRenderer : MonoBehaviour {
    LineRenderer lineRenderer;

    public Vector3 p0, p1;

    // Use this for initialization
    void Start () {
      lineRenderer = gameObject.GetComponent<LineRenderer>();
      lineRenderer.positionCount = 2;

      lineRenderer.SetPosition(0, p0);
      lineRenderer.SetPosition(1, p1);

    }
 }

从下面的图像中,线P0P1是已知的,A点也是已知的。如何找到一个点B,它是关于线P0P1的A的反射?

enter image description here

2 个答案:

答案 0 :(得分:0)

对于XZ坐标,请尝试此代码;

public class Symmetry: MonoBehaviour
{
    public Transform p0;
    public Transform p1;
    public Transform pointA;
    public Transform pointB;

    float m, x1, z1, x2, z2, x3, z3, u, v;

    float targetPosX, targetPosZ;

    void Start()
    {

    }

    void Update()
    {
      CalculateSymmetry();
    }

    private void CalculateSymmetry()
    {
      x1 = p0.position.x;
      z1 = p0.position.z;
      x2 = p1.position.x;
      z2 = p1.position.z;
      x3 = pointA.position.x;
      z3 = pointA.position.z;

      m = ((x3 - x1) * (x2 - x1) + (z3 - z1) * (z2 - z1)) / ((x2 - x1) * (x2 - x1) + (z2 - z1) * (z2 - z1));

      u = x1 + m * (x2 - x1);
      v = z1 + m * (z2 - z1);

      targetPosX = 2 * u - x3;
      targetPosZ = 2 * v - z3;

      pointB.gameObject.transform.position = new Vector3(targetPosX, pointB.position.y, targetPosZ);
    }
}

<强>解释
pointA:你的照片中的一个点 pointB:A点的对称性(图中的B)
p0:行开始
p1:行结束

PS。我正在使用游戏对象。你可以自己改变它。

答案 1 :(得分:0)

您可以使用Vector3.Reflect实现此目的。

  • a的向量转移到p0,并将其称为inDirection
  • p0的向量转移到p1,并将其称为inNormal
  • 将这些值插入:Vector3.Reflect(p0 - a, p1 - p0)

以上调用为您提供了从p0b的向量,因此您可以按以下方式找到b

Vector3 b = p0 + Vector3.Reflect(p0 - a, p1 - p0);

为了解释这里发生了什么,我们想象inNormal是平面的法向量,然后反映该平面的向量。如果您关心的只是在一条线上反射,您实际上可以在该线的任何位置设置该平面并获得相同的结果。

Vector3 reflection diagram

如果您在2D中工作,则会有类似的Vector2.Reflect功能。只要您有适当的矢量类,这适用于任意数量的维度。