2016-12-12 5 views
0

three.js를 사용하여 y- 회전에 따라 특정 방향으로 이동하는 자동차로 게임을 만듭니다. 예는 90도입니다. 나는 앞으로 그들을 이동하는 object.translateZ()를 사용하지만 문제가 생겼어.Three.js에서 y- 회전을 재설정하도록 오브젝트 회전

나는 physijs를 사용하여 자동차를 시뮬레이션합니다. 서로 충돌하는 자동차는 충돌로 인해 y- 회전을 바꿀 수 있습니다. 도로에서 돌아올 때처럼 차가 원래 회전으로 천천히 회전 할 수있는 방법을 찾고 싶습니다. 이것이 없으면 나의 도시는 매우 혼란 스럽습니다.

여기 (이 그것의 한 부분입니다) 이미 사용하고 코드입니다 :

나는 그것이 목표 회전과 같은, 그래서 천천히 차의 회전을 변경할 수있는 방법을 찾아야 할
var targetRotation = 90 
var rotation = car.mesh.rotation.y * 180/Math.PI //to convert to degrees 

.

도움을 주시면 감사하겠습니다. (그러나 어떤 종류의 함수는 완벽 할 것입니다.)

답변

2

다른 시스템 (2D, Three.js가 아닌)에서이 작업을했는데 본질적으로 원하는 것은 도달 할 때까지 각도를 조금씩 늘리는 것입니다 닫기가 목표 각도로 가까이 있습니다. 보통 이것은 부동 소수점이 증가하는 회전 속도보다 작음을 의미합니다 (값을 "오버 슛"하지 않음).

증가량은 얼마나 빠르게 돌리 느냐에 달려 있습니다.

또한 360 ° 또는 0에 가까울 때 각도를 높이거나 낮추는 것이 더 좋은지 (시계 방향 또는 시계 반대 방향으로 돌리 느냐) 확인하고 싶습니다. 이렇게하면 차가 "먼 길" . 차이가 180보다 크거나 더 큰지 확인하면 알 수 있습니다.

모듈러스 연산자를 사용하여 -360/360 사이의 "실제"각도를 얻을 수 있습니다.

var currentAngle = car.mesh.rotation.y * 180/Math.PI; //car's angle in degrees 
var targetAngle = 90; //preferred angle *this time* ;) 
var turningSpeed = 1; //one degree per update (wayyy to high for real stuff, usually) 
currentAngle = currentAngle % 360; //get the 0-360 remainder 
if (Math.abs(targetAngle - currentAngle) >= turningSpeed) { 
    var addto = 0 
    if (targetAngle - currentAngle < 0) { 
    addto = 360 
    } 
    if (targetAngle - currentAngle + addto <= 180) { 
    currentAngle += turningSpeed; 
    } 
    else { 
    currentAngle -= turningSpeed; 
    } 
} 
else { currentAngle = targetAngle; } //we're close enough to just set it 
car.mesh.rotation.y = (currentAngle * Math.PI)/180; // back to radians! 
+0

와우! 정말 고마워! –

+0

현재 글리치가 눈치 챘다. 현재 각도가 0이고 목표 각도가 90 인 경우 -90으로 내려 가면 문제를 해결할 수 있습니까? –

+0

그래, 수학에 대해서 생각하고 있었고 선회에서 몇 가지 오류를 발견했다. 수식을 검사하기 위해 지금 범위를 매핑하고 있습니다. 내놔. – Hectate