행복한 하루

[Unity] 게임을 위한 수학 용어 빠르게 이해하기 (좌표, 벡터, 스칼라) 본문

Unity/Math

[Unity] 게임을 위한 수학 용어 빠르게 이해하기 (좌표, 벡터, 스칼라)

변화의 물결 2023. 2. 12. 16:36

 

 

안녕하세요.

 

 유니티를 이용해서 게임을 만들려면 공간상 몇 가지 개념에 대한 이해가 필요했습니다. 그래서 참고도서를 읽으면서 조금 정리해 보았습니다. 그리고 소스를 확인할 수 있도록 수정해서 확인해 보았습니다.


1. 간략하게 좌표, 백터, 스칼라 개념 정리

 - 좌표(Coordinate, Point) : 위치의 명확한 위치를 나타내는 것, 2차원의 경우 x, y 숫자로 위치 파악

 - 벡터(Vector) : 크기와 방향을 지는 값으로 이동량을 나타냄( 시작하는 지점은 상관없지만, 일반적으로 원점(0,0)에서 시작 )

 - 스칼라(Scalar) : 벡터와 대비되는 개념으로 방향을 가지지 않고 크기만 자지고 있는 양

 

2. 프로그램 소스로 확인

 - 좌표와 벡터의 연산과 좌표와 스칼라 연산 등 간단하게 계산해 볼 수 있습니다. 값이 동일하게 나오지만 개념 자체가 좌표연산과 벡터연산의 차이 이해가 필요합니다.

 

  (좌표1) + (좌표2) = (벡터1)

  (좌표1) = (벡터1) - (좌표2)

 

 - 좌표1와 좌표2를 연산하면 벡터1가 나오게 되고, 계산식의 항(좌표2)을 이동시키면 벡터1와 좌표2 연산의 결과는 좌표1 즉, 좌표를 원하는 벡터만큼 이동시킨다는 의미가 되는 것을 알 수 있습니다. 또한 좌표에 스칼라를 곱하면 위치가 바뀌게 되지만, 벡터에 스칼라를 곱하면 이동량이 변화가 됩니다.

 

 - C++ 코드로 Visual Studio 2019 C++ Console 프로젝트에서 확인하였습니다.

 

<소스 코드>   

#include <iostream>
#include <math.h>

using namespace std;

// 벡터 구조체
struct Vector
{
    float x, y;
};

//좌표구조체
struct Point
{
    float x, y;
};

//(좌표) + (벡터)
Point Add_point_vector(Point p, Vector v)
{
    Point r;
    r.x = p.x + v.x;
    r.y = p.y + v.y;

    return (r);
}

//(좌표) - (벡터)
Point Sub_point_vctor(Point p, Vector v)
{
    Point r;
    r.x = p.x - v.x;
    r.y = p.y - v.y;

    return (r);
}

//(좌표) - (좌표)
Vector Sub_point_point(Point p0, Point p1)
{
    Vector r;
    r.x = p0.x - p1.x;
    r.y = p0.y - p1.y;

    return (r);
}

//(벡터) + (벡터)
Vector Add_vector_vector(Vector v0, Vector v1)
{
    Vector r;
    r.x = v0.x + v1.x;
    r.y = v0.y + v1.y;

    return (r);
}

//(벡터) - (벡터)
Vector Sub_vector_vector(Vector v0, Vector v1)
{
    Vector r;
    r.x = v0.x - v1.x;
    r.y = v0.y - v1.y;

    return (r);
}

//(좌표) x (스칼라)
Point Mul_point_scalar(Point p, float s)
{
    Point r;
    r.x = p.x * s;
    r.y = p.y * s;

    return (r);
}

//(좌표) / (스칼라)
Point Div_point_scalar(Point p, float s)
{
    Point r;
    r.x = p.x / s;
    r.y = p.y / s;

    return (r);
}

//(벡터) x (스칼라)
Vector Mul_vector_scalar(Vector v, float s)
{
    Vector r;
    r.x = v.x * s;
    r.y = v.y * s;

    return (r);
}

//(벡터) / (스칼라)
Vector Div_vector_scalar(Vector v, float s)
{
    Vector r;
    r.x = v.x / s;
    r.y = v.y / s;

    return (r);
}

float Vector_length(Vector v) 
{
    float len = sqrtf(v.x * v.x + v.y * v.y);
    return (len);
}

//벡터 정규화
Vector Vector_normalize(Vector v)
{
    float len = Vector_length(v);

    Vector r;
    r.x = v.x / len;
    r.y = v.y / len;

    return (r);
}

int main()
{
    Point p = { 4.0, 2.0f };
    Point retP;
    Vector v;
    Vector retV = { 0.0f, 0.0f };

    retP.x = 0.0f; 
    retP.y = 0.0f;

    v.x = 4.0f;
    v.y = 2.0f;

    float scalar = 2.0f;

    //소수점 자리수 고정
    cout << fixed;
    cout.precision(5);
    
    cout << "== Vector Example == \n\n";

    //좌표가 바뀐다
    retP = Mul_point_scalar(p, scalar);
    printf("좌표 (%f, %f) x 스칼라(%f) = 좌표(%f, %f)\n", p.x, p.y, scalar, retP.x, retP.y);
    
    retP = Div_point_scalar(p, scalar);
    printf("좌표 (%f, %f) / 스칼라(%f) = 좌표(%f, %f)\n", p.x, p.y, scalar, retP.x, retP.y);

    //벡터 길이를 바꾼다
    retV = Mul_vector_scalar(v, scalar);
    printf("벡터 (%f, %f) x 스칼라(%f) = 좌표(%f, %f)\n", v.x, v.y, scalar, retV.x, retV.y);

    retV = Div_vector_scalar(v, scalar);
    printf("벡터 (%f, %f) / 스칼라(%f) = 좌표(%f, %f)\n", v.x, v.y, scalar, retV.x, retV.y);

    cout << "\n\n";

    //벡터 길이 
    cout << "길이(" << v.x << "," << v.y << ")= " << Vector_length(v) << endl;

    //벡터 정규화
    Vector n = Vector_normalize(v);

    cout << "정규화(x) " << v.x << " -> " << n.x << endl;
    cout << "정규화(y) " << v.y << " -> " << n.y << endl;
    cout << "정규화 후 길이(" << v.x << ", " << v.y << ") = " << Vector_length(n) << endl;
}

<실행 결과> 

 

감사합니다.

 

 

<참고 자료>

1. [도서] 게임을 움직이는 수학과 물리

2. C++ cout 소수점 n표시 방법

https://dingcoding.tistory.com/65

vector_example.cpp
0.00MB

 

Comments