게임 개발의 벡터


19

저는 프로그래밍과 게임 프로그래밍을 처음 사용합니다. 벡터와 수학에 대한 내용을 읽었지만 질문이 있습니다. 게임 프로그래밍에서 벡터를 어디에 사용합니까? 어쩌면 누군가가 벡터를 사용하는 간단한 예를들 수 있습니까 (2D)?

나는 예제를 찾았지만 대부분 숫자를 출력하는 콘솔에 있으며, 이해할 수없는 큰 예제입니다.


기본 TL; DR 벡터는 선형 대수 주제의 일부이며 Matricies로 이어집니다. Matricies 및 Linear Algebra를 사용하면 지뢰 찾기 솔버에서 3D 월드 투영에 이르는 모든 것을 작성하여 커서 아래에있는 오브젝트를 볼 수 있습니다. 선형 대수학은 모든 게임 개발자에게 가장 유용하고 필요한 하나의 수학 브랜치입니다. 지금 배우십시오. 후회하지 않을거야.
Robert Massaioli

모든 멋진 답변에 감사드립니다! 그러나이 튜토리얼에서 Vector를 사용하지 않는 이유는 무엇입니까? : zetcode.com/tutorials/javagamestutorial 또는 한 개발자가 다른 것을 사용하지 않습니까?
vqwer 2018 년

말할 것도없이, 아마도 저자는 초보자에게 간단하고 기본적으로 유지하기를 원했을 것입니다.
Maik Semder 2016 년

실제로 저자는 그것들을 사용합니다. class Star 여기
Maik Semder

또한 여기 에서 Point2D사용됩니다class ResizeRectangle
Maik Semder

답변:


31

벡터 란 무엇입니까?

벡터는 다양한 차원의 좌표 세트입니다. 벡터의 각 좌표는 벡터가있는 공간 방향의 절대 위치를 나타냅니다.

  • 1 차원 벡터는 {1} 입니다. 예를 들어 X = 1에서의 위치 또는 시간 t = 1 일 수 있습니다.
  • 2 차원 벡터는 {-4,3} 입니다. 예를 들어 X 축에서 -4, Y 축에서 3의 위치 일 수 있습니다. X 축의 위치 (-4 미터)에서 온도 (3도)가 될 수도 있습니다.
  • 3 차원 벡터는 {1,2,3} 입니다. 이것은 X 축을 따라 1 번 공간에서, Y 축으로 다시 2 번, Z 축에서 3 번 위의 위치 일 수 있습니다. 또는 1 개의 빨간색, 2 개의 녹색 및 3 개의 파란색이 될 수 있습니다. 또는 T ( {3} )에 XY 위치 ( {1,2} ) 일 수도 있습니다 .

모든 경우에 문제의 벡터에 의미를 부여했습니다. 일반적으로 게임에서 지오메트리에 사용되는 벡터를 찾을 수는 있지만 벡터로 다른 것을 수행 할 수있는 이유는 없습니다.

왜 벡터를 사용해야합니까?

먼저 벡터를 사용할 필요 가 없습니다 . x와 y 또는 원하는 좌표를 추적하는 한 어떤면에서는 괜찮습니다.

그러나 벡터를 사용하는 것의 장점은 방향과 위치와 같은 것들을 깔끔하게 표현할 수 있고 삶에 더 편한 몇 가지 수학 연산이 정의되어 있다는 것입니다.

이에 대한 간단한 예는 내적을 고려하십시오 .

하향식 게임에 레이더 시스템이 있다고 가정하십시오. 레이더의 섹터에 나타나는 모든 적 (2D의 일부 파이 모양의 쐐기)은 화면에 작은 빨간 점이 나타납니다. 따라서 레이더 섹션에 어떤 적이 있는지 알아 내야합니다.

적들이 삼각형 안에 있는지 테스트 할 수 있습니다. 또한 레이더 섹터의 양면을 정의하는 평면 / 선의 두 반 공간의 교차점에 적이 포함되어 있는지 테스트 할 수 있습니다.

또는 도트 제품 을 사용 하여 확인을 수행 할 수도 있습니다. 방법은 다음과 같습니다.

  1. 레이더의 중앙에서 "레이더의 전면"을 향하여 벡터를 만듭니다. 정규화하십시오.
  2. 레이더의 중심에서 레이더 가시성을 확인하려는 물체를 향한 벡터를 만듭니다. 정규화하십시오.
  3. 정규화 된 두 벡터의 내적을 구합니다.
  4. 해당 제품의 아크 코사인을 가져다가 레이더 폭의 절반보다 작은 지 확인하십시오. 만약 그렇다면, 글씨를 그립니다.

이것은 매우 편리하며 이제 다른 방향을 가리키는 레이더를 쉽게 가질 수 있으며 (앞으로 벡터를 변경하기 만 함) 다른 너비를 갖습니다 (레이더 폭 각도를 변경하기 만 함).이 경우에도 동일한 코드를 재사용 할 수 있습니다 !

왜 다른 벡터를 사용합니까?

2D를 사용하는 경우 복잡한 효과와 모션 (회전, 크기 조절 등)을 달성하는 가장 좋은 방법은 장면 그래프를 사용하는 것입니다. 행성에는 궤도 선이 있고, 우주선에는 궤도 선이 있습니다. 벡터 수학을 사용하지 않고 이것을 계산하는 것은 정말 추악합니다.

벡터 수학을 사용하면 각각 점과 3x3 변환 행렬이있는 것으로 나타납니다. 행성은 변형을, 우주선은 변형과 행성의 변형을, 드론은 변형과 우주선의 변형과 행성의 변형을 사용합니다.

