2009-10-07 4 views
1

좌표C++ OpenGL은 충돌 검출

I (원점이 왼쪽 상단 구석에 있고, 이것은 모든 직교 모드이고, x는 오른쪽에 긍정적이고, Y는 Y 축 아래쪽 양수) 월드 공간에서 회전 m_rotation (도)을 가질 수있는 직사각형을가집니다.

사각형으로 잘 작업 할 수 있고, 회전하고, 크기를 조절하고, 원하는 모든 작업을 수행 할 수 있습니다.

정말 혼란스러워지는 부분은 로컬 좌표에서 직사각형 좌표를 계산하는 것입니다. ,

//GLfloat Ax = getLocalVertices()[BOTTOM_LEFT].x * cosf(DEG_TO_RAD(m_orientation)) - getLocalVertices()[BOTTOM_LEFT].y * sinf(DEG_TO_RAD(m_orientation)); 
//GLfloat Ay = getLocalVertices()[BOTTOM_LEFT].x * sinf(DEG_TO_RAD(m_orientation)) + getLocalVertices()[BOTTOM_LEFT].y * cosf(DEG_TO_RAD(m_orientation)); 

//Vector3D BL = Vector3D(Ax,Ay,0); 

내가 번역 된 점에 벡터를 만들려면 사각형에 저장 :

x' = x*cos(t) - y*sin(t) 
y' = x*sin(t) + y*cos(t) 

where (x, y) are the original points, 
(x', y') are the rotated coordinates, 
and t is the angle measured in radians 

from the x-axis. The rotation is 
counter-clockwise as written. 
-credits duffymo 

이 같은 공식을 구현하는 시도 : 나는 공식을 사용하려고했습니다

world_vertice 멤버 변수. 괜찮아. 그러나, 내 주요 그리기 루프에서 벡터 BL, (0,0,0)에서 선을 그릴 및 선이 사각형 (지점 왼쪽 된 아래 구석에있는 지점에서 원으로 갈 것처럼 보인다) 세계 좌표의 기원을 중심으로

기본적으로 m_orientation이 커지면 (0,0,0) 세계 좌표계에서 큰 원이 그려집니다. 편집 : m_orientation = 360, 그것은 0

나는이 부분의 잘못을하고있는 중이 야 기분으로 다시 설정됩니다 때

t는 x 축에서 라디안 에서 측정 된 각도입니다.

아마도이 공식에서 m_orientation (직사각형 회전 각도)을 사용하지 않아도 될까요?

감사합니다.

편집 :이 작업을 수행하는 이유는 충돌 감지입니다. 직사각형의 좌표 (곧 강체가 될 좌표)가 충돌 감지를 위해 세계 좌표 장소에 있는지 알아야합니다. 당신이 무엇

답변

2

는 2d.It에 각도 Q 갖는 벡터의 회전 [특수 선형 변환 벡터의 길이를 유지하고, 원점 주위의 방향을 변경한다.

alt text

[선형 변환 : 첨가물 L (m + N) = L (m) + (N) L {M, N} € 벡터 균질 L (K하는 .m) =

당신은 두 조각으로 벡터를 분할 : 그래서 m의 € 벡터와 케이 € 스칼라] .L (m)를 케이. m [1, 0] + n [0, 1] = 당신의 벡터와 같습니다.이미지에 보이는 바와 같이 그런 다음 회전은 벡터 형태 찍은 후 것으로,이 두 가지에 이루어진다 :

m [cosQ, sinQ] + N [-sinQ, cosQ] = [m cosQ을 - N sinQ, m sinQ + N cosQ] 당신이 당신의 객체 좌표에 해당하는 좌표 눈을 얻으려고하는 경우

당신은 또한 당신은 당신의 객체 모델 뷰 행렬로 좌표를 곱해야 Wiki Rotation

볼 수 있습니다 OpenGL에서.

M => 모델 뷰 행렬

및 [xyzw]의 전치이 당신의 목적은 당신이 좌표입니다 :

M [xyzw] T = 눈이 [xyzw]의 좌표 T

+1

감사합니다. 나는 오늘 밤에 나중에 이것에 대해 연구 할 것이다! :) –

+0

OpenGL은 선형 대수 연산이 아닌 그래픽을 처리합니다. 그가 충돌 탐지를 위해 변형 된 좌표를 필요로한다면, 그것은 내 의견으로는 나쁜 조언이다. 그러나 좋은 설명을 위해 +1. OpenGL을 사용하여 실제 렌더링하는 동안 메쉬를 변형하는 경우 Z 축을 중심으로 회전해야합니다. –

1

이것은과 복잡함을 것 같다 물건 다소 : 일반적으로 개체의 세계 위치와 방향을 자체 로컬 좌표 집합과 별도로 저장합니다. 객체를 회전시키는 것은 모형 공간에서 수행되므로 위치는 변경되지 않습니다. 회전을하든하지 않든 각 좌표의 세계 위치는 동일합니다. 로컬 위치를 월드 위치에 추가하여 로컬 좌표를 월드 공간으로 변환합니다.

회전은 특정 원점에서 발생하며 일반적인 sin/cos 공식은 (0,0)이 원점이라고 가정합니다. 사용중인 좌표계가 현재 (0,0)을 원점으로 가지지 않는 경우, 좌표계가 원점으로 변환하고 회전을 수행 한 다음 다시 변환해야합니다. 보통 모델 공간은 (0,0)이 모델의 원점이되도록 정의되어이 단계를 사소하게 만듭니다.