Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用three.js测量STL文件点之间的距离_Javascript_Three.js_3d_Stl Format - Fatal编程技术网

Javascript 使用three.js测量STL文件点之间的距离

Javascript 使用three.js测量STL文件点之间的距离,javascript,three.js,3d,stl-format,Javascript,Three.js,3d,Stl Format,我试图让用户点击两个不同的点,并获得它们之间的距离 咔哒声似乎是在随机位置发生的,因此计算是错误的 当使用OBJ加载器并且我们使用OBJ文件时,计算是正确的,但是如果我使用STL加载器使用STL文件,它只会显示不正确 代码笔链接: JS代码: <script type="text/javascript" src="https://dl.dropboxusercontent.com/s/qooungyrgltucai/three.js"></script> <scri

我试图让用户点击两个不同的点,并获得它们之间的距离

咔哒声似乎是在随机位置发生的,因此计算是错误的

当使用OBJ加载器并且我们使用OBJ文件时,计算是正确的,但是如果我使用STL加载器使用STL文件,它只会显示不正确

代码笔链接:

JS代码:

<script type="text/javascript" src="https://dl.dropboxusercontent.com/s/qooungyrgltucai/three.js"></script>
<script type="text/javascript" src="https://dl.dropboxusercontent.com/s/ddt89ncslm4o7ie/Detector.js"></script>
<script type="text/javascript" src="https://dl.dropboxusercontent.com/s/mrhumrr2bxwt9nt/OBJLoader.js"></script>
<script type="text/javascript" src="https://dl.dropboxusercontent.com/s/n5sjyymajykna51/TGALoader.js"></script>
<script type="text/javascript" src="https://dl.dropboxusercontent.com/s/y4r5bmq2037jacg/OrbitControls.js"></script>
<script type="text/javascript" src="https://dl.dropboxusercontent.com/s/h18h48v52739df4/STLLoader.js"></script>
<script>
var container;
var camera, controls, scene, renderer, model;

init();
animate();

function init() {
    container = document.createElement('div');
    document.body.appendChild(container);

    camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
    camera.position.z = 5;

    controls = new THREE.OrbitControls(camera);

    // scene
    scene = new THREE.Scene();

    var ambient = new THREE.AmbientLight(0x404040); //0x101030
    scene.add(ambient);

    var directionalLight = new THREE.DirectionalLight(0xffffff);
    directionalLight.position.set(1, 1, 1).normalize();
    scene.add(directionalLight);

    // Loading manager
    var manager = new THREE.LoadingManager();
    manager.onProgress = function (item, loaded, total) {
        console.log(item, loaded, total);
    };

    var onProgress = function (xhr) {
        if (xhr.lengthComputable) {
            var percentComplete = xhr.loaded / xhr.total * 100;
            console.log(Math.round(percentComplete, 2) + '% downloaded');
        }
    };

    var onError = function (xhr) {
        console.log('Error: ' + xhr);
    };

    // Model
    //model = new THREE.Object3D();
    //scene.add(model);

    var material = new THREE.MeshPhongMaterial({
        color: 0xffffff,
        needsUpdate: true
    });

    window.model ='';



    // Added an if else here, STL code:

    var loader = new THREE.STLLoader();
                loader.load( 'https://dl.dropboxusercontent.com/s/t57h7xketafodui/5a9b75e521aaf-DI_PIPE_FBG_holder.stl', function ( geometry ) {

                    var material = new THREE.MeshPhongMaterial( { color: 0xff5533, specular: 0x111111, shininess: 200 } );
                    var mesh = new THREE.Mesh( geometry, material );

                    mesh.position.set( 0, - 0.25, 0.6 );
                    mesh.rotation.set( 0, - Math.PI / 2, 0 );
                    mesh.scale.set( 0.05, 0.05, 0.05 );

                    mesh.castShadow = true;
                    mesh.receiveShadow = true;

                    scene.add( mesh );

                window.model = scene;

                } ); 



    // This OBJ Loader will load if user requests an OBJ file. 
        var loader = new THREE.OBJLoader(manager);
    var object = loader.load('https://dl.dropboxusercontent.com/s/pn3yw6w5962o5r8/BIGIPIGI.obj', function (Object) {

        Object.castShadow = true;
        Object.position.x = 0;
        Object.position.y = -1;
        Object.position.z = 0;

        Object.traverse(function (child) {
            if (child instanceof THREE.Mesh) {
                child.material = material;
            }
        });
        console.log(Object);
                window.model = Object;
        scene.add(Object);
    }, onProgress, onError);
        // Object

    renderer = new THREE.WebGLRenderer();
    renderer.setPixelRatio(window.devicePixelRatio);
    renderer.setSize(window.innerWidth, window.innerHeight);
    container.appendChild(renderer.domElement);

    document.addEventListener('mousedown', onDocumentMouseDown, false);
    window.addEventListener('resize', onWindowResize, false);
}

