Version: 2020.2
Important Classes - Transform
Important Classes - Quaternion

Important Classes - Vectors

Vectors are a fundamental mathmatical concept which allow you to describe a direction and magnitude. In games and apps, vectors are often used describe some of the fundamental properties such as the position of a character, the speed something is moving, or the distance between two objects.

Vector arithmetic is fundamental to many aspects of computer programming such as graphics, physics and animation, and it is useful to understand it in depth to get the most out of Unity.

Vectors can be expressed in multiple dimensions, and Unity provides the Vector2, Vector3 and Vector4 classes for working with 2D, 3D, and 4D vectors. These three types of Vector classes all share many of the same functions, such as magnitude, so most of the information on this page applies to all three types of Vector unless otherwise specified.

This page provides an overview of the Vector classes and their common uses when scripting with them. For an exhaustive reference of every member of the vector classes, see the script reference pages for Vector2, Vector3 and Vector4.

Understanding Vector Arithmetic

Addition

두 벡터를 더하면 그 결과는 오리지널 벡터를 “단계”대로 하나씩 차례대로 취한 것과 동일합니다. 두 파라미터의 순서가 바뀌어도 결과가 같으므로 순서는 상관이 없습니다.

첫 번째 벡터가 공간 내 하나의 점일 경우, 두 번째 벡터는 그 포지션의 오프셋 또는 그 포지션에서 “점프”한 것으로 해석할 수 있습니다. 예를 들어, 땅 위 어떤 위치로부터 5유닛 위에 있는 위치의 지점을 찾으려면 다음 연산을 사용하면 됩니다.-

 var pointInAir = pointOnGround + new Vector2(0, 5);

벡터가 힘을 나타내는 단위일 때 벡터를 힘의 크기인 강도와 방향으로 간주하면 더욱 직관적으로 이해할 수 있습니다. 두 가지 힘의 벡터를 더하면 두 힘을 합한 값과 동일한 새로운 벡터가 생성됩니다. 이 개념은 동시에 다수의 서로 다른 컴포넌트에 힘을 가할 때 유용합니다. 예를 들어, 로켓이 추진력에 의해 앞으로 가고 있지만 역풍으로 인해 영향을 받는 경우를 구현하기 유용합니다.

Although the examples here show 2D vectors, the same concept applies to 3D and 4D vectors.

Subtraction

벡터의 뺄셈이 가장 많이 사용되는 경우는 한 오브젝트에서 다른 오브젝트까지의 거리와 방향을 구하고자 할 때입니다. 주의할 점은 벡터의 뺄셈에서는 두 파라미터의 순서가 매우 중요하다는 점입니다.

// The vector d has the same magnitude as c but points in the opposite direction.
var c = b - a;
var d = a - b;

숫자의 경우 음의 벡터를 더하는 것은 양의 벡터를 빼는 것과 동일합니다.

// These both give the same result.
var c = a - b;
var c = a + -b;

음의 벡터는 오리지널 벡터와 크기가 같고 같은 선상에서 정반대 방향을 가리키는 벡터를 말합니다.

Direction and Distance from One Object to Another

공백 내 한 포인트의 값을 다른 포인트의 값에서 빼면 그 결과는 한 오브젝트에서 다른 오브젝트를 “가리키는” 벡터 입니다.

// Gets a vector that points from the player's position to the target's.
var heading = target.position - player.position;

As well as pointing in the direction of the target object, this vector’s magnitude is equal to the distance between the two positions. You may need a “normalized” vector giving the direction to the target, but with a fixed distance (say for directing a projectile). You can normalize a vector by dividing it by its own magnitude:

var distance = heading.magnitude;
var direction = heading / distance; // This is now the normalized direction.

방법은 크기와 정규화 된 프로퍼티를 모두 별도로 사용하는 것보다 바람직합니다. 둘 다 CPU를 많이 소모하기 때문입니다(모두 제곱근 연산을 수반함).

거리를 비교 용도로만 사용해야 하는 경우(예: 근접 검사) 크기 계산 자체를 피할 수 있습니다. sqrMagnitude 프로퍼티는 크기 값을 제곱을 제공하고 크기처럼 계산되지만 시간 소모적인 제곱근 연산이 불필요합니다. 크기를 알려진 거리에 비교하지 않고 크기의 제곱을 거리의 제곱에 비교할 수 있습니다.

if (heading.sqrMagnitude < maxRange * maxRange) {
    // Target is within range.
}

그러면 실제 크기를 비교에 사용하는 것보다 훨씬 더 효율적입니다.

Sometimes, when working in 3D, you might need an “overground heading” to a target. For example, imagine a player standing on the ground who needs to approach a target floating in the air. If you subtract the player’s position from the target’s then the resulting vector will point upwards towards the target. This is not suitable for orienting the player’s transform since they will also point upwards; what is really needed is a vector from the player’s position to the position on the ground directly below the target. You can obtain this by taking the result of the subtraction and setting the Y coordinate to zero:-

var heading = target.position - player.position;
heading.y = 0;  // This is the overground heading.

Scalar Multiplication and Division

벡터를 논할 때, 일반적으로 보통의 수(예: 플로트 값)를 스칼라라고 부릅니다. 스칼라라는 말의 의미는 “스케일” 또는 크기만을 가진다는 의미이고 한편 벡터는 크기와 방향을 모두 가집니다.

