Математика Unity3D (урок 1): Mathf синус и косинус.


Просмотров: 12077 | Комментарии (5)
Рубрика: Unity3d -> Уроки по Unity3d -> Математика Unity3D
Метки: | | | | | |

Из курса школы все знают, что такое синус и косинус. Для тех кто забыл:

Синус - это ордината точки единичной окружности.
Косинус - абсцисса точки единичной окружности.

В Unity3D (C#) они вычисляются функциями:

Mathf.Sin(float Angle);              //Синус (угол в радианах)
Mathf.Cos(float Angle);         //Косинус (угол в радианах)

В Unity3D используется левосторонняя система координат, поэтому увеличения угла поворота идёт по часовой стрелке.

Для чего можно использовать синус и косинус в игре?

Например для расстановки объектов по кругу.

Допустим, что вокруг игрока должны встать враги, ровным кругом.

Для этого напишем небольшой скрипт.

using UnityEngine;
public class EnemyCircle : MonoBehaviour {
     
    //Префаб врага
    public Object EnemyPrefab;
    //Расстояние до игрока
    public float Distance = 2;
    //Угол занимаемый врагами (360 - вся окружность)
    public float Angle = 360;
    //Количество врагов
    public int count = 15;                 
      
    // Use this for initialization
    void Start ()
    {
        //Определяем начальную точку
        Vector3 point = transform.position;
        //Переводим угол в радианы
        Angle = Angle * Mathf.Deg2Rad;                                     
          
        for(int i = 1; i <= count; i++)
        {
            //Рассчитываем координату Z для врага
            float _z = transform.position.z + Mathf.Cos(Angle/count*i)*Distance;
            //Рассчитываем координату X для врага
            float _x = transform.position.x + Mathf.Sin(Angle/count*i)*Distance;
            point.x = _x;
            point.z = _z;
            //Создаём врага
            Instantiate(EnemyPrefab, point, Quaternion.identity);                          
        }
    }
}

Позиция каждого следующего врага смещается на определённый угол относительно игрока.

Теорема косинусов

Квадрат стороны треугольника равен сумме квадратов двух других его сторон без удвоенного произведения этих сторон и косинуса угла между ними.

Общая формула для всех треугольников:

a2 = b2 + c2 – 2bc*cos(A)

Если угол является прямым, то справедлива теорема Пифагора:

Квадрат гипотенузы равен сумме квадратов катетов.

Формула: a2 = b2 + c2

Теорема Пифагора является частным случаем теоремы косинусов. (косинус 90 равен 0)

Применение этим формулам тоже нашлось (пример не самый лучший)

Имеется:

1) Хорошо охраняемая база, на которой хранятся юниящики.

2) Шпион, которому надо узнать сколько юниящиков храниться на базе.

На базе имеется склад. Чтобы узнать количество юниящиков, шпиону необходимо узнать площадь, которую занимает склад. Так как база охраняется, он не может пойти с рулеткой и измерить.

Поэтому мы дадим ему бинокль с возможностью измерения размеров объектов:

Зная угол обзора и расстояние до крайних точек, мы можем рассчитать размер склада.

Код:

using UnityEngine;
public class MegaBinoculars : MonoBehaviour {
    
        //Угол обзора
    public float Angle = 50;        
        //Расстояние до крайних точек обзора
    public float Distance = 10;     
    // Update is called once per frame
    void Update ()
    {
        if(Input.GetMouseButton(0))
        {
            Angle = Angle * Mathf.Deg2Rad;
                        //Вычисляем квадрат стороны склада (наш склад квадратный, поэтому это и есть площадь)
            float size = Distance*Distance + Distance*Distance - 2 * Distance * Distance * Mathf.Cos(Angle);    
            Debug.Log(size);
        }
    }
}

Больше про них рассказывать нечего, так что закончим на этом grin

P.S. Если что-то не понятно, пишите в комментариях wink

Комментариев: 5 RSS

2 shubniggurath 11-10-2013 16:57

Замечательно - просто понятно, самое главное что есть примеры. По-больше примеров "из жизни"!

3 Игорь 16-06-2014 12:15

Доброго времени суток!

Во-первых, спасибо Вам за уроки. Ну, и собственно вопросы:

1. Почему Angle 90?

//Угол занимаемый врагами (360 - вся окружность)

public float Angle = 90;

2. Почему, если синус это ордината, через синус вычисляем _х?

//Рассчитываем координату X для врага

float _x = transform.position.x + Mathf.Sin(Angle/count*i)*Distance;

3. Соответственно, почему _z вычисляем через косинус?

//Рассчитываем координату Z для врага

float _z = transform.position.z + Mathf.Cos(Angle/count*i)*Distance;

Заранее спасибо.

4 Poq Xert 17-06-2014 14:45

>2. Почему, если синус это ордината, через синус вычисляем _х?

>3. Соответственно, почему _z вычисляем через косинус?

В Unity3d ось Z направленна под углом 0 градусов, а ось X под углом 90 градусов (это видно на первой картинке). Как известно абсцисса направленна под углом 0, а ордината под углом 90. (Это чётко видно, если нарисовать координатные оси и расставить углы).

>1. Почему Angle 90?

Картинка не соответствует коду. (На картинке: Угол = 360, количество = 15). Спасибо за замечание, исправил. smile

5 Алексей 20-08-2014 18:21

Спасибо за урок. Очень-очень интересно и доступно пишешь. Потихоньку разбираюсь, не смотря на полный

Вы можете войти под своим логином или зарегистрироваться на сайте.