저는 프로그래밍과 게임 프로그래밍을 처음 사용합니다. 벡터와 수학에 대한 내용을 읽었지만 질문이 있습니다. 게임 프로그래밍에서 벡터를 어디에 사용합니까? 어쩌면 누군가가 벡터를 사용하는 간단한 예를들 수 있습니까 (2D)?
나는 예제를 찾았지만 대부분 숫자를 출력하는 콘솔에 있으며, 이해할 수없는 큰 예제입니다.
class Star
여기
저는 프로그래밍과 게임 프로그래밍을 처음 사용합니다. 벡터와 수학에 대한 내용을 읽었지만 질문이 있습니다. 게임 프로그래밍에서 벡터를 어디에 사용합니까? 어쩌면 누군가가 벡터를 사용하는 간단한 예를들 수 있습니까 (2D)?
나는 예제를 찾았지만 대부분 숫자를 출력하는 콘솔에 있으며, 이해할 수없는 큰 예제입니다.
class Star
여기
답변:
벡터 란 무엇입니까?
벡터는 다양한 차원의 좌표 세트입니다. 벡터의 각 좌표는 벡터가있는 공간 방향의 절대 위치를 나타냅니다.
모든 경우에 문제의 벡터에 의미를 부여했습니다. 일반적으로 게임에서 지오메트리에 사용되는 벡터를 찾을 수는 있지만 벡터로 다른 것을 수행 할 수있는 이유는 없습니다.
왜 벡터를 사용해야합니까?
먼저 벡터를 사용할 필요 가 없습니다 . x와 y 또는 원하는 좌표를 추적하는 한 어떤면에서는 괜찮습니다.
그러나 벡터를 사용하는 것의 장점은 방향과 위치와 같은 것들을 깔끔하게 표현할 수 있고 삶에 더 편한 몇 가지 수학 연산이 정의되어 있다는 것입니다.
이에 대한 간단한 예는 내적을 고려하십시오 .
하향식 게임에 레이더 시스템이 있다고 가정하십시오. 레이더의 섹터에 나타나는 모든 적 (2D의 일부 파이 모양의 쐐기)은 화면에 작은 빨간 점이 나타납니다. 따라서 레이더 섹션에 어떤 적이 있는지 알아 내야합니다.
적들이 삼각형 안에 있는지 테스트 할 수 있습니다. 또한 레이더 섹터의 양면을 정의하는 평면 / 선의 두 반 공간의 교차점에 적이 포함되어 있는지 테스트 할 수 있습니다.
또는 도트 제품 을 사용 하여 확인을 수행 할 수도 있습니다. 방법은 다음과 같습니다.
이것은 매우 편리하며 이제 다른 방향을 가리키는 레이더를 쉽게 가질 수 있으며 (앞으로 벡터를 변경하기 만 함) 다른 너비를 갖습니다 (레이더 폭 각도를 변경하기 만 함).이 경우에도 동일한 코드를 재사용 할 수 있습니다 !
왜 다른 벡터를 사용합니까?
2D를 사용하는 경우 복잡한 효과와 모션 (회전, 크기 조절 등)을 달성하는 가장 좋은 방법은 장면 그래프를 사용하는 것입니다. 행성에는 궤도 선이 있고, 우주선에는 궤도 선이 있습니다. 벡터 수학을 사용하지 않고 이것을 계산하는 것은 정말 추악합니다.
벡터 수학을 사용하면 각각 점과 3x3 변환 행렬이있는 것으로 나타납니다. 행성은 변형을, 우주선은 변형과 행성의 변형을, 드론은 변형과 우주선의 변형과 행성의 변형을 사용합니다.
행성이 움직일 때, 당신은 그 변형을 바꾸고, 우주선과 드론은 자동으로 "무료"에 위치합니다. 훨씬 더 깨끗한 코드.
아직 확신하지 못했습니다. 벡터는 또한 거의 모든 그래픽 라이브러리 (특히 OpenGL 및 DirectX)에서 사용되는 위치, 지오메트리 및 모션에 대한 기본 표현입니다. 당신은 그들을 사용하지 않고 도망 갈 가능성이 없습니다.
결론 벡터는 기하학적 문제를 깨끗하고 우아하게 해결하는 명확한 코드를 작성하는 강력한 도구입니다.
2D 예는 화면 좌표이며, 화면의 픽셀을 식별하며 x 및 y 구성 요소 [x, y]가 있습니다. 즉 왼쪽 상단 화면 위치 [0, 0]
또 다른 예 : 오른쪽 화면 테두리에서 왼쪽 화면 테두리로 스크롤되는 텍스트를 상상해보십시오. 이제 스크롤 텍스트의 속도를 초당 픽셀로 정의해야합니다. 즉, [-20, 0]은 텍스트가 초당 20 픽셀을 왼쪽으로 스크롤하고 높이를 변경하지 않음을 의미합니다.
다른 고급 예 : 800x600, 1024x768 등의 다른 화면 해상도에서 실행되는 2D 게임을 상상해보십시오. 0.0에서 1.0까지의 화면 너비와 0.0에서 1.0까지의 높이를 사용하여 게임 논리를 분리하여 쉽게 수행 할 수 있습니다. 실제 화면 해상도에서. 이제 화면에 그릴 때 내부 벡터에 해상도 벡터를 곱하면됩니다.
screen_pos = internal_pos * screen_ressolution
여기서 3 개의 변수는 모두 2D 벡터이며 x 및 y 구성 요소가 있습니다 (예 : internal_pos [0.5, 0.25]).
[400, 150] = [0.5, 0.25] * [800, 600]
따라서 내부 위치 [0.5, 0.25]가 실제 화면 위치 [400, 150]로 변환됩니다.
이것이 기본적인 것들이었습니다. 벡터의 실제 장점은 행렬을 사용하여 정점을 변형 (회전, 축척, 대칭 등) 할 수 있습니다. 즉, 모든 내부 위치를 90도 쉽게 회전 시키거나 화면을 교체해야하는 선형 대수 응용 사용하는 타사 라이브러리와 같이이 규칙을 사용하므로 화면 상단에서 하단으로 0을 지정합니다.
screen_pos = internal_pos * screen_resolution
되어 있지 가 더 적절하게 기록 할 수있다, 당신이 그것을 쓴 방법을 불변 좌표 screen_pos = map_to_screen * internal_pos
경우, map_to_screen
(이 경우 대각선 하나, 행렬과 같이 쓸 수있다) 선형 매핑입니다.
다음은 Wolfire Games 블로그의 게임 개발에서 벡터에 대한 훌륭한 설명입니다.
http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/
벡터는 값과 방향을 모두 갖는 엔티티입니다. 실제와 물리 기반 게임에서 벡터의 예는 속도와 운동량을 포함합니다. 값만 있고 방향은없는 속성을 스칼라라고하며 위치, 질량, 밀도 등을 포함합니다.
벡터는 (속성, 가속도 등) 벡터와 같은 물리적 속성을 에뮬레이트하는 게임에 필요합니다. 벡터 계산에 사용되는 수학을 선형 대수 라고 합니다.
각 차원마다 숫자로 무언가를 나타내면이 숫자 모음은 벡터로 간주 될 수 있습니다. 위치, 속도 및 가속도가 벡터의 주요 예입니다. 어떤 경우에는 벡터로 향하는 방향을 나타내는 것이 실용적 일 수 있습니다.
기본적으로이 숫자를 벡터로 간주할지 여부는 중요하지 않지만 물리를 원한다면 벡터 수학을 살펴 봐야합니다.
간단히 말해서, 위치 나 방향이있는 모든 것은 게임의 어느 곳에 나 벡터를 사용합니다. 벡터는 점과 같습니다
struct Point2
{
float x, y;
};
struct Vector2
{
float x, y;
};
그러나 차이점은 실제로 이것에 달려 있습니다. 점은 단지 점이고 벡터는 화살표입니다.
당신이 가지고 있다면
Point2.x = 5;
Point2.y = 10;
이 위치 x 5와 y 10에서
그러나 벡터를 선언하면 ...
Vector2.x = 5;
Vector2.y = 10;
당신의 진정한 말은 0에서 0에서 x 5, y 10의 화살표를 선언합니다.
벡터가 가리키는 지점을 어디에서나 공간의 한 지점으로 지정할 수 있습니다. 예를 들어 점과 벡터를 사용하여 객체를 이동하면 Point2를 사용하여 위치를 저장하고 vector2를 사용하여 위치를 이동합니다 .
point2.x = 10;
point2.y = 15;
이제 벡터를 사용하여이 점을 이동할 수 있습니다.이 점을 x 축 10 단위 위로 움직여서
vector2.x = 10;
vector2.y = 0;
point2 += vector2;
이제 벡터 화살표가 지시 한 지점으로 이동했습니다.
지금 포인트는
point2.x = 20;
point2.y = 15;
마지막으로 주목해야 할 것은 벡터가 동일한 유형의 데이터를 보유하기 때문에 점처럼 사용되거나 그 반대로 사용되는 경우도 있습니다.
v = pos - origin
그래서 v != pos
원점 점이기 때문에{0, 0, 0, 1}