2014-05-20 5 views
1

나쁜 제목에 대해 유감스럽게 생각하지만 다른 것을 생각할 수 없었습니다.우주선 주위에서 CannonBall을 어떻게 회전시킬 수 있습니까?

제가 설명 드리겠습니다 : 나는 2 척의 배를 가지고 있습니다. 충돌 세계의 배와 현실 세계의 배.

현실 세계의 우주선이 회전하고 있지만 충돌 세계에서 우주선을 회전시킬 수 없거나 우주선을 충돌 세계에서 우주선 주위로 회전시켜야합니다.

CannonBall이 우주선 근처에있을 때 CannonBall에서 우주선까지의 거리 (x, y, z의 경우)를 얻은 다음이를 충돌 지점 인 좌표의 삼중 배열과 비교합니다 (약 2000+) - 트리플 배열의 결과가 "1"이면 충돌합니다. 즉, 충돌 함은 움직이지 않지만 충돌 코드에서 CannonBall의 위치는 실제 우주선과 실제 캐논 볼까지의 거리와 같습니다.

여기에 문제가 있습니다. 우주선이 회전 한 경우 우주선이 회전 할 수 없기 때문에 우주선 주위에서 CannonBall을 회전시켜야합니다. 어떻게하면됩니까? 어떤 종류의 수학 공식? 참고 : Ship의 회전, x, y 및 z 좌표와 CannonBall의 x, y 및 z 좌표가 있습니다.

아무도 나에게 답을 줄 수 있다면 고마워!

편집 : 더 명확하게 말하십시오. 실제 세계에서 ship1은 ship2에서 CannonBall을 발사 할 수 있습니다. 내가 "배"라고 말하면 나는 ship2를 의미한다. CannonBall이 우주선에 가까워지면 충돌 확인을 원합니다. 이렇게하려면 (Physics world) array[CannonBall.distance(ship).x][CannonBall.distance(ship).y][CannonBall.distance(ship).z]이 "1"을 반환하는지 확인한 다음 충돌하면 충돌합니다. 그러나 많은 양의 프로세싱을하지 않고 배열을 변경할 수 없기 때문에 우주선의 회전을 변경할 수 없습니다. 따라서 나는 CannonBall을 회전시켜 우주선과 비교하여 CannonBall의 실제 회전에 상대적으로 회전시켜야합니다.

+0

우주선은 항상 같은 축을 중심으로 회전합니까, 또는 어느 방향 으로든 기울거나 피치/요일을 움직일 수 있습니까? – Kevin

답변

2

내가 맞으면, 움직일 수있는 다른 배를 향해 조준하기 위해 주위를 회전하는 캐논 볼이있는 (예 : 화면 중간에있는) 배가 있습니다. 그 모든 것을 3D로 (?). 그것이 당신이 의미하는 것이라고 가정하면, 여기에 답이 있습니다.) :

먼저 2 차원 공간에서 그렇게 할 수 있습니다. 먼저 필요한 것은 원을 계산하는 수식입니다. 함수는 각 x 값에 대해 하나의 y 값만 가질 수 있으므로 실제로는 두 개가 필요합니다. 가장 똑똑한 일은 아마도 캐논 볼이 고정 배에서 향하는 방향을 일반적인 360 °로 나누고 x와 y 좌표를 계산하는 수식을 가질 것입니다. 하나의 접근법은 원의 공식 (r은 반경 인 +/- r² = x² + y²)에서 작동 할 수 있지만 cos과 sin을 사용한 접근이 더 쉬울 것이라고 생각합니다. 따라서 : 각도를 입력하고 싶을 수 있습니다. 이 각도가 90 °이면 캐논 볼이 배의 오른쪽에 있습니다. 180 °는 배 밑에 있고, 270 °는 왼쪽, 0 °/360 °는 위입니다. 나는 그 입력을 받아 90 °를 추가하여 배의 왼쪽에서 시작할 수 있습니다. (코사인과 죄가 작동하려면 중요!). 우리가 지금 알고있는 것은 대포 공의 각도와 원의 반경입니다. 우주선의 중간 좌표를 알고 있다고 가정하면 우주선이 원점이되는 좌표계에서 자신을 상상할 수 있습니다. 이제 x를 계산해야합니다. 이것은 x = -cos^-1 (ANGLE) * radius로 수행 할 수 있습니다. 결과는 우주 좌표의 중간에서 빼야하는 x 좌표입니다. 그런 다음 x와 각도를 알고 있으면 y = x/tan-1 (ANGLE)을 계산할 수 있습니다. 원래 각도가 90 °보다 큰 경우 y 좌표에 -1을 곱해야합니다. 이 방법은 다음과 같습니다 결과는 대부분의 시간 정수 될 수 없습니다로

public void calculateCordinates(int degrees, int r){ 
    degrees = degrees+90; 
    while(degrees>=360){degrees=degrees-360;}//ensures that degree < 360° 
    double x; 
    double y; 
    x = Math.acos(Math.toRadians((double)degrees))*r; 
    y = x/Math.atan(Math.toRadians((double)degrees)); 
} 

좌표가 이중에있다. 원점 좌표에서 빼기 전에 int로 반올림하십시오.

3D에서이 작업을 수행하려는 경우 동일한 방법으로 y 좌표를 계산할 수 있습니다. 이번에는 입력 한 각도가 3 차원 각도이므로 "화면에서 오른쪽, 화면에서 오른쪽 귀로 보는 각도 등"(미안하지만 몰랐습니다. 더 잘 묘사하는 방법). 물론 그렇게 보일 것뿐만 아니라 하나에 방법을 결합 할 수 있습니다 :

public void calculateCordinates(int degrees, int degrees3D, int r){ 
    degrees = degrees+90; 
    while(degrees>=360){degrees=degrees-360;} 
    double x; 
    double y; 
    double z; 
    x = Math.acos(Math.toRadians((double)degrees))*r; 
    y = x/Math.atan(Math.toRadians((double)degrees)); 
    z = x/Math.atan(Math.toRadians((double)degrees3D)); 
} 

을 나는이 당신을 위해 무엇을 요구 희망, 그리고 나는 그것이 도움이되기를 바랍니다!

+0

더 쉽게 이해할 수 있도록 질문을 다시 씁니다. – Joehot200

관련 문제