我正在使用线条渲染器绘制一条线,方法如下:
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的反射?
答案 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)
以上调用为您提供了从p0
到b
的向量,因此您可以按以下方式找到b
:
Vector3 b = p0 + Vector3.Reflect(p0 - a, p1 - p0);
为了解释这里发生了什么,我们想象inNormal
是平面的法向量,然后反映该平面的向量。如果您关心的只是在一条线上反射,您实际上可以在该线的任何位置设置该平面并获得相同的结果。
如果您在2D中工作,则会有类似的Vector2.Reflect
功能。只要您有适当的矢量类,这适用于任意数量的维度。