Показать сообщение отдельно
  #6 (permalink)  
Старый 17.12.2016, 17:27
Новичок на форуме
Отправить личное сообщение для TCHProgrammer Посмотреть профиль Найти все сообщения от TCHProgrammer
 
Регистрация: 15.04.2012
Сообщений: 6

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