javascript - three.js - 射线相交和球体位置

标签 javascript html css three.js dom-events

我有一个管几何体场景,光线相交工作正常。在光线相交时,我会在光标旁边显示一个红色的小球体和一个工具提示。请找到没有标题的图像:

image without header

现在,如果我添加一个带有 div 元素的标题,射线相交会起作用,但问题是红色球体、工具提示和鼠标光标之间存在距离。请找到带标题的图片:

image with header

header、tool-tip div、sphere和collision detection函数的代码如下:

标题:

<div style="margin-top:10px;margin-left:3%;height:100px;width:70%">
  <label style="color:#b0bb02;font-size:14pt">three.js</label>
  <label style="color:#f5f7f9;font-size:14pt;font-weight:bold">Tube Geometry</label><br><br>               
</div>

工具提示 div:

textDiv = document.createElement( 'div' );          
            textDiv.style.position = 'absolute';
            textDiv.style.top = '50px';
            textDiv.style.margin = '8px';
            textDiv.style.border = '1px solid blue';
            textDiv.style.zIndex = '100';
            textDiv.style.background = '#ffffff';
            textDiv.style.display = 'block';
            container.appendChild( textDiv );

球体几何:

dot = new THREE.Mesh ( new THREE.SphereGeometry( 1, 12, 1 ), new THREE.MeshBasicMaterial( { color: 0xff0000 } ) );

碰撞检测:

var intersects;
        
        function detectCollision(event){
            
            var vector = new THREE.Vector3(( event.clientX / window.innerWidth ) * 2 - 1,- ( event.clientY / window.innerHeight ) * 2 + 1, 0.5 );
            
            /*var mouse_x =   ((event.pageX-event.target.offsetParent.offsetLeft) / renderer.domElement.width) * 2 - 1;
            var mouse_y = - ((event.pageY-event.target.offsetParent.offsetTop) / renderer.domElement.height) * 2 + 1;
            var vector = new THREE.Vector3(mouse_x, mouse_y, 0.5);*/
                
                projector.unprojectVector( vector, camera );
                var ray = new THREE.Raycaster( camera.position, vector.subSelf( camera.position ).normalize() );

                intersects = ray.intersectObjects( objects );                                   
                
                var pnt=0; var clickedMD = 0; var clickedDegree; var clickedTVD;
                
                if ( intersects.length > 0 ) {                  
                                                                            
                    dot.position.copy( intersects[0].point );
                    scene.add( dot );
                    
                    var fi = intersects[0].faceIndex;
                    pnt = Math.round(fi/11);                    
                    
                    clickedMD = pathObjColl[pnt].md;
                    clickedTVD = Math.round(pathObjColl[pnt].point.z);
                    clickedDegree = degrees[Math.round(fi%11)]; 
                    
                    // tooltip
                    var elem = document.getElementsByTagName("canvas");
                    var canvas = elem[0];
                    var x = event.pageX - canvas.offsetLeft ;
                    var y = event.pageY - canvas.offsetTop  ;
                    //console.log("X: "+x+" Y: "+y);
                    textDiv.style.top = y+"px";
                    textDiv.style.left = x+"px";                
                    textDiv.innerHTML = "&nbsp;Degree: "+clickedDegree+"<br/>&nbsp;MD: "+clickedMD+" ft<br/>&nbsp;TVD: "+clickedTVD+" ft";
                    if(textDiv.style.display == 'none'){
                        textDiv.style.display = 'block';    
                    }
                }
                
                else if(intersects.length == 0){
                    var textDivVis = textDiv.style.display;
                    console.log(textDivVis);
                    if(textDivVis == 'block'){
                        textDiv.style.display = 'none'; 
                    }
                    
                }
            
        }

demo on jsfiddle

如果我添加标题,为什么鼠标光标、球体几何体和太提示之间有距离?

最佳答案

textDiv 是绝对定位的吗?也许标题只是抛出页面布局和工具提示..试试这个:

textDiv.style.position = "absolute";

编辑:

嗯,事实上它是需要绝对定位的标题。否则它会移动 Canvas ,并且您在 HTML 中的鼠标位置与 webgl Canvas 中的鼠标位置不匹配。

或者,如果您不希望标题位于 Canvas 之上,则可以在计算鼠标位置时考虑容器位置。对于向量:

       var vector = new THREE.Vector3( 
                ( (event.pageX - container.offsetLeft) / window.innerWidth ) * 2 - 1, 
                - ( (event.pageY - container.offsetTop) / window.innerHeight ) * 2 + 1, 
                0.5 );

对于工具提示:

                textDiv.style.top = (container.offsetTop + y)+"px";
                textDiv.style.left = (container.offsetLeft + x)+"px";       

更新的 jsFiddle:http://jsfiddle.net/tje8y/

关于javascript - three.js - 射线相交和球体位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14440478/

相关文章:

javascript - 碰到 Canvas x 边框时向后移动一个圆圈

javascript - css 变换高度不起作用

javascript - 如何遍历收缩数组

css - 推特 Bootstrap : issue with img with class responsive

javascript - 如何检查父元素是div还是font并返回fontsize?

javascript - 如何根据条件将 DIV 滚动到浏览器窗口的顶部?

html - 制作菜单和子菜单。需要帮助将子菜单编码到菜单中,下拉菜单

javascript - 一键两个功能 - 计算和提交表单

CSS 类选择器

css - 如何将向导左右对齐?