3

特定の Three.js の問題に数日間苦労しましたが、それを行う方法が見つかりません。これは私の場合です:

1) いくつかの三角形の面で形成されたフローティング メッシュがあります。このメッシュは、getAttribute('position') を使用して頂点と面を取得した後、ローダーによって返されたジオメトリから作成されます。

ここに画像の説明を入力

2) 今やりたいことは、底面を床に対して「投影」することです。

ここに画像の説明を入力

3) 後で、この新しい面を追加して、両方の面の 3 つの頂点の間のスペースを埋める結果のメッシュを作成します。

ここに画像の説明を入力

ステップ 2 ですでに問題が発生しています... 新しい面を作成するには、その 3 つの頂点が既に geometry.vertices に追加されていると思われます。元の面の頂点を複製して、それを行いました。geometry.vertices.push() の結果を使用して新しいインデックスを知り、後でそのインデックス (-1) を使用して最終的に新しい面を作成します。しかし、その形は奇妙で、位置とサイズも奇妙です。私は世界/シーン/ベクトル位置等価理論を正しく理解していないと思います:P

これを適用してみましたが、うまくいきませんでした: three.js で頂点の絶対位置を取得するにはどうすればよいですか? Projection http://barkofthebyte.azurewebsites.net/post/2014/05/05/three-js-projecting-mouse-clicks-to-a-3d-scene-how-を使用して、Three.js でワールド座標をスクリーン座標に変換する やることと仕組み

元の面全体を直接複製してメッシュに追加すると、面が追加されますが、同じ位置にあるため、頂点を変更して床に配置することはできません (または少なくとも元の面を変更する必要はありません)。面の頂点!)。つまり、x、y、z プロパティを変更できますが、元のメッシュの寸法と一致しない非常に小さな測定値です。

誰かがこの概念を正しく理解するのを手伝ってくれますか?

編集:ソースコード

            // Create geometry
            var geo = new THREE.Geometry();
            var geofaces = [];
            var geovertices = [];

            original_geometry.updateMatrixWorld();

            for(var index in original_geometry.faces){          
                // Get original face vertexNormals to know its 3 vertices
                var face = original_geometry[index];
                var vertexNormals = face.vertexNormals;

                // Create 3 new vertices, add it to the array and then create a new face using the vertices indexes
                var vertexIndexes = [null, null, null];
                for (var i = 0, l = vertexNormals.length; i < l; i++) {
                    var vectorClone = vertexNormals[i].clone();
                    vectorClone.applyMatrix4( original_geometry.matrixWorld );
                    //vectorClone.unproject(camera); // JUST TESTING
                    //vectorClone.normalize(); // JUST TESTING

                    var vector = new THREE.Vector3(vectorClone.x, vectorClone.z, vectorClone.y)
                    //vector.normalize(); // JUST TESTING
                    //vector.project(camera); // JUST TESTING
                    //vector.unproject(camera); // JUST TESTING
                    vertexIndexes[i] = geovertices.push( vector ) - 1;
                }
                var newFace = new THREE.Face3( vertexIndexes[0], vertexIndexes[1], vertexIndexes[2] );
                geofaces.push(newFace);
            }

            // Assign filled arrays to the geometry
            geo.faces = geofaces;
            geo.vertices = geovertices;

            geo.mergeVertices();
            geo.computeVertexNormals();
            geo.computeFaceNormals();

            // Create a new mesh with resulting geometry and add it to scene (in this case, to the original mesh to keep the positions)
            new_mesh = new THREE.Mesh( geo, new THREE.MeshFaceMaterial(material) ); // material is defined elsewhere
            new_mesh.position.set(0, -100, 0);
            original_mesh.add( new_mesh );
4

2 に答える 2