안녕하세요.
유니티를 이용해서 게임을 만들려면 공간상 몇 가지 개념에 대한 이해가 필요했습니다. 그래서 참고도서를 읽으면서 조금 정리해 보았습니다. 그리고 소스를 확인할 수 있도록 수정해서 확인해 보았습니다.
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
'Programming > Unity' 카테고리의 다른 글
유니티 리치 텍스트 (텍스트 안에서 마크업 태그) (0) | 2023.12.11 |
---|---|
[Unity] 유니티 실행 프로그램을 확장된 화면에 출력하기(특히, 노트북 확장 모니터에 출력하기) (0) | 2023.10.07 |