2016-05-07 2 views
0

У меня есть been told, что стандартный нормальный вектор для геометрии в трёх.js - (0, 0, 1).three.js: GridHelper делает нестандартную сетку?

Однако, когда я делаю экземпляр конструктора GridHelper, он создает плоскость, натянутую на оси X и Z. Такая плоскость имеет нормальный вектор (0, 1, 0).

Это можно увидеть на скриншоте, показывая вершины Arry геометрии моего GridHelper:

enter image description here

и подтверждается визуальным осмотром:

enter image description here

Этот как я создаю свой GridHelper:

var myGridHelper = new THREE.GridHelper(10, 20); 

Почему GridHelper не соответствует стандартным нормальным векторам?

Если эта функция/ошибка не изменится: Могу ли я решить ее всегда инициировании мои экземпляры GridHelper с этим кодом:

var standardPlaneNormal = new THREE.Vector3(0, 0, 1); 
var GridHelperPlaneNormal = new THREE.Vector3(0, 1, 0); 
var quaternion = new THREE.Quaternion(); 
quaternion.setFromUnitVectors(standardPlaneNormal, GridHelperPlaneNormal); 
var myGridHelper = new THREE.GridHelper(10, 20); 
myGridHelper.rotation.setFromQuaternion(quaternion); 

?

+0

Вы можете решить, что? Что ты пытаешься сделать? – WestLangley

+0

См. Это сообщение: https://msdn.microsoft.com/en-us/library/dn479430%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396 по умолчанию Трижды положительный Y - «вверх» –

+0

@ WestLangley Я хочу, чтобы все было повернуто в соответствии с моими ожиданиями .. :). Когда я создаю кватернион со стартовым вектором и конечным вектором, кватернион должен вращаться в соответствии с ними. Теперь, если я буду кормить '(0, 0, 1)' в качестве стартового вектора, он этого не сделает. Мое предложение добавить дополнительное вращение кватерниона, чтобы компенсировать это, было ошибочным. Я могу просто передать альтернативный (или истинный?) Стандартный вектор '(0, 1, 0)' в качестве стартового вектора для 'quaternion.setFromUnitVectors()'. Это заставляет вещи вращаться в соответствии с моими ожиданиями :) – loldrup

ответ

1

Если вы хотите использовать метод lookAt() с GridHelper, вам необходимо повернуть геометрию сетки, чтобы сетка лежала в плоскости XY вместо XZ-плоскости. Как только вы это сделаете, lookAt() будет работать так, как ожидалось.

var grid = new THREE.GridHelper(10, 2); 

grid.geometry.rotateX(Math.PI/2); 

var vector = new THREE.Vector3(1, 1, 1); 
grid.lookAt(vector); 

scene.add(grid); 

Three.js R.76

+0

Это потому, что стандартный вектор равен (0, 0, 1), и 'lookAt' поэтому ожидает, что вещи (плоскости) будут лежать на XY.plane? – loldrup

+1

Это потому, что 'lookAt()' вращает объект так, чтобы локальная положительная ось z объекта указывала в нужном направлении. Вы должны ориентировать свою геометрию так, чтобы она «смотрела» положительную ось z по умолчанию. Например, если ваш объект был автомобилем, вы бы ориентировали геометрию так, чтобы автомобиль стоял на положительной оси z. Тогда 'lookAt()' будет работать так, как ожидалось. – WestLangley

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