function onWindowResize() {
    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();

    renderer.setSize(window.innerWidth, window.innerHeight);
}

// Measurement Code

var pointA = new THREE.Vector3( 0, 1, 0 );
var pointB = new THREE.Vector3();

var markerA = new THREE.Mesh( new THREE.SphereGeometry( 0.1, 16, 16 ), new THREE.MeshBasicMaterial( { color: 0xFF5555, depthTest: false, depthWrite: false } ) );
var markerB = markerA.clone();
scene.add( markerA );
scene.add( markerB );

var line;

function getIntersections( event ) {
  var vector = new THREE.Vector2();

  vector.set(
    ( event.clientX / window.innerWidth ) * 2 - 1,
    - ( event.clientY / window.innerHeight ) * 2 + 1 );

  var raycaster = new THREE.Raycaster();
  raycaster.setFromCamera( vector, camera );    

  var intersects = raycaster.intersectObjects( window.model.children );

  return intersects;

}

function getLine( vectorA, vectorB ) {

  var geometry = new THREE.Geometry();
  geometry.vertices.push( vectorA );
  geometry.vertices.push( vectorB );
  var material = new THREE.LineBasicMaterial({
    color: 0xFFFF00,
    depthWrite: false,
    depthTest: false
  });
  line = new THREE.Line( geometry, material );
  return line;

}

function onDocumentMouseDown( event ) {

  var intersects = getIntersections( event );

  if( intersects.length > 0 ){

    if ( ! pointB.equals( pointA ) ) {
      pointB = intersects[ 0 ].point;
    } else {
      pointB = pointA;
    }
    pointA = intersects[ 0 ].point;
    markerA.position.copy( pointA );
    markerB.position.copy( pointB );

    var distance = pointA.distanceTo( pointB );

    if ( line instanceof THREE.Line ) {
      scene.remove( line );
    }
    if ( distance > 0 ) {
      console.log( "distance", distance );
      alert( "distance: "+distance );
            line = getLine( pointA, pointB );
      scene.add(line);
    }

  }

}

function animate() {
    requestAnimationFrame(animate);
    render();
}

function render() {
    renderer.render(scene, camera);
}</script>