벡터에 스칼라를 곱하면 그 결과는 오리지널과 동일한 방향을 가리키는 벡터가 됩니다. 그러나 새 벡터의 크기는 오리지널 벡터의 크기에 해당 스칼라 값을 곱한 값과 동일합니다.

마찬가지로 스칼라 나눗셈은 오리지널 벡터의 크기를 스칼라로 나누는 것입니다.

이러한 연산은 벡터가 이동 오프셋 또는 힘을 나타낼 때 유용합니다. 이 방식을 통해 방향에는 영향을 주지 않으면서 어떤 벡터의 크기를 변경할 수 있습니다.

어떤 벡터를 자신의 크기로 나누면 그 결과는 크기가 1인 벡터가 되며, 이 벡터를 노멀라이즈 벡터라 합니다. 노멀라이즈 벡터에 스칼라를 곱하면 결과 벡터의 크기는 해당 스칼라 값과 같아집니다. 힘의 방향은 일정하지만 강도를 제어할 수 있는 경우에 유용합니다(예: 자동차 바퀴의 힘은 항상 앞 방향으로 차를 움직이지만 그 동력은 운전자가 제어합니다).

Dot Product

내적 연산은 두 벡터를 받아 스칼라를 반환합니다. 이 스칼라는 두 벡터의 크기를 곱하고 그 결과에 두 벡터 사이의 각에 대한 코사인을 곱한 것과 같습니다. 두 벡터 모두 노멀라이즈 벡터일 경우 코사인은 근본적으로 첫 번째 벡터가 두 번째 벡터의 방향으로 얼마나 기울었는지를 나타냅니다(또는 그 반대도 성립합니다. 즉 파라미터의 순서는 상관이 없습니다).

Below you can see a comparison of how vectors of varying angles compared with a reference vector return a dot product value between 1 and –1 :

The dot product is a mathematically simpler operation than calculating the cosine, so it can be used in place of the Mathf.Cos function or the vector magnitude operation in some circumstances (it doesn’t do exactly the same thing but sometimes the effect is equivalent). However, calculating the dot product function takes much less CPU time and so it can be a valuable optimization.

The dot product is useful if you want to calculate the amount of one vector’s magnitude that lies in the direction of another vector.

For example, a car’s speedometer typically works by measuring the rotational speed of the wheels. The car may not be moving directly forward (it may be skidding sideways, for example) in which case part of the motion will not be in the direction the car is facing - and so won’t be measured by the speedometer. The magnitude of an object’s rigidbody.velocity vector will give the speed in its direction of overall motion but to isolate the speed in the forward direction, you should use the dot product:

var fwdSpeed = Vector3.Dot(rigidbody.velocity, transform.forward);

물론 방향은 어떤 방향이든 무관하지만, 이 연산을 하려면 방향 벡터를 정규화해야 합니다. 결과가 속도 크기를 더 정확하게 측정할 수 있을 뿐만 아니라, 크기를 계산하는 동안 느린 제곱근 연산을 피할 수 있도록 하기 때문입니다.

Cross Product

The cross product is only meaningful for 3D vectors. It takes two 3D vectors as input and returns another 3D vector as its result.

The result vector is perpendicular to the two input vectors. You can use the “left hand rule” to remember the direction of the output vector from the ordering of the input vectors. If the first parameter is matched up to the thumb of the hand and the second parameter to the forefinger, then the result will point in the direction of the middle finger. If the order of the parameters is reversed then the resulting vector will point in the exact opposite direction but will have the same magnitude.

결과 벡터의 크기는 입력 벡터들의 크기를 곱하고 그 결과에 두 벡터 사이각의 사인을 곱한 것과 같습니다. 사인 함수에서 자주 사용되는 값은 아래와 같습니다.

The cross product can seem complicated since it combines several useful pieces of information in its return value. However, like the dot product, it is very efficient mathematically and can be used to optimize code that would otherwise depend on slower transcendental functions such as sine and cosine.

Computing a Normal/Perpendicular vector

A “normal” vector (ie. a vector perpendicular to a plane) is required frequently during mesh generation and is also useful in path following and other situations. Given three points in the plane, say the corner points of a mesh triangle, you can find the normal as follows: - Pick one of the three points - Subtract it from each of the two other points separately (resulting in two new vectors, “Side 1” and “Side 2”) - Calculate the cross product of the vectors “Side 1” and “Side 2” - The result of the cross product is a new vector that is perpendicular to the plane the three original points lie on - the “normal”.

Vector3 a;
Vector3 b;
Vector3 c;

Vector3 side1 = b - a;
Vector3 side2 = c - a;

Vector3 normal = Vector3.Cross(side1, side2);

The “left hand rule” can be used to decide the order in which the two vectors should be passed to the cross product function. As you look down at the top side of the surface (from which the normal will point outwards) the first vector should sweep around clockwise to the second:

입력 벡터의 순서가 바뀌면 결과는 정확히 반대 방향을 가리킵니다.

메시의 경우 노멀 벡터도 정규화되어야 합니다. 정규화된 프로퍼티를 사용하여 이 작업을 수행할 수 있지만 때때로 유용한 또 다른 트릭이 있습니다. 직각 벡터를 자체 크기로 나눠 정규화할 수도 있습니다.

float perpLength = perp.magnitude;
perp /= perpLength;

Another useful note is that the area of the triangle is equal to perpLength / 2. This is useful if you need to find the surface area of the whole mesh or want to choose triangles randomly with probability based on their relative areas.

Important Classes - Transform
Important Classes - Quaternion