2009-05-03 2 views
2

현재 JOGL을 사용하여 첫 FPS 게임을 디자인하고 있습니다. (OpenGL 용 Java 바인딩).OpenGL 충돌 감지

지금까지 '월드'(일련의 큐브)와 플레이어 모델을 생성 할 수있었습니다. 플레이어와 큐브 사이의 충돌 감지 기능이 뛰어납니다.

이제 총을 추가하려고합니다. 총 모델을 올바르게 그려서 플레이어 모델에로드했습니다. 구현하고자하는 첫 번째 총은 당신이 목표로하고있는 곳에서 레이저를 발사하고 즉각적인 가시선 레이저를 발사하는 레이저 총입니다. 적 모델을 구현하기 전에 레이저와 벽 사이의 충돌 감지 기능을 원합니다.

내 레이저는 현재 일련의 작은 큐브에 의해 그려집니다. 첫 번째 큐브는 플레이어 총의 끝에 그려지고, 그 다음부터 계속해서 그립니다. 아이디어는 세계의 큐브와 같은 무언가로 충돌이 감지 될 때까지 레이저의 큐브를 계속 그리는 것이 었습니다.

전 세계에서 큐브의 위치를 ​​알고 있습니다. 문제는 문자 모델을 그리기 위해 glMatrixPush를 호출해야한다는 것입니다. 그런 다음이 모델 뷰 내에서 레이저가 그려집니다. 제가 옛 좌표계를 잃어버린 것을 의미합니다. 그래서 저는 한 시스템에서 세계를 그리고 나서 다른 시스템에서 세계를 끌어들입니다. 이 플레이어 매트릭스 내에서 glRotate와 glTranslate를 여러 번 호출하여 카메라가 회전하는 방식과 모든 것을 동기화합니다. lazer는이 새로운 시스템의 z 축을 따라 변환하여 만들어집니다.

내 문제는 이러한 변환을 통해 카메라가 관련된 회전으로 인해지도 좌표계에 레이저가있는 곳을 더 이상 알 수 없습니다.

누구든지이 문제를 해결하는 방법에 대해 알고 있거나 아이디어가 있습니까? 저는 레이저의 새로운 좌표를지도의 이전 좌표로 변환 할 방법이 필요하다고 생각합니다. 그러나 완료된 모든 변환을 취소하는 방법을 모르겠습니다. OpenGL에서 제공하는 일부 기능을 사용하여 이러한 유형의 문제를 처리 할 수도 있습니다.

답변

3

첫 번째 대답에서 만들어진 점은 개체를 처음 배치 할 때 행렬에 의존해서는 안된다는 것입니다. 레이저를 그리기 전에 레이저의 위치와 회전을 추적해야합니다. 그런 다음 translate 및 rotate 명령을 사용하여 필요한 위치에 놓습니다.

당신은 행렬 수학을해야한다는 것을 의미합니다. 예를 들어 ModelView 행렬 만 OpenGL에서 유지하기 때문에 OpenGL은이를 추적하지 않습니다. 개체 위치에 관한 추적. OpenGL에는 "세계 공간"또는 "카메라 공간"개념이 없습니다. 모든 입력에 곱해진 행렬 만 있습니다. 우아하게 간단합니다 ... 그러나 어떤 경우에는 DirectX가 별도의 뷰 매트릭스와 모델 매트릭스를 갖는 방식을 선호합니다.

따라서 수학 계산없이 객체의 위치를 ​​모를 경우 근본적인 설계 문제라고 생각합니다. 이 필요하지 않으면 개체 위치를 알기 위해이 필요합니다. 그러나 마음의 내용을 매트릭스 변환해야합니다. 그러나 위치가 필요한 경우 으로 시작해야합니다.

는 (거의 첫 번째 대답은 ... 단지 다른 방법으로, 말씀)의 응답

+0

+1 당신이 문제의 일부를 내가했던 것보다 더 잘 설명했다고 생각합니다 :) – Trillian

4

레이저는 레이저를 발사하는 캐릭터의 우주적인 자식으로 생각하지 않아야합니다. 자신이 해고되면, 레이저 자체의 기관이기 때문에 다음과 같이 렌더링해야합니다

glPushMatrix(viewMatrix); 
glPushMatrix(playerMatrix); 
DrawPlayer(); 
glPopMatrix(); 
glPushMatrix(laserMatrix); 
DrawLaser(); 
glPopMatrix(); 
glPopMatrix(); 

는 또한, 당신은 게임 로직으로 렌더링 변환 로직을 혼합하지 않도록해야합니다. 현재 OpenGL 행렬 스택에 상관없이 교차로를 테스트 할 수 있으려면 항상 객체의 월드 - 공간 위치를 저장해야합니다.

우주 부모/자식 관계에주의해야합니다. 실제로는 빈번하지 않습니다. 자세한 내용은 Google의 장면 그래프 문제를 참조하십시오.

+0

감사합니다 - 나는 약간 변경 한 나는 지금 자신의 매트릭스에서 레이저를 렌더링하고 있습니다. 새로운 물체의 세계 공간 위치를 저장하는 표준 또는 좋은 방법이 있습니까? 예를 들어 - 이미 내 viewMatrix와 내 playerMatrix를 밀어 넣었으므로 언제든지 내 laserMatrix를 밀어 넣을 때마다 그 공간이 어디에 있는지 알 수 있습니까? –

+0

여기를 잘 모르겠다. 'glGetFloatv (GL_MODELVIEW_MATRIX)'는 필요한 경우 현재 행렬을 검색 할 수 있지만 레이저 엔티티 클래스는 그 값을 저장해야하기 때문에 항상 월드 공간에서의 레이저 위치를 알아야합니다. 레이저의 변환 행렬은 월드 공간 위치에서 계산되어야합니다. 다시 한번, 현재 OpenGL 행렬 스택 상태가 월드 공간에서 엔티티를 찾는 데 영향을 주어서는 안됩니다. – Trillian

+0

그래서 내 개체의 세계 공간 좌표를 저장하기 위해 glRotate 또는 glTranslate와 같은 것을 호출 할 때마다 역행렬을 곱한 행렬 계산을 수행하여 세계 공간 좌표를 추적해야합니다 ? OpenGL이 그 자체를 추적하지 않는 것이 이상하게 보입니다. –