Javascript 访问Three.js圆柱体上的段

Javascript 访问Three.js圆柱体上的段,javascript,3d,three.js,Javascript,3d,Three.js,所以我在玩Three.js中的圆柱体几何体 这是我的密码笔: 我试图找出(但徒劳无功)如何通过索引或坐标到达特定的线段,并用不同的颜色对其进行着色() 有人能在这里提供一些指导或如何进一步解决这个问题吗?只是一个示例,说明如何使用THREE.Raycaster()和THREE.CylinderGeometry() var scene=new THREE.scene(); var摄像机=新的三透视摄像机(60,window.innerWidth/window.innerHeight,11000

所以我在玩Three.js中的圆柱体几何体

这是我的密码笔:

我试图找出(但徒劳无功)如何通过索引或坐标到达特定的线段,并用不同的颜色对其进行着色()


有人能在这里提供一些指导或如何进一步解决这个问题吗?

只是一个示例,说明如何使用
THREE.Raycaster()
THREE.CylinderGeometry()

var scene=new THREE.scene();
var摄像机=新的三透视摄像机(60,window.innerWidth/window.innerHeight,11000);
摄像机位置设置(5,0,10);
var renderer=new THREE.WebGLRenderer({
反别名:对
});
renderer.setSize(window.innerWidth、window.innerHeight);
setClearColor(0x818181);
document.body.appendChild(renderer.doElement);
var controls=新的三个.OrbitControls(摄影机、渲染器.doElement);
var mesh=新的THREE.mesh(新的THREE.Cylinder几何体(2,2,15,32,20,true),新的THREE.MeshBasicMaterial({
顶点颜色:三种颜色,
线框:假,
侧面:三个。双面
}));
mesh.rotation.x=-Math.PI*.5;
场景。添加(网格);
var wire=新的三个.LineSegments(新的三个.WireframeGeometry(mesh.geometry)),新的三个.LineBasicMaterial({
颜色:“黑色”
}));
网格。添加(线);
var raycaster=new THREE.raycaster();
var mouse=new THREE.Vector2();
var相交;
document.addEventListener(“mousedown”,onMouseDown,false);
函数onMouseDown(事件){
mouse.x=(event.clientX/window.innerWidth)*2-1;
mouse.y=-(event.clientY/window.innerHeight)*2+1;
raycaster.setFromCamera(鼠标、相机);
相交=光线投射器。相交对象(网格);
if(intersects.length==0)返回;
相交[0].face.color.setHex(0xff0000);
相交[0]。object.geometry.colorsNeedUpdate=true;
}
render();
函数render(){
请求动画帧(渲染);
渲染器。渲染(场景、摄影机);
}
正文{
溢出:隐藏;
保证金:0;
}

这只是一个使用
THREE.Raycaster()
THREE.CylinderGeometry()
的示例

var scene=new THREE.scene();
var摄像机=新的三透视摄像机(60,window.innerWidth/window.innerHeight,11000);
摄像机位置设置(5,0,10);
var renderer=new THREE.WebGLRenderer({
反别名:对
});
renderer.setSize(window.innerWidth、window.innerHeight);
setClearColor(0x818181);
document.body.appendChild(renderer.doElement);
var controls=新的三个.OrbitControls(摄影机、渲染器.doElement);
var mesh=新的THREE.mesh(新的THREE.Cylinder几何体(2,2,15,32,20,true),新的THREE.MeshBasicMaterial({
顶点颜色:三种颜色,
线框:假,
侧面:三个。双面
}));
mesh.rotation.x=-Math.PI*.5;
场景。添加(网格);
var wire=新的三个.LineSegments(新的三个.WireframeGeometry(mesh.geometry)),新的三个.LineBasicMaterial({
颜色:“黑色”
}));
网格。添加(线);
var raycaster=new THREE.raycaster();
var mouse=new THREE.Vector2();
var相交;
document.addEventListener(“mousedown”,onMouseDown,false);
函数onMouseDown(事件){
mouse.x=(event.clientX/window.innerWidth)*2-1;
mouse.y=-(event.clientY/window.innerHeight)*2+1;
raycaster.setFromCamera(鼠标、相机);
相交=光线投射器。相交对象(网格);
if(intersects.length==0)返回;
相交[0].face.color.setHex(0xff0000);
相交[0]。object.geometry.colorsNeedUpdate=true;
}
render();
函数render(){
请求动画帧(渲染);
渲染器。渲染(场景、摄影机);
}
正文{
溢出:隐藏;
保证金:0;
}


