2016-06-19 3 views
0

Я пытаюсь найти решение вопроса, заданного мной here. Я думаю, что я достиг этого решения, создав объект орбиты и вставив камеру в качестве дочернего объекта к этому.Как перемещать и объект, но держать дочерний объект в том же (мировом) месте

Я хочу, чтобы иметь возможность перемещать объект орбиты, но держите камеру в одном и том же месте. Я попробовал это;

this.orbit.position.add(travel); 
this.camera.position.sub(travel); 

Это прекрасно работает, пока не сделаю поворот. Тот факт, что мой объект орбиты будет иметь вращение вокруг оси Z (только Z), делает вещи (мир для локальных преобразований) тяжелым для меня. и вышеприведенный код, очевидно, перемещает мою камеру в неправильные местоположения.

Как исправить эту проблему?

ответ

1

Рад видеть, что вы решили, но я подумал, что это также может быть интересно для вас в том случае, если вещи получить более сумасшедшие -

я видел что-то в SceneUtils, которые могут иметь отношение - the attach/detach function. Таким образом, вы могли бы сделать что-то вроде того, что отделите их, сделайте все, что вы планируете делать независимо от родительских, а затем снова подключите их. Это хорошо, потому что вы все еще можете делать с родителями-y вещи между ними, но вы также можете создавать блоки, в которых они перемещаются в мировом пространстве, а затем снова подключаться без перехода ребенка в worldCoordinates между ними.

+0

Это то, что я искал в первую очередь. Функция, которая отделяла дочерние объекты, сохраняя ее глобальную позицию/вращение, но я не мог ее найти. Так вот, это ... Спасибо. Хотя я уже решил свою проблему, я принимаю это как реальный ответ за помощь и приветствую вас ... – Hasan

0

Так что я попытался преобразовать вектор пути с помощью quartenion из орбиты объекта:

this.orbit.position.add(travel);  
this.camera.position.sub(travel.applyQuaternion(this.orbit.quaternion)); 

он не работал ...

Поскольку я не был уверен, что quarternions в точности делают и вращение орбиты только вокруг оси Z это было довольно легко преобразовать вектор пути в локальных координатах следующим образом:

  this.orbit.position.add(t); 

      var angle = -this.orbit.rotation.z; 
      var x = t.x * Math.cos(angle) - t.y * Math.sin(angle); 
      var y = t.x * Math.sin(angle) + t.y * Math.cos(angle); 

      var t2 = new THREE.Vector3(x, y, t.z); 

      this.target.position.sub(t2); 

И это работает как шарм ...

Смежные вопросы