← Назад к вопросам

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

2.0 Middle🔥 231 комментариев
#Физика и математика

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Роль скалярного произведения векторов в Unity

Скалярное произведение векторов — это фундаментальная математическая операция, которая в Unity используется для решения множества практических задач, связанных с геометрией, физикой, искусственным интеллектом и графикой. Его важность сложно переоценить, так как оно позволяет перевести геометрические отношения в числовые значения, которые легко интерпретировать и использовать в коде.

Ключевые применения скалярного произведения в Unity

  • Определение угла между векторами и проверка направления
    Это самое известное применение. Скалярное произведение напрямую связано с косинусом угла между векторами. Если результат равен 0 — векторы перпендикулярны. Если больше 0 — угол острый (объекты смотрят примерно в одном направлении). Если меньше 0 — угол тупой (объекты направлены в разные стороны). Это основа для проверки, видит ли враг игрока или находится ли объект в поле зрения камеры.

```csharp
// Проверка, находится ли враг перед игроком
Vector3 toEnemy = (enemy.position - player.position).normalized;
float dot = Vector3.Dot(player.forward, toEnemy);

if (dot > 0.7f) // Угол меньше ~45 градусов
{
    // Враг в поле зрения
}
```
  • Проецирование одного вектора на другой
    Позволяет найти, какая составляющая одного вектора (например, скорости) направлена вдоль другого вектора (например, нормали поверхности). Критически важно для физики: расчета отскока, движения по склонам, определения силы, приложенной в определенном направлении.

```csharp
// Проецирование скорости на нормаль поверхности для расчета отскока
Vector3 incomingVelocity = rb.velocity;
Vector3 surfaceNormal = hit.normal;
// Компонент скорости, перпендикулярный поверхности
Vector3 perpendicularComponent = Vector3.Project(incomingVelocity, surfaceNormal);
// Упрощенная формула отскока (без учета энергии)
Vector3 reflectedVelocity = incomingVelocity - 2 * perpendicularComponent;
```
  • Оптимизация сравнений и расчетов
    Поскольку вычисление косинуса через `Mathf.Cos` дороже, чем прямое скалярное произведение нормализованных векторов, для сравнения углов часто используют заранее вычисленные пороговые значения косинуса. Например, проверка `dot > 0.5f` эффективнее, чем проверка `angle < 60f`.

  • Освещение и шейдеры
    В основе модели освещения по Фонгу лежит скалярное произведение между **нормалью поверхности** (`normal`) и **направлением на источник света** (`lightDir`). Именно эта величина определяет интенсивность диффузной составляющей света. Это происходит на GPU, но понимание принципа необходимо для написания собственных шейдеров.

```hlsl
// Упрощенный расчет диффузного света в шейдере
float NdotL = max(0, dot(normal, lightDirection));
float3 diffuse = lightColor * albedo * NdotL;
```
  • Работа с системами частиц (Particle System) и анимацией
    Используется для управления поведением частиц относительно определенного направления или для смешивания анимаций (Blend Trees) на основе направления движения персонажа.

Практический пример: ИИ противника

Представьте врага-стража. С помощью скалярного произведения можно элегантно реализовать его логику:

  1. Обнаружение игрока: Вычисляем вектор от стража к игроку и скалярно умножаем на transform.forward стража. Если результат близок к 1, игрок прямо перед ним.
  2. Проверка периферийного зрения: Если результат, например, между 0.5 и 0.9, игрок находится сбоку (в периферийном зрении).
  3. Реакция на атаку сзади: Если результат отрицательный, игрок атакует со спины — можно применить эффект критического урона или замешательства.
void UpdateAI()
{
    Vector3 toPlayer = (player.position - transform.position).normalized;
    float forwardDot = Vector3.Dot(transform.forward, toPlayer);
    float rightDot = Vector3.Dot(transform.right, toPlayer); // Для определения, слева или справа

    if (forwardDot > 0.9f) DetectPlayerDirectly();
    else if (forwardDot > 0.3f) DetectPlayerPeripherally(rightDot);
    else if (forwardDot < -0.3f) ReactToBackAttack();
}

Итог: Скалярное произведение в Unity — это не абстрактная математика, а мощный и эффективный инструмент для работы с пространственными отношениями. Оно позволяет писать чистый, производительный и геометрически понятный код для игровой логики, физики, графики и ИИ, являясь одной из основ геймдев-математики.

Для чего нужно скалярное произведение векторов в Unity? | PrepBro