как отразить объект о плоскости? - PullRequest
0 голосов
/ 18 марта 2019

с учетом игрового объекта плоскости, я хотел бы отразить объект об этой плоскости

простой случай этого будет плоскостью в 0,0,0 без вращения с объектом в 0, -1,0, что приводит к отраженной позиции на 0,1,0

более сложный случай, это плоскость на 0,0,0 с поворотом на ось x на 45` с объектом на 0, -1, -1, что приводит к отраженному положению на 0,1,1

Я ищу решение, которое может принять любой случай плоскости в любом положении с любым вращением.

Ответы [ 2 ]

2 голосов
/ 18 марта 2019

Вы можете использовать Plane.ClosestPointOnPlane , чтобы получить соответствующую позицию на плоскости.

Поэтому сначала вам нужно создать Plane. В качестве inNormal вы должны использовать вектор, перпендикулярный поверхности плоскостей.

  • Для Quad Примитива это отрицательный forward вектор
  • для Plane Примитива это вектор up.

Чем вы можете просто использовать Вектор между исходным объектом и этим ClosestPointOnPlane для перемещения в ту же относительную позицию, но с перевернутым вектором:

public class ReflectPosition : MonoBehaviour
{
    public Transform Source;
    public Transform Plane;

    // Update is called once per frame
    private void Update()
    {
        // create a plane object representing the Plane
        var plane = new Plane(-Plane.forward, Plane.position);

        // get the closest point on the plane for the Source position
        var mirrorPoint = plane.ClosestPointOnPlane(Source.position);

        // get the position of Source relative to the mirrorPoint
        var distance = Source.position - mirrorPoint;

        // Move from the mirrorPoint the same vector but inverted
        transform.position = mirrorPoint - distance;
    }
}

Результат (синий шар имеет этот компонент и отражает положение белых шариков)

enter image description here

1 голос
/ 18 марта 2019

Вы можете использовать Vector3.ProjectOnPlane , например:

//I used a cube and a quad. So i am finding the projection of cube's position onto quad
public GameObject cube;
private Vector3 point;
private Vector3 projectedPoint;
void Start () {
    point = cube.transform.position;
    planeOrigin = gameObject.transform.position;
    Vector3 v = point - planeOrigin;
    Vector3 d = Vector3.Project(v, -gameObject.transform.forward);
    projectedPoint = point - d;
}   

void OnDrawGizmos()
{
    Gizmos.color = Color.red;
    Gizmos.DrawLine(point, projectedPoint);
}

Вы можете увидеть, как это работает, на изображении ниже:

enter image description here

Затем вы можете рассчитать отражение, рассчитав направление между точкой и спроецированной точкой и умножив его на двукратное расстояние между ними следующим образом:

 Vector3 reflection = point + 2*(projectedPoint - point);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...