从相机位置到原点画一条线

问题描述 投票:0回答:1

使用 Threejs,我尝试从相机位置到原点画一条线。 我希望该线始终指向屏幕的中间(假设从相机原点查看重新渲染的场景) 但事实并非如此(该线始终指向屏幕的一侧)。 下面的代码是正式的 Threejs webgl_geometry_extrude_shapes.html 示例的子集。 我添加了函数draw_line_from_camera_to_origin(场景,相机)

我做错了什么?

谢谢, 阿夫纳

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>three.js webgl - geometry - extrude shapes</title>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
        <style>
            body {
                font-family: Monospace;
                background-color: #222;
                margin: 0px;
                overflow: hidden;
            }
            a {
                color: #f80;
            }
        </style>
    </head>

    <body>

        <script src="../build/three.js"></script>
        <script src="js/controls/TrackballControls.js"></script>

        <script>

            var container;

            var camera, scene, renderer, controls;

            init();
            animate();

                        function draw_line_from_camera_to_origin(scene, camera)
                        {
                                // Draw line from camera to origin
                                var pointA2 = new THREE.Vector3( camera.position.x, camera.position.y, camera.position.z );
                                var pointB2 = new THREE.Vector3( 0, 0, 0 );

                                var geometry2 = new THREE.Geometry();
                                geometry2.vertices.push( pointA2 );
                                geometry2.vertices.push( pointB2 );
                                var material2 = new THREE.LineBasicMaterial( { color : 'yellow' } );
                                var line2 = new THREE.Line( geometry2, material2 );
                                scene.add( line2 );
                        }

            function init() {

                var info = document.createElement( 'div' );
                info.style.position = 'absolute';
                info.style.top = '10px';
                info.style.width = '100%';
                info.style.textAlign = 'center';
                info.style.color = '#fff';
                info.style.link = '#f80';
                info.innerHTML = '<a href="http://threejs.org" target="_blank" rel="noopener">three.js</a> webgl - geometry extrude shapes';
                document.body.appendChild( info );

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

                scene = new THREE.Scene();
                scene.background = new THREE.Color( 0x222222 );

                camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 1000 );
                camera.position.set( 0, 0, 500 );

                controls = new THREE.TrackballControls( camera, renderer.domElement );
                controls.minDistance = 200;
                controls.maxDistance = 500;

                scene.add( new THREE.AmbientLight( 0x222222 ) );

                var light = new THREE.PointLight( 0xffffff );
                light.position.copy( camera.position );
                scene.add( light );

                //

                var closedSpline = new THREE.CatmullRomCurve3( [
                    new THREE.Vector3( -60, -100,  60 ),
                    new THREE.Vector3( -60,   20,  60 ),
                    new THREE.Vector3( -60,  120,  60 ),
                    new THREE.Vector3(  60,   20, -60 ),
                    new THREE.Vector3(  60, -100, -60 )
                ] );

                closedSpline.curveType = 'catmullrom';
                closedSpline.closed = true;

                var extrudeSettings = {
                    steps           : 100,
                    bevelEnabled    : false,
                    extrudePath     : closedSpline
                };


                var pts = [], count = 3;

                for ( var i = 0; i < count; i ++ ) {

                    var l = 20;

                    var a = 2 * i / count * Math.PI;

                    pts.push( new THREE.Vector2 ( Math.cos( a ) * l, Math.sin( a ) * l ) );

                }

                var shape = new THREE.Shape( pts );

                var geometry = new THREE.ExtrudeGeometry( shape, extrudeSettings );

                var material = new THREE.MeshLambertMaterial( { color: 0xb00000, wireframe: false } );

                var mesh = new THREE.Mesh( geometry, material );

                scene.add( mesh );


                                draw_line_from_camera_to_origin(scene, camera);
            }

            function animate() {

                requestAnimationFrame( animate );

                controls.update();

                renderer.render( scene, camera );

            }

        </script>

    </body>

</html>
three.js
1个回答
0
投票

您需要更新另一个点的位置。

当你第一次创建这条线时,你告诉它空间中的一个点,它永远不会从那里移动。它可能看起来像是在移动,但这只是因为它是一条很长的线。

所以你需要将 Geometry2 设置为全局变量(位于顶部):

var camera, scene, renderer, controls, geometry2;

然后在

var
中声明 Geometry2 时删除
draw_line_from_camera_to_origin
那么你的动画循环应该是:

function animate() {

    geometry2.vertices[0].x = camera.position.x;
    geometry2.vertices[0].y = camera.position.y;
    geometry2.vertices[0].z = camera.position.z;
    geometry2.verticesNeedUpdate = true;

    requestAnimationFrame( animate );

    controls.update();

    renderer.render( scene, camera );
}

现在,当您移动相机时,您会看到线条随之移动,然后漂移回到相机的位置。我不知道为什么这样做,我实际上希望这条线是不可见的(因为线的宽度为 0,并且它直接指向相机)。

© www.soinside.com 2019 - 2024. All rights reserved.