您尝试过使用吗?对我不起作用,但是,我现在使用的是另一种方法。我正试图添加两个气缸,并使用第二个气缸来操纵管道上的“焊缝”,但也无法实现这个想法哈哈,我真倒霉,我是3JS的傻瓜不为我工作什么也解释不了。你是怎么用的?如果你真的这么做了。好吧,我已经尝试过了,但可能还有更多的东西要实现raycaster,我无法理解,因为我试图称之为raycaster,我无法获得任何阴影,不幸的是,这对我来说不起作用。我确实设法让它与第二个解决方案一起工作,它使我的头脑放松了,但不知道在提出的问题中是否可能出现任何特定的分段。你尝试过使用吗?不适用于我,但是,我现在使用的是另一种方法。我正试图添加两个气缸,并使用第二个气缸来操纵管道上的“焊缝”,但也无法实现这个想法哈哈,我真倒霉,我是3JS的傻瓜不为我工作什么也解释不了。你是怎么用的?如果你真的这么做了。好吧,我已经尝试过了,但可能还有更多的东西要实现raycaster,我无法理解,因为我试图称之为raycaster,我无法获得任何阴影,不幸的是,这对我来说不起作用。我确实设法让它与第二个解决方案一起工作,它使我的头脑放松了,但不知道在建议的问题中是否可能达到任何特定的阶段。谢谢你,伙计。正如我所说的,我在这方面很在行,需要一些时间来解决这个问题。我已经提出了一个解决方案,但这也是我最初尝试的。谢谢你抽出时间。如果你能和我分享你的钢笔,我将非常感激:)@klanc(不客气)你可以使用代码片段中的代码。还有,上面有一份。非常感谢你,布罗斯基!:)谢谢你,伙计。正如我所说的,我在这方面很在行,需要一些时间来解决这个问题。我已经提出了一个解决方案,但这也是我最初尝试的。谢谢你抽出时间。如果你能和我分享你的钢笔,我将非常感激:)@klanc(不客气)你可以使用代码片段中的代码。还有,上面有一份。非常感谢你,布罗斯基!:)
        var gui = new dat.GUI();
        var scene = new THREE.Scene();
        var camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 50 );
        camera.position.z = 30;

        var renderer = new THREE.WebGLRenderer( { antialias: true } );
        renderer.setPixelRatio( window.devicePixelRatio );
        renderer.setSize( window.innerWidth, window.innerHeight );
        renderer.setClearColor( 0x000000, 1 );
        document.body.appendChild( renderer.domElement );

        var orbit = new THREE.OrbitControls( camera, renderer.domElement );
        orbit.enableZoom = false;

        var lights = [];
        lights[ 0 ] = new THREE.PointLight( 0xffffff, 1, 0 );
        lights[ 1 ] = new THREE.PointLight( 0xffffff, 1, 0 );
        lights[ 2 ] = new THREE.PointLight( 0xffffff, 1, 0 );

        lights[ 0 ].position.set( 0, 200, 0 );
        lights[ 1 ].position.set( 100, 200, 100 );
        lights[ 2 ].position.set( - 100, - 200, - 100 );

        scene.add( lights[ 0 ] );
        scene.add( lights[ 1 ] );
        scene.add( lights[ 2 ] );

        var mesh = new THREE.Object3D();

        mesh.add( new THREE.LineSegments(

            new THREE.Geometry(),

            new THREE.LineBasicMaterial( {
                color: 0xffffff,
                transparent: true,
                opacity: 0.5
            } )

        ) );

        mesh.add( new THREE.Mesh(

            new THREE.Geometry(),

            new THREE.MeshPhongMaterial( {
                color: 0x156289,
                emissive: 0x072534,
                side: THREE.DoubleSide,
                flatShading: true
            } )

        ) );


 function renderMeshCylinder( mesh ) {

    var data = {
        radiusTop : 5,
        radiusBottom : 5,
        height : 30,
        radiusSegments : 60,
        heightSegments : 60,
        openEnded : true,
        thetaStart : 0,
        thetaLength : twoPi
    };





    function generateGeometry() {

        updateGroupGeometry( mesh,
            new THREE.CylinderGeometry(
                data.radiusTop,
                data.radiusBottom,
                data.height,
                data.radiusSegments,
                data.heightSegments,
                data.openEnded,
                data.thetaStart,
                data.thetaLength
            )
        );

    }

    var folder = gui.addFolder( 'THREE.CylinderGeometry' );

    folder.add( data, 'radiusTop', 1, 30 ).onChange( generateGeometry );
    folder.add( data, 'radiusBottom', 1, 30 ).onChange( generateGeometry );
    folder.add( data, 'height', 1, 50 ).onChange( generateGeometry );
    folder.add( data, 'radiusSegments', 3, 64 ).step( 1 ).onChange( generateGeometry );
    folder.add( data, 'heightSegments', 1, 64 ).step( 1 ).onChange( generateGeometry );
    folder.add( data, 'openEnded' ).onChange( generateGeometry );
    folder.add( data, 'thetaStart', 0, twoPi ).onChange( generateGeometry );
    folder.add( data, 'thetaLength', 0, twoPi ).onChange( generateGeometry );


    generateGeometry();

}

renderMeshCylinder(mesh);
        var options = {};

        scene.add( mesh );

        var prevFog = false;

        var render = function () {

            requestAnimationFrame( render );

            if ( ! options.fixed ) {

                mesh.rotation.x += 0;
                mesh.rotation.y += 0;

            }

            renderer.render( scene, camera );

        };

        window.addEventListener( 'resize', function () {

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

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

        }, false );

        render();