2016-09-20 4 views
0

При работе с X3D через X3Dom иногда я хотел бы динамически добавлять объекты. В качестве примера, я мог бы иметь функцию, как в следующем добавить строку:Добавление IndexedLineSet в X3Dom

function add_line(lineString) { 
    var lineString = lineString || random_line(); 
    var orbit = $("<shape></shape>"); 
    scene.append(orbit); 
    var indexedLineSet = $("<IndexedLineSet></IndexedLineSet>"); 
    orbit.append(indexedLineSet).attr('coordIndex', '0 1'); 
    var coordinate = $("<coordinate></coordinate>"); 
    coordinate.attr('point', lineString); 
    indexedLineSet.append(coordinate) 
} 

В этом коде scene это существующая X3D сцена, random_line это функция, которая генерирует строку, определяющую случайную строку, и я манипулировать сценой с помощью JQuery. При вызове функции при загрузке страницы она работает нормально. Однако при вызове функции в ответ на нажатие кнопки строка не появляется, хотя она добавляется в сцену.

Примечания:

  • Проблема, как представляется, зависит от типа объекта, я пытаюсь добавить. Сферы могут быть добавлены без каких-либо проблем.
  • Согласно инспектору Firefox, IndexedLineScene, кажется, правильно добавлен в сцену; он просто не отображается на изображении.

ответ

1

Если вы откроете консоль разработчика вы можете найти:

x3dom.js:3014 Uncaught TypeError: Cannot read property 'getPoints' of null_ 
buildGeometry @ x3dom.js:3014 
nodeChanged @ x3dom.js:3046 
x3dom.NodeNameSpace.setupTree @ x3dom.js:2744 
onNodeInserted @ x3dom.js:1100 
(anonymous function) @ jquery-1.12.4.min.js:3 
Ha @ jquery-1.12.4.min.js:3 
append @ jquery-1.12.4.min.js:3 
add_line @ IndexedLineSet-Test.html:76 
(anonymous function) @ IndexedLineSet-Test.html:90 
dispatch @ jquery-1.12.4.min.js:3 
r.handle @ jquery-1.12.4.min.js:3 

После расследования линии 76 исходного кода, вы обнаружите, что вы должны изменить порядок добавления точки и добавив индексы:

var indexedLineSet = $("<IndexedLineSet></IndexedLineSet>"); 
var coordinate = $("<coordinate></coordinate>"); 
coordinate.attr('point', lineString); 
indexedLineSet.append(coordinate); 
orbit.append(indexedLineSet).attr('coordIndex', '0 1'); 

это хорошо работает для вас на начальной загрузке, так как вы строите X3D перед тем X3DOM готов, проверьте, когда появляется этот вызов (после звонков на add_line был закончен):

x3dom.runtime.ready = function() { 
    console.log('ready'); 
}; 

Это значит, что все события и слушатели еще не настроены. Но позже, когда вы нажмете эту кнопку, X3DOM полностью инициализируется. Таким образом, он может прослушивать все события и запускать событие onNodeInserted сразу после добавления орбиты в сцену. Другим решением было бы, чтобы этот звонок прямо в конце вашей функции:

  1. Построить 3D объект полностью
  2. Добавить объект (орбиты) на сцену.
+0

Да, это похоже на это - спасибо! Любые мысли о том, почему исходная версия работала при загрузке, но не в ответ на нажатие кнопки? –

+0

Отредактировал свой ответ, чтобы отразить фоны, надеюсь, что это поможет лучше понять. – mistapink

+0

Важнейшей проблемой является то, что я перемещаю строку 'scene.append (orbit)' в конец функции 'add_line'. Или, как вы говорите, «Построить 3D-объект полностью». Я уже делал это в своей функции «add_sphere». Как ни странно, команда 'add_sphere' выглядит более уверенной в том, что я могу перемещать' scene.append (line) 'почти где угодно. Но основная идея построения 3D-объекта полностью имеет смысл. Еще раз спасибо! –

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