2016-09-20 12 views
0

X3DomでX3Dを操作するとき、オブジェクトを動的に追加したいことがあります。 random_lineはランダムなラインを定義する文字列を生成する関数で、このコードでX3DomでIndexedLineSetを追加する

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シーンがある、と私:一例として、私は行を追加するには、次のような機能を持っているかもしれません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'); 

それはX3DOMの準備が整う前に、X3Dを構築するため、このコールが表示されたら、(add_lineへのあなたの呼び出しが終了した後で)確認し、初期負荷であなたに適しています:

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

これは、すべてのイベントとリスナーがまだセットアップされていないことを意味します。しかし、後でそのボタンをクリックすると、X3DOMは完全に初期化されています。したがって、すべてのイベントを聴くことができ、シーンに軌道を追加した直後にonNodeInsertedイベントを発生させることができます。別の解決策は、右のあなたの関数の最後に、このコールを持っているだろう:

  1. が完全
  2. は、シーンにオブジェクト(軌道)を追加3Dオブジェクトを構築します。
+0

はい、それはそうです - ありがとう!元のバージョンがロード時に機能した理由は何ですか?ボタンプッシュに応答しない理由は何ですか? –

+0

バックグラウンドを反映するために私の答えを編集しました。これがより良い理解に役立つことを願っています。 – mistapink

+0

重要な問題は、 'scene.append(orbit)'行を 'add_line'関数の最後に移動することです。または、あなたが言うように、 "3Dオブジェクトを完全に構築する"。私はすでに 'add_sphere'関数でそれをやっていました。不思議なことに、 'add_sphere'コマンドは、ほとんどどこでも' scene.append(line) 'を動かすことができるという点でより頑強に見えます。しかし、3Dオブジェクトを完全に構築するという基本的な考え方は、大変意味があります。再度、感謝します! –

関連する問題