1

Three.js STLLoader を使用して、STL ファイルからジオメトリを読み取ってキャッシュしようとしています。イベント ループ コールバックを使用してデータを取得しています (STLLoader の例と同様)。外部変数「cgeom」に格納するつもりです。ただし、ジオメトリはイベント CB の外では使用できず、cgeom が定義されていないようです (実行時エラー: cgeom が定義されていません)。

<!DOCTYPE html>

<html>
<head>
    <title>Thee.js STL geometry caching test</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
</head>

<body>

    <script src="js/three.min.js"></script>
    <script src="js/STLLoader.js"></script>
    <script>

        alert("We'are here");

        var cgeom;

        function load_geometry( stl_file ) {

            var loader = new THREE.STLLoader();     
            loader.addEventListener( 'load', function ( event ) {
            cgeom = event.content;
                alert('inside listener - vertices: ' + cgeom.vertices.length);
            } );
            loader.load(stl_file);
            alert('inside load_geometry - vertices: ' + cgeom.vertices.length); // error - cgeom is not defined
        }

        load_geometry('./data/a90.stl');     
        alert('inside load_geometry - vertices: ' + cgeom.vertices.length); // error - cgeom is not defined

    </script>

</body>
</html>

すべての例は、ジオメトリからメッシュを作成し、すぐにシーンに追加します。それは私がしたいことではありません。シーン内の別のメッシュを置き換えるために、後で追加する必要があります。そのため、最初にキャッシュしたいと思います。

前もってありがとう、サイモン

PS 私は JS の専門家ではありませんが、10 年以上の C++ と Java の経験があります。

4

4 に答える 4

0

cgeomイベントハンドラーが実行された後にのみ値を持ちます。これを除いて、すべてのコードがすぐに実行されます。

       loader.addEventListener( 'load', function ( event ) {
           cgeom = event.content;
            alert('inside listener - vertices: ' + cgeom.vertices.length);
        } );

したがって、ジオメトリを使用する前に、ジオメトリがロードされる (このコールバックが実行される) まで待つ必要があります。

于 2013-05-16T16:12:34.493 に答える
0

すぐにシーンに追加する必要はありませんが、外部オブジェクトに追加できます。したがって、ローダーの前に次のことができます。

var geometriesToLoad = 2;
var geom1 = new THREE.Object3D ();
var geom2 = new THREE.Object3D ();

コールバックでは、次のようにします。

geom.add (cgeom);
geometriesToLoad --;

ルーチンgeomに渡す追加の vaiable はどこにありますか。load_geometry()geom1 または geom2 のいずれか。

geometriesToLoad0 の場合、すべてのモデルがロードされ、処理を続行できます。setTimeout 呼び出しで確認できます。

于 2013-05-16T17:34:50.540 に答える