var容器;
摄像机、控件、场景、渲染器、模型;
init();
制作动画();
函数init(){
container=document.createElement('div');
文件.正文.附件(容器);
摄像头=新的三个透视摄像头(75,window.innerWidth/window.innerHeight,0.11000);
摄像机位置z=5;
控制装置=新的三个控制装置(摄像机);
//场面
场景=新的三个。场景();
var AmbientLight=new-THREE.AmbientLight(0x404040);//0x101030
场景。添加(环境光);
var方向灯=新的三个方向灯(0xffffff);
directionalLight.position.set(1,1,1).normalize();
场景。添加(方向光);
//加载管理器
var-manager=new-THREE.LoadingManager();
manager.onProgress=功能(项目、已加载、总计){
控制台日志(项目、已加载、总计);
};
var onProgress=函数(xhr){
if(xhr.长度可计算){
var percentComplete=xhr.loaded/xhr.total*100;
log(Math.round(完成百分比,2)+'%download');
}
};
var onError=函数(xhr){
log('Error:'+xhr);
};
//模型
//model=new THREE.Object3D();
//场景。添加(模型);
var材质=新的3.0网格材质({
颜色:0xffffff,
needsUpdate:对
});
window.model='';
//在此处添加了if-else,STL代码:
var loader=new THREE.STLLoader();
loader.load('https://dl.dropboxusercontent.com/s/t57h7xketafodui/5a9b75e521aaf-DI_PIPE_FBG_holder.stl,函数(几何){
var material=新的三点网格材质({颜色:0xff5533,镜面反射:0x111111,光泽度:200});
var mesh=新的三个网格(几何体、材质);
网格位置设置(0,-0.25,0.6);
mesh.rotation.set(0,-Math.PI/2,0);
网目刻度设置(0.05,0.05,0.05);
mesh.castShadow=true;
mesh.receiveShadow=true;
场景。添加(网格);
window.model=场景;
} ); 
//如果用户请求OBJ文件,将加载此OBJ加载程序。
var装入器=新的三个。对象装入器(管理器);
var object=loader.load('https://dl.dropboxusercontent.com/s/pn3yw6w5962o5r8/BIGIPIGI.obj,函数(对象){
Object.castShadow=true;
Object.position.x=0;
Object.position.y=-1;
Object.position.z=0;
遍历(函数(子对象){
if(三个.Mesh的子实例){
child.material=material;
}
});
console.log(对象);
window.model=对象;
场景。添加(对象);
},onProgress,onError);
//反对
renderer=new THREE.WebGLRenderer();
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth、window.innerHeight);
container.appendChild(renderer.domeElement);
文件。添加的文件列表(“mousedown”,onDocumentMouseDown,false);
addEventListener('resize',onWindowResize,false);
}
函数onWindowResize(){
camera.aspect=window.innerWidth/window.innerHeight;
camera.updateProjectMatrix();
renderer.setSize(window.innerWidth、window.innerHeight);
}
//测量代码
var pointA=新的三个向量3(0,1,0);
var pointB=new THREE.Vector3();
var markerA=新的三点网格(新的三点球面测量法(0.1,16,16),新的三点网格基本材质({color:0xFF5555,depthTest:false,depthWrite:false});
var markerB=markerA.clone();
场景。添加(markerA);
场景。添加(markerB);
var线;
函数(事件){
var vector=new THREE.Vector2();
向量集(
(event.clientX/window.innerWidth)*2-1,
-(event.clientY/window.innerHeight)*2+1);
var raycaster=new THREE.raycaster();
raycaster.setFromCamera(矢量,摄像机);
var intersects=raycaster.intersectObjects(window.model.children);
返回交叉点;
}
函数getLine(vectorA,vectorB){
var geometry=new THREE.geometry();
几何。顶点。推(矢量);
几何。顶点。推(矢量b);
var材料=新的三线基本材料({
颜色:0xFFFF00,
depthWrite:false,
深度测试:错误
});
直线=新的三条直线(几何、材料);
回流线;
}
函数onDocumentMouseDown(事件){
var intersects=getcrossions(事件);
如果(相交长度>0){
如果(!pointB.等于(pointA)){
pointB=与[0]相交。点;
}否则{
点B=点A;
}
pointA=与[0]相交。点;
markerA.position.copy(pointA);
标记B位置复制(点B);
变量距离=点A.距离到(点B);
if(三行中的行实例){
场景。删除(行);
}
如果(距离>0){
控制台日志(“距离”,距离);
警报(“距离:+距离);
line=getLine(点A、点B);
场景。添加(行);
}
}
}
函数animate(){
请求动画帧(动画);
render();
}
函数render(){
渲染器。渲染(场景、摄影机);
}

尝试在CSS部分添加:

body{
  overflow: hidden;
  margin: 0;
}

出于好奇,是什么让你认为结果不正确?不正确的标准是什么?有机会看到OBJ和STL模型之间的比较结果吗?我有上面的codepen链接,它允许您访问页面并查看正在加载的STL文件。点击不到正确的位置。试着点击一个c