Javascript-форум (https://javascript.ru/forum/)
-   Библиотеки/Тулкиты/Фреймворки (https://javascript.ru/forum/library-toolkit-framework/)
-   -   three.js вращение камеры вокруг объекта (https://javascript.ru/forum/library-toolkit-framework/42196-three-js-vrashhenie-kamery-vokrug-obekta.html)

ppavelstn 16.10.2013 17:25

three.js вращение камеры вокруг объекта
 
В примерах есть подобный код:

camera.position.x = (Math.cos(timer) * 2000);
camera.position.z = (Math.sin(timer) * 2000);
camera.lookAt(object.position);

Он позволяет вращать камеру вокруг одной оси, но не той которой нужно, как исправить положение?

keen 16.10.2013 17:27

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);

ppavelstn 16.10.2013 17:34

Может это особенность движка, но в этом случае, он исчезает и появляется по другую сторону оси, зеркально отображенный

keen 16.10.2013 17:36

куда более вероятно что ты просто камеру перевернул)

ppavelstn 16.10.2013 17:40

Собственно поэтому и обратился на форум, что не нашел вменяемой документации по параметрам камеры.

Отдельно вращение камеры есть
camera.rotation.set(4.71238898, 0, 0);
но оно не работает вместе с
camera.lookAt(object.position);

TCHProgrammer 17.12.2016 17:27

Вращение объекта по вертикали и по горизонтали обходом камеры вокруг него
 
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 - это относительно какого центра вращать камеру.

TCHProgrammer 18.12.2016 07:34

Вращение камеры вокруг объекта по вертикали и по горизонтали
 
Да, кстати, последние 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, время: 09:09.