2016-03-22 2 views
0

У меня есть эта три Js сцена: http://codepen.io/giorgiomartini/pen/ZWLWgXПочему выглядит не глядя на указанный вектор?

Сцена содержит 5 вещей:

камеры - Не Visible

Ориген (3D вектора) - на 0,0,0.

objOne - зеленый

objParent - Красный

CenterOfscene - Синий

objOne является дочерним objParent. И ObjOne выглядит Origen, который является 3d-вектором в 0,0,0.

Но objOne вместо того, чтобы смотреть на 0,0,0. где вектор начала есть, Он смотрит на objParent ....?

Есть идеи?

То, что я хочу, это objOne посмотреть на 0,0,0. Который является вектором происхождения.

Любые идеи, почему это плохо? Благодарю.

THREE.SceneUtils.detach(objOne, objParent, scene); 
THREE.SceneUtils.attach(objOne, scene, objParent); 

var origen = new THREE.Vector3(0, 0, 0); 

var render = function() { 
    objOne.lookAt(origen); 
    requestAnimationFrame(render); 

    xOffset += 0.01; 
    yOffset += 0.011; 
    zOffset += 0.012; 

    xOffsetParent += 0.0011; 
    yOffsetParent += 0.0013; 
    zOffsetParent += 0.0012; 

    camXPos = centeredNoise(-1,1,xOffset); 
    camYPos = centeredNoise(-1,1,yOffset); 
    camZPos = centeredNoise(-1,1,zOffset); 
    objOne.position.x = camXPos*4; 
    objOne.position.y = camYPos*4; 
    objOne.position.z = camZPos*4; 

    camParentXPos = centeredNoise(-1,1,xOffsetParent); 
    camParentYPos = centeredNoise(-1,1,yOffsetParent); 
    camParentZPos = centeredNoise(-1,1,zOffsetParent); 
    objParent.position.x = camParentXPos*10; 
    objParent.position.y = camParentYPos*10; 
    objParent.position.z = camParentZPos*10; 

    renderer.render(scene, camera); 
}; 

render(); 

ответ

2

Object3D.lookAt() не поддерживает объекты с повернутым и/или переведенным родителем (ей).

Ваш рабочий процесс состоит в том, чтобы (1) добавить ребенка в качестве потомка сцены, и (2) заменить дочерний объект на манекен Object3D, который в качестве дочернего элемента родительского объекта будет перемещаться с родителем.

Тогда в вашей визуализации цикла,

child.position.setFromMatrixPosition(dummy.matrixWorld); 
child.lookAt(origin); 

Three.js R.75

+0

Ну, в конце концов, ObjOne будет камерой ... камера также не поддерживает объекты LooAt с повернутыми и/или переведенными родителями? – GiorgioMartini

+0

Объект, делающий вид, не должен иметь повернутого/переведенного родителя. Камеры, у которых нет родителя или являются дочерними элементами сцены, напрямую поддерживают 'lookAt()'. – WestLangley

+0

Спасибо, но мне нужно, чтобы ObjOne был дочерним по отношению к родительскому объекту, так что в то время как родительский объект ObjectParent имеет гладкий шум perlin, который замедляет большие расстояния, objOne имеет еще один шум perlin, который немного быстрее. Есть ли способ с текущей настройкой (при условии, что objOne - это камера), чтобы смотреть на вектор? Или есть еще один простой способ добавить этот тип движения камеры (например, движение коричневого цвета), чтобы камера все еще была дочерью сцены? – GiorgioMartini

0

Вот исправленные codepen: http://codepen.io/anon/pen/oxGpPQ?editors=0010

Теперь зеленый диск едет вокруг своего родителя (красная сфера) при просмотре синего диска (или вектора «origen»).

Uncomment lines 163 и 164, чтобы камера находилась на месте зеленого диска и чтобы камера также смотрела на синий диск (вектор «origen»), пока он вращает свою родительскую красную сферу.

Как осуществить это: 1. делают родительская Red Mesh 2. сделать dummyChild Object3D (это невидимый математический объект) 3. делают ребенка Зеленый Mesh 4. делают Ориген centerOfScene Синий Mesh 5. приложить родительский, дочерний и centerOfScene для Сцена (не dummyChild, хотя) 6. Прикрепить dummyChild к родительскому, например: parent.add (dummyChild);

В функции рендера: 1. Переместите родительский элемент вокруг с функцией шума (что смещает dummyChild) 2.Переместите dummyChild с другой функцией шума (которая вращается вокруг своего родительского положения, центр мира dummyChild - это положение его красного родителя) 3. Придерживайте зеленую дочернюю сетку везде, где находится невидимая фиктивная кукла. Но поскольку dummyChild компенсируются красным родителем, мы должны получить его мировые координаты в отношении сцены, а не ее координаты в мире красного цвета, поэтому мы используем

child.setFromMatrixPosition(dummyChild.matrixWorld); 

Обрати внимание его matrixWorld и не матрица - матрица имеют свою локальную систему и matrixWorld держит его скоординированным относительно Системы координат Сцена или Мира. 4. Используйте lookAt, чтобы сделать зеленый дочерний диск «lookAt» синей средой centerOfScene, которая находится на векторе начала или в центре сцены.

Надеюсь, это поможет! :)

+0

Спасибо ! Но это не значит, что я ищу. Если вы видите исходную сцену: http://codepen.io/giorgiomartini/pen/ZWLWgX, вы можете видеть, как родитель (красный объект) перемещается, а ребенок (зеленый объект) следует за красным объектом, но также имеет свое движение . Все это прекрасно ... зеленый объект движется независимо. Но все же движется с красным объектом. Мне нужен только зеленый объект, чтобы посмотреть на происхождение мира, где есть 3dvector, называемый origen. Прямо сейчас на вашем ручке зеленый объект движется, но больше не следит за красным объектом. – GiorgioMartini

+0

Ahh, хорошо, я получил его, как вы хотите сейчас. Посмотрите на мой новый ответ выше – erichlof

+0

@GiorgioMartini Я обновил ответ выше, надеюсь, код теперь работает на вас :-) – erichlof

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