행성이 움직일 때, 당신은 그 변형을 바꾸고, 우주선과 드론은 자동으로 "무료"에 위치합니다. 훨씬 더 깨끗한 코드.

아직 확신하지 못했습니다. 벡터는 또한 거의 모든 그래픽 라이브러리 (특히 OpenGL 및 DirectX)에서 사용되는 위치, 지오메트리 및 모션에 대한 기본 표현입니다. 당신은 그들을 사용하지 않고 도망 갈 가능성이 없습니다.

결론 벡터는 기하학적 문제를 깨끗하고 우아하게 해결하는 명확한 코드를 작성하는 강력한 도구입니다.


14

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을 지정합니다.


벡터가 일종의 목록과 같은 단일 차원 배열이 아닙니까? 화면 해상도에 대해 이야기 할 때 다차원 배열 (각 X 및 Y 축에 대해 하나의 좌표)을 말하는 것이 아닙니까? 여기서 '벡터'가 행렬과 섞이지 않도록하십시오. =)
Will Marcouiller 님이

@ 스크린의 완전한 픽셀 데이터는 다차원 배열, 기본적으로 비트 맵으로 취급 될 수 있지만 너비와 높이의 값, 즉 해상도는 그렇지 않습니다.
Maik Semder

2
벡터는 종종 수학과 프로그래밍에서 상당히 다르게 취급됩니다. 수학적으로 말하면, 벡터는 없는 어떤 기준에 대하여 그 구성 요소가 서로 같은 배열을 정의하지만, 다차원 배열. 벡터 자체는 불변 좌표입니다. 작업이 screen_pos = internal_pos * screen_resolution되어 있지 가 더 적절하게 기록 할 수있다, 당신이 그것을 쓴 방법을 불변 좌표 screen_pos = map_to_screen * internal_pos경우, map_to_screen(이 경우 대각선 하나, 행렬과 같이 쓸 수있다) 선형 매핑입니다.
leftaroundabout

6

다음은 Wolfire Games 블로그의 게임 개발에서 벡터에 대한 훌륭한 설명입니다.

http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/


이것은 현재 링크 전용 답변입니다. 독자가이 링크에서 얻을 수있는 주요 요점에 대한 대략적인 요약을 포함시켜 링크가 변경되거나 중단되거나 나중에 사용할 수 없게 되더라도 독자적으로 답변을 얻을 수 있습니다.
DMGregory

1

벡터는 값과 방향을 모두 갖는 엔티티입니다. 실제와 물리 기반 게임에서 벡터의 예는 속도와 운동량을 포함합니다. 값만 있고 방향은없는 속성을 스칼라라고하며 위치, 질량, 밀도 등을 포함합니다.

벡터는 (속성, 가속도 등) 벡터와 같은 물리적 속성을 에뮬레이트하는 게임에 필요합니다. 벡터 계산에 사용되는 수학을 선형 대수 라고 합니다.


속도는 스칼라, 속도 벡터의 길이
Maik Semder

수정 - 고정
, 둘다 Galperin

1
평소 위치는 벡터로 간주되며 거리는 스칼라입니다.
Ali1S232

위치는 스칼라 (또는 스칼라 모음) 또는 축 시작점을 가리키는 벡터로 간주 될 수 있습니다.
Eran Galperin

1

각 차원마다 숫자로 무언가를 나타내면이 숫자 모음은 벡터로 간주 될 수 있습니다. 위치, 속도 및 가속도가 벡터의 주요 예입니다. 어떤 경우에는 벡터로 향하는 방향을 나타내는 것이 실용적 일 수 있습니다.

기본적으로이 숫자를 벡터로 간주할지 여부는 중요하지 않지만 물리를 원한다면 벡터 수학을 살펴 봐야합니다.


위치가 벡터가 아닙니다
Eran Galperin

속도도 스칼라도
아니고

2
@Eran Galperin 나는 그것이 수학자들 사이에서 꽤 널리 퍼져 있다는 것을 알고 있습니다. 그러나 점과 해당 위치 벡터 간의 구별은 상당히 학문적입니다. 구별에 대해 혼란스러워 할 실질적인 이유는 없습니다.
aaaaaaaaaaaa

1
실제 이유는 4D homogenious 좌표와 매트릭스와 함께 작동하면, 당신은있다 그 구분을 할 수 있습니다. 이 질문의 범위와 관련이 없지만.
Maik Semder 2016 년

@eBusiness 그것은 "보기"가 아닙니다. 그것은 사실입니다. 그리고 저는 수학자가 아닌 교육에 의한 물리학 자입니다.
Eran Galperin

0

간단히 말해서, 위치 나 방향이있는 모든 것은 게임의 어느 곳에 나 벡터를 사용합니다. 벡터는 점과 같습니다

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;

마지막으로 주목해야 할 것은 벡터가 동일한 유형의 데이터를 보유하기 때문에 점처럼 사용되거나 그 반대로 사용되는 경우도 있습니다.


벡터입니다. 이 점 P. 원점에서 벡터의
공산주의를 오리

1
@Duck 기술적으로 그 벡터가 position_point에서 origin_point을 빼서 찾을 수있는 동차 좌표를 참조하여 올바른 아니라 말하기,하지만 그들이 동일하지 않습니다 v = pos - origin그래서 v != pos원점 점이기 때문에{0, 0, 0, 1}
Maik Semder

@Duck : 점 벡터가 아니라 점이며 원점 은 벡터를 정의 합니다. 이것은 원점이 0 인 경우 대부분의 시간만큼 좋습니다.

@Duck 그렇다면 왜 포인트 P라고 했습니까? LOL
EddieV223
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.