three.js вращение камеры вокруг объекта
В примерах есть подобный код:
camera.position.x = (Math.cos(timer) * 2000); camera.position.z = (Math.sin(timer) * 2000); camera.lookAt(object.position); Он позволяет вращать камеру вокруг одной оси, но не той которой нужно, как исправить положение? |
camera.position.x = (Math.cos(timer) * 2000); camera.position.z = (Math.sin(timer) * 2000); ну дык ты ж меняешь положение камеры у осей X и Z, выставь нужную ось (или оси) и будет тебе счастье. например camera.position.y = (Math.cos(timer) * 2000); camera.position.z = (Math.sin(timer) * 2000); |
Может это особенность движка, но в этом случае, он исчезает и появляется по другую сторону оси, зеркально отображенный
|
куда более вероятно что ты просто камеру перевернул)
|
Собственно поэтому и обратился на форум, что не нашел вменяемой документации по параметрам камеры.
Отдельно вращение камеры есть camera.rotation.set(4.71238898, 0, 0);но оно не работает вместе с camera.lookAt(object.position); |
Вращение объекта по вертикали и по горизонтали обходом камеры вокруг него
function angleDecade(angle){
if(angle >= 0 && angle <= 3.1416/2){
return 1;
} else if(angle > 3.1416/2 && angle <= 3.1416){
return 2;
} else if(angle > 3.1416 && angle <= 3.1416*1.5){
return 3;
} else {
return 4;
}
}
function angleTo2PiRange(angle){
while(angle < 0){
angle += 2*3.1416;
}
var count = Math.floor(angle/(2*3.1416));
angle = angle - count*(2*3.1416);
if(angleDecade(angle) == 1){
var sin = 1;
var cos = 1;
} else if(angleDecade(angle) == 2){
var sin = 1;
var cos = -1;
} else if(angleDecade(angle) == 3){
var sin = -1;
var cos = -1;
} else {
var sin = -1;
var cos = 1;
}
return {angle:angle,sin:sin,cos:cos,decade:angleDecade(angle)}
}
function setCameraPositionOnVerticalRotation(radius,angle_inc_z){
angle_z += angle_inc_z;
var angle = angleTo2PiRange(angle_z);
angle_z = angle.angle;
/* Если Вы хотите ограничить вращение по вертикали от 0 до 180%
if(angle.cos < 0){
angle_z -= angle_inc_z;
return;
}
*/
camera.position.z = radius * Math.cos(angle_z) /** angle.cos*/ + objectCenter.z;
camera.position.y = radius * Math.sin(angle_z) /** angle.sin*/ + objectCenter.y;
//camera.position.x = objectCenter.x;
camera.lookAt(new THREE.Vector3(objectCenter.x,objectCenter.y,objectCenter.z));
if(angle.sin < 0){
camera.rotation.z = 3.1416*2;
} else {
camera.rotation.z = 0;
}
//camera.lookAt(new THREE.Vector3(objectCenter.x,objectCenter.y,objectCenter.z));
}
function setCameraPositionOnHorisontalRotation(radius,angle_inc_x){
angle_x += angle_inc_x;
var angle = angleTo2PiRange(angle_z);
//angle_x = angle.angle;
camera.position.x = radius * Math.cos(angle_x) /** angle.cos*/ + objectCenter.x;
camera.position.z = radius * Math.sin(angle_x) /** angle.sin*/ + objectCenter.z;
//camera.position.x = objectCenter.x;
camera.lookAt(new THREE.Vector3(objectCenter.x,objectCenter.y,objectCenter.z));
if(angle.sin < 0){
//camera.rotation.x = 3.1416*2;
} else {
//camera.rotation.x = 0;
}
//camera.lookAt(new THREE.Vector3(objectCenter.x,objectCenter.y,objectCenter.z));
}
Последние 2 метода вызывают вращение на угол inc_angle_*(z или x), при этом первоначально должно быть вот так: var angle_x = 0; var angle_y = 0; var angle_z = 0; objectCenter - это относительно какого центра вращать камеру. |
Вращение камеры вокруг объекта по вертикали и по горизонтали
Да, кстати, последние 2 функции надо изменить:
function setCameraPositionOnVerticalRotation(radius,angle_inc_z){
angle_z += angle_inc_z;
var angle = angleTo2PiRange(angle_z);
if(angle.cos < 0){
angle_z -= angle_inc_z;
return;
}
angle_z = angle.angle;
camera.position.z = radius * Math.cos(angle_z) + objectCenter.z;
camera.position.y = radius * Math.sin(angle_z) + objectCenter.y;
//camera.position.x = objectCenter.x;
camera.lookAt(new THREE.Vector3(objectCenter.x,objectCenter.y,objectCenter.z));
/*
if(angle.cos < 0){
camera.rotation.z = 3.1416*2;
} else {
camera.rotation.z = 0;
}
*/
//camera.lookAt(new THREE.Vector3(objectCenter.x,objectCenter.y,objectCenter.z));
}
function setCameraPositionOnHorisontalRotation(radius,angle_inc_x){
angle_x += angle_inc_x;
var r = radius * Math.cos(angle_z);
var angle = angleTo2PiRange(angle_x);
//angle_x = angle.angle;
camera.position.x = r * Math.cos(angle_x) + objectCenter.x;
camera.position.z = r * Math.sin(angle_x) + objectCenter.z;
//camera.position.x = objectCenter.x;
camera.lookAt(new THREE.Vector3(objectCenter.x,objectCenter.y,objectCenter.z));
}
|
| Часовой пояс GMT +3, время: 17:29. |