Проверьте, находится ли плоскость вокруг того же положения / поворота, что и другие

#c# #unity3d

#c# #unity3d

Вопрос:

У меня есть два плоских игровых объекта с одинаковыми масштабами. Я пытаюсь добиться того, чтобы увидеть, проходит ли первая движущаяся плоскость вокруг положения / поворота как вторая статическая плоскость. Не имеет значения, совпадают ли позиции и повороты или нет, важно то, что оно должно иметь одинаковое значение. Например, если положение x плоскости 2 равно 2,75, плоскости 1 должно соответствовать значение 2. Она должна иметь значение смещения, по крайней мере, около второй плоскости. Как мне этого добиться?

 public class CheckIfFits: MonoBehaviour
{
    public GameObject Plane_2;
    public float offset;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if(this.transform.position == Plane_2.transform.position amp;amp; this.transform.eulerAngles == Plane_2.transform.eulerAngles)
        {
            Debug.Log("THEY MATCH");
        }
    }
}
 

РЕДАКТИРОВАТЬ: ответ для поворота работает не для всех экземпляров. Например, если объект перевернут или имеет вращение по отрицательной оси. Это то, что я сделал на данный момент:

 float diff = Quaternion.Angle(transform.rotation, target.rotation);
        // Return true if both values are smaller than the offset.
        return dist <= offset_position amp;amp; ((diff <= offset_rotation amp;amp; diff >= 0) || (diff <= (90 offset_rotation) amp;amp; diff >= 90) || (diff <= (180 offset_rotation) amp;amp; diff >= 180) || (diff <= (270 offset_rotation) amp;amp; diff >= 270) || (diff <= 360 amp;amp; diff >= (350 offset_rotation)));
 

Я не знаю, есть ли лучший способ сделать это.

Комментарии:

1. «Точное положение / поворот в качестве второй статической плоскости. Не имеет значения, совпадают ли позиции и повороты или нет» Какой из них сейчас? Вы хотите проверить, что они находятся в одном и том же положении, или не имеет значения, совпадают ли они?

2. Извините за это. Я изменю свой вопрос.

3. @MathewHD я подумал о расстоянии, но это отлично подходит для вычисления позиций. Проблема с поворотами, не так ли?

4. Нет, это должно работать с обоими, потому что, в конце концов, ваши eulerAngles — это тоже просто Vector3 .

Ответ №1:

Использование оператора equals == приведет к сбою, если 2 Vector3 находятся дальше, чем 0.00001.

Вместо этого вы можете использовать, Vector3.Distance() а затем сравнивать float полученные вами offset данные напрямую друг с другом.

Метод CompareTransform:

 public float offset;

// Compares 2 Transforms position and rotations.
private bool CompareTransform(Transform current, Transform target) {
    // Gets the distance between 2 positions.
    float dist = Vector3.Distance(current.position, target.position);

    // Get the difference between the 2 rotations.
    float diff = Vector3.Distance(current.eulerAngles, target.eulerAngles);

    // Return true if both values are smaller than the offset.
    return dist <= offset amp;amp; diff <= offset;
}
 

Теперь вы можете использовать этот метод для сравнения обоих Transform компонентов в вашем Update Методе.

Вызов функции:

 private void Update() {
    if(CompareTransform(this.transform, Plane_2.transform)) {
        Debug.Log("Both planes match position with given offset.");
    }
}
 

В качестве альтернативы вы можете использовать Quaternion.Angle() , чтобы получить угол между 2 поворотами, а затем снова сравнить float полученный результат с вашим offset .

Кватернион.Альтернативный угол:

 // Get the angle between the 2 rotations.
float angle = Quaternion.Angle(transform.rotation, target.rotation);
 

Комментарии:

1. Привет, спасибо за подробный ответ! Я не понимаю концепцию смещения в вашем коде. Для меня позиции / повороты совпадают, если я сохраняю смещение около> = 100. В принципе, значения осей должны приближаться к целевому значению, чтобы совпадать. Это и есть цель смещения.

2. Цель смещения, как вы сказали, по-прежнему получать значение true, даже если они не совсем одинаковы, и это также то, что он делает в моем коде. Я просто сравниваю расстояния между поворотами и позициями со смещением, а затем проверяю, меньше или больше, чтобы проверить, соответствуют ли ониравны друг другу.

3. Ах, отлично, спасибо. Моя вторая плоскость была повернута на 180 градусов, поэтому это сбивало с толку. : D

4. if the 2 Vector3 are nearly the same если быть точным, если расстояние меньше, чем 0.00001 .. просто добавляю для полноты 😉

5. Vector3 оператор == 😉