Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.10.2013, 17:25
Новичок на форуме
Отправить личное сообщение для ppavelstn Посмотреть профиль Найти все сообщения от ppavelstn
 
Регистрация: 16.10.2013
Сообщений: 3

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

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

Он позволяет вращать камеру вокруг одной оси, но не той которой нужно, как исправить положение?
Ответить с цитированием
  #2 (permalink)  
Старый 16.10.2013, 17:27
Аватар для keen
Профессор
Отправить личное сообщение для keen Посмотреть профиль Найти все сообщения от keen
 
Регистрация: 28.03.2012
Сообщений: 376

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);
Ответить с цитированием
  #3 (permalink)  
Старый 16.10.2013, 17:34
Новичок на форуме
Отправить личное сообщение для ppavelstn Посмотреть профиль Найти все сообщения от ppavelstn
 
Регистрация: 16.10.2013
Сообщений: 3

Может это особенность движка, но в этом случае, он исчезает и появляется по другую сторону оси, зеркально отображенный
Ответить с цитированием
  #4 (permalink)  
Старый 16.10.2013, 17:36
Аватар для keen
Профессор
Отправить личное сообщение для keen Посмотреть профиль Найти все сообщения от keen
 
Регистрация: 28.03.2012
Сообщений: 376

куда более вероятно что ты просто камеру перевернул)
Ответить с цитированием
  #5 (permalink)  
Старый 16.10.2013, 17:40
Новичок на форуме
Отправить личное сообщение для ppavelstn Посмотреть профиль Найти все сообщения от ppavelstn
 
Регистрация: 16.10.2013
Сообщений: 3

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

Отдельно вращение камеры есть
camera.rotation.set(4.71238898, 0, 0);
но оно не работает вместе с
camera.lookAt(object.position);
Ответить с цитированием
  #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 - это относительно какого центра вращать камеру.
Ответить с цитированием
  #7 (permalink)  
Старый 18.12.2016, 07:34
Новичок на форуме
Отправить личное сообщение для TCHProgrammer Посмотреть профиль Найти все сообщения от TCHProgrammer
 
Регистрация: 15.04.2012
Сообщений: 6

Вращение камеры вокруг объекта по вертикали и по горизонтали
Да, кстати, последние 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));
					
					
					
					
					
			}
Ответить с цитированием
  #8 (permalink)  
Старый 19.12.2016, 05:26
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

TCHProgrammer, неужели в three.js нет элементарного метода для вращения камеры?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли получить имя экземпляра объекта внутри самого объекта? Ichigeki Общие вопросы Javascript 9 14.11.2008 19:00