실제로 PointerLock이라는 라이브러리에 대한 Three.js 데모의 기존 코드 중 일부를 확인하여 해결책을 찾았습니다. 아이디어는 실제로 여러 객체를 서로 쌓는 것입니다. 가로로 움직이는 객체 (요 객체)로 시작하고, 세로로 이동하는 요 객체 (피치 객체) 안에 다른 객체를 배치 한 다음 실제 카메라를 피치 내에 배치합니다 목적.
그런 다음 바깥 쪽 개체 (요와 피치)를 해당 축을 따라 회전하므로 두 개체를 모두 회전 시키면 자체 수정됩니다. 예를 들어, y 축을 따라 y 축을 45도 회전 (오른쪽으로 돌림) 한 다음 피치를 45도 회전시켜 (아래로 돌리면) 피치가 이미 45도 각도로 내려갑니다 (Yaw가 이미 회전 한 상태에서 ). 위치.
카메라가 둘 다 안에 있다고 가정하면, 요와 피치가 지시하는 곳이면 어디든 가리킬뿐입니다. 또한 https://github.com/mrdoob/three.js/blob/acda8a7c8f90ce9b71088e903d8dd029e229678e/examples/js/controls/PointerLockControls.js
,이 종류의 치즈이지만,이 작은 비행기 만화 나 시각적 도움 : 여기
내가 참조 소스 코드의 코드
/*
* CAMERA SETUP
*
* Root object is a Yaw object (which controls horizontal movements)
* Yaw object contains a Pitch object (which controls vertical movement)
* Pitch object contains camera (which allows scene to be viewed)
*
* Entire setup works like an airplane with a
* camera embedded in the propellor...
*
*/
// Yaw Object
var yawObject = new THREE.Object3D();
// Pitch Object
var pitchObject = new THREE.Object3D();
// Camera Object
var camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
// Max Camera angles (in radians)
var minCameraRotX = 0.5;
var maxCameraRotX = 0.5;
var minCameraRotY = 1;
var maxCameraRotY = 1;
// Setup
yawObject.add(pitchObject);
pitchObject.add(camera);
scene.add(yawObject);
...
var rotateCamera = function(xRot, yRot, zRot){
yawObject.rotation.y += yRot;
pitchObject.rotation.x += xRot;
// Enforce X-axis boundaries (rotates around y-axis)
yawObject.rotation.y = Math.max(minCameraRotY, Math.min(maxCameraRotY, yawObject.rotation.y));
// Enforce Y-axis boundaries (rotates around x-axis)
pitchObject.rotation.x = Math.max(minCameraRotX, Math.min(maxCameraRotX, pitchObject.rotation.x));
}
여기
입니다 정확히 내 설정에서 무슨 일이 있었는지
시도해 봤어 : (오직 c 제한 각도가 아닌 경우 오전) if (camera.rotation.x maxCameraRotX) { camera.rotation.x = maxCameraRotX; } else if (xRot! = null && xRot! = undefined) { camera.rotateX (xRot); } –
x 축을 중심으로 90도 회전하는 고정 (y) 카메라 시스템에서 일반적으로 특수한 경우가 있습니다 (즉, 동일한 축을 구성하고 전달하므로 특수 처리가 필요함). 그것을 약 89 도로 제한하십시오. –
그래서 어느 시점에서 두 변종을 시도했지만 두 축 (특히 X와 Y)을 따라 회전했을 때 문제가 발생했습니다. 나는 곧 게시 할 솔루션을 찾았습니다 ... –