2012-11-22 5 views
1

사용자가 경로를 설정하고 일부 지형 위에 날아 다니는 OpenGL ES 2.0 용 3D 앱을 작성 중입니다. 그것은 기본적으로 레일상의 비행 시뮬레이터입니다.비행 시뮬레이터에서 위쪽 벡터를 계산하려면 어떻게해야합니까?

경로는 스플라인에서 생성 된 일련의 점으로 정의됩니다. 모든 타임 슬라이스는 보간법을 사용하여 현재 위치를 전진합니다. 즉, p0에서 p1 사이를 보간 한 다음 p1에 도달하면 p1과 p2 사이를 보간하고 마지막으로 pN에서 p0으로 보간합니다.

gluLookAt와 비슷한 것으로 뷰 매트릭스를 만듭니다. 눈 좌표는 현재 위치이고,보기는 경로를 따라 다음 위치이며 위로 (0, 0, 1)입니다. 그래서 카메라는 다음으로 날아가고 하늘을 향해 Z가 가리키는쪽으로 보입니다.

하지만 이제 나는 돌아 서서 "뱅킹"하고 싶습니다. 즉, 상향 벡터는 반드시 직접적으로 곧은 것은 아니지만, 회전 속도에 기초한 변화이다. 나는 나의 현재 방향과 나의 마지막 방향을 안다. 그래서 은행을 어느 정도 증가 시키거나 감소시킬 수있다. 내적 제품은 회전 각도를 알려주고 교차 제품은 왼쪽 또는 오른쪽으로 내게 알려줍니다. 나는 은행 각도를 유지하고// + 70도 범위 내에서 적절히 증분 또는 감소시킬 수 있습니다.

나는 이것이 올바른 접근이라고 생각하지만, 그렇지 않은지 알아 내기 위해 그것을 구현하는데 오랜 시간을 할애 할 수있다.

나는 올바른 길을 가고 있으며 내가하려고하는 것을 보여주는 샘플이 있습니까?

+0

제가 틀렸을 수도 있지만, 실제로 필요한 모든 회전 행렬이 아니며, 제로 행렬은 위로 향하는 것을 의미한다고 가정합니까? – TheAmateurProgrammer

답변

0

접근 방식은 정확하지만 부 자연스럽게 보일 것입니다. 예를 들어 죄 기능처럼 보이는 경로를 생각해보십시오. 비행기가 실제로 오른쪽으로 갈 때 왼쪽으로가는 것일 수 있습니다.

문제점에 대한 두 가지 해결책을 언급 할 수 있습니다. 먼저, 스플라인 파생물을 가져올 수 있습니다. 귀하의 스플라인이 점 (x, y, z)을 반환하는 f(t) 함수라고 가정합니다. 파라 메 트릭 곡선의 파생물은 회전 중심을 가리키는 벡터이며 원형 경로의 중심을 가리 킵니다.

위의 방법에 유의해야 할 점 : 직선의 파생어는 0이고 벡터도 0이므로 수동으로 위쪽 벡터를 수정해야합니다. 또한이 벡터를 수정하여 거꾸로 뒤집지 않도록 할 수 있습니다.

그게 효과가 있고 당신의 방법보다 좋아 보일 것입니다. 그러나 여전히 약간의 곡선이 부 자연스럽게 보일 것입니다. 내가 말할 수있는 가장 좋은 방법은 Slerp과 같은 쿼터니언 보간법입니다. 커브의 각 점에는 "오른쪽"벡터, 즉 평면의 오른쪽을 가리키는 벡터가 있습니다. 커브와이 벡터에서이 시점에서 위쪽 벡터를 계산할 수 있습니다. 그런 다음 쿼터니언 보간법을 사용하여 곡선을 따라 위쪽 벡터를 보간합니다.

+0

스플라인은 Catmull-rom 스플라인입니다. 본질적으로 사용자는 기본 경로를 설명하는 일부 지점을 탭한 다음 닫기 지점을 추가하고 제어 지점을 조정 한 다음 경로를 나타내는 루프를 내뱉습니다. 경로가 직선을 통과하기 때문에 Catmull을 사용합니다. 비행이 일어날 때까지는 스플라인은 사라지고 포인트 만 남습니다. 나는 슬리프 기능을 가지고 있지만 아무것도 사용하지 않는다. – locka

+0

..와 함께 사용한다. 나는 보간 된 점을 앞으로 임의의 거리로 계산할 수 있다고 생각 했었습니다. 예를 들어 다음 5 timeslices의 평균 방향을 계산하고이를 은행 각도를 계산하는 데 사용할 수있었습니다. – locka

+0

내가 말했듯이, 당신이 포인트를 직접 사용한다면, 움직임이 부 자연스럽게 보일 수도 있습니다. 갑자기 방향이 바뀌어도 항상 좋아 보이지는 않습니다. –

0

위치와 회전이 스플라인 곡률에만 의존하는 경우 가장 쉬운 방법은 3D 스플라인 Numerical differentiation입니다 (세로 2 파생물과 수평 구성 요소 1 파생). 귀하의 UP과 측면은 접선의 법선이됩니다.

2

정상적인 상태에서 비행하는 멋진 매끄러운 비행기를 가지고있는 것처럼 보이므로 많은 것을 필요로하지는 않습니다 ... 거의 접근하고 거의 자연 스러울 것입니다. 당신이 필요로하는 것은 A, B, C의 순차적 인 3 점 사이의 교차 곱입니다 : cross = cross(A-B, C-B).이제 십자가는 "앞으로"벡터 주위로 비행기를 돌리는 데 필요한 벡터입니다 : 당연히 비행기의 위쪽 벡터는 (- 중력) 보통 (0,0,1)이고 B 지점의 전방 벡터는 CB입니다 (보간이 필요없는 경우).) 이제 "측면"벡터는 side = normalized(cross(forward, up))이고 여기서 은행을 사용하는 곳은 side = side + cross*planeCorrectionParameter이고 그 다음은 up = cross(normalized(side), normalized(forward))입니다. "planeCorrectionParameter"는 날개와 선체의 크기, 공기 밀도, 중력, 속도, 질량 등과 같은 매개 변수의 조합을 나타내는 매개 변수입니다.

매개 변수 순서로 스왑이 필요합니다 (십자가 (a, b)는 십자가 (b, a) 여야합니다).

관련 문제