簡體   English   中英

Three.js Raycaster未檢測到場景網格

[英]Three.js Raycaster not detecting scene mesh

我在Chrome版本35.0.1916.153 m中使用three.js r67

我試圖與我在場景中創建的一些自定義網格相交。 盡管它們存在於scene.children中,但射線廣播程序似乎並未注冊該網格。

網格創建代碼:

if (modelVertices != null && modelVertices.length >= 3) {
            triangles = THREE.Shape.Utils.triangulateShape ( modelVertices, holes );

            for( var i = 0; i < triangles.length; i++ ){

               modelGeometry.faces.push( new THREE.Face3( triangles[i][0], triangles[i][2], triangles[i][2] ));

                }

            modelGeometry.computeFaceNormals();
            var modelMesh = new THREE.Mesh(modelGeometry, material);
            modelMesh.material.side = THREE.DoubleSide;
            polyhedralzGroup.add(modelMesh)
    }

射線廣播代碼:

                var projector = new THREE.Projector();
                projector.unprojectVector( vector, camera );

                var raycaster = new THREE.Raycaster( camera.position, vector.sub( camera.position ).normalize() );
                //console.log("Work");
                // See if the ray from the camera into the world hits one of our meshes

                var intersects = raycaster.intersectObjects( scene.children, true );
                helper.position.set( 0, 0, 0 );
                //console.log(intersects.length);
                if ( intersects.length > 0 ) {  
                    if (intersects[ 0 ].face != null) {
                    helper.lookAt( intersects[ 0 ].face.normal );
                    helper.position.copy( intersects[ 0 ].point ); 
}

如代碼中一樣,我正在使用computeFaceNormals(); 所以這不是問題(請參閱此處 )。 奇怪的是,場景似乎與我使用簡單三角形構造的其他幾何形狀相交 (即不使用THREE.Shape.Utils.triangulateShape;只是手動推動三角形頂點和面),這完全意味着沒有考慮到這一點相交的畫布偏移量。 我已經檢查了這兩種幾何形狀,並且兩者之間似乎沒有任何根本區別。

對象不相交的示例

是否有人對問題可能有什么想法?

問題與頂點的構造方式有關:使用字符串。 盡管three.js允許您構造頂點(以及幾何圖形和網格),並依次使用字符串顯示幾何圖形,但它不允許您使用這些頂點進行光線投射。 更簡潔地說,問題可以簡化為:

改變這個:

aVertex = new THREE.Vector3( part[0], part[1] , part[2] );

對此:

aVertex = new THREE.Vector3( parseFloat(part[0]), parseFloat(part[1]) , parseFloat(part[2]) );

我不確定這是錯誤還是功能,因為使用字符串格式的頂點時似乎不會引發任何錯誤,盡管您無法對具有字符串頂點幾何形狀的對象進行光線投射(可能是因為法線無法計算?)。

您的問題是您將scene.children傳遞給了射線發生器。

 var intersects = raycaster.intersectObjects( scene.children, true );

解決方案1.將模型加載到對象中

var objects = [];

objects.push(mesh);

接着

var intersects = raycaster.intersectObjects( objects, true );

解決方案1。

在第二個場景中傳遞您的對象,並將其傳遞給您的光線投射器

var scene_2

scene_2 = new THREE.Scene();
scene.add(scene_2);
scene_2.add(mesh);

var intersects = raycaster.intersectObjects( scene_2, true );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM