three Line , LineLoop, LineSegments / 线, 环线, 线段 使用方法

264 阅读2分钟

Line 用于连续线条,LineLoop 用于闭合线圈,而 LineSegments 用于不连接的独立线段。

Line 有五个属性 三个方法

    // 创建几何体
    const geometry = new THREE.BufferGeometry();
    // 定义顶点
    const vertices = new Float32Array([
        0, 0, 0,
        1, 1, 0,
        2, 0, 0
    ]);
    // 设置几何体的顶点
    geometry.setAttribute('position', new THREE.BufferAttribute(vertices, 3));
    // 添加形态目标
    const targetVertices1 = new Float32Array([
        0, 0, 0,
        1, 0.5, 0, // 变化的顶点
        2, 0, 0
    ]);
    const targetVertices2 = new Float32Array([
        0, 0, 0,
        1, 1.5, 0, // 另一种变化的顶点
        2, 0, 0
    ]);
    geometry.morphAttributes.position = [
        new THREE.Float32BufferAttribute(targetVertices1, 3),
        new THREE.Float32BufferAttribute(targetVertices2, 3)
    ];
    // 创建线材质
    const material = new THREE.LineBasicMaterial({ color: 0xffffff });
    // 创建线对象
    const line = new THREE.Line(geometry, material);
    line.morphTargetInfluences = [0, 0]; // 初始化影响值
    line.morphTargetDictionary = {
        'target1': 0,
        'target2': 1
    };
    // 将线添加到场景
    scene.add(line);
    camera.position.z = 5;
    // 创建 OrbitControls
    const controls = new OrbitControls(camera, renderer.domElement);    
    // 渲染循环
    function animate() {
        requestAnimationFrame(animate);
        // 动态调整影响值
        line.morphTargetInfluences[0] = Math.sin(Date.now() * 0.001); // target1 的影响
        line.morphTargetInfluences[1] = Math.cos(Date.now() * 0.001); // target2 的影响
        controls.update();
        renderer.render(scene, camera);
    }
    animate();

属性

  • geometry : BufferGeometry 表示线段的顶点。
  • isLine : Boolean 只读是线材制
  • material : Material 线的材质。
  • morphTargetInfluences : Array 变形参数 权重数组,通常为 0-1,指定应用的变形量。默认情况下未定义,但通过 .updateMorphTargets() 重置为空白数组。
  • morphTargetDictionary : Object 变化标记 基于 morphTarget.name 属性的 morphTargets 字典。默认情况下未定义,但重建了.updateMorphTargets()。

方法

  • computeLineDistances () : this 计算LineDashedMaterial所需的距离的值的数组。 对于几何体中的每一个顶点,这个方法计算出了当前点到线的起始点的累积长度。
  • raycast ( raycaster : Raycaster, intersects : Array ) : undefined 在一条投射出去的Ray(射线)和这条线之间产生交互。 Raycaster.intersectObject将会调用这个方法。
    // 创建线条几何体
    const points = [
        new THREE.Vector3(-1, 0, 0),
        new THREE.Vector3(1, 0, 0)
    ];
    const lineGeometry = new THREE.BufferGeometry().setFromPoints(points);
    const lineMaterial = new THREE.LineBasicMaterial({ color: 0xff0000 });
    const line = new THREE.Line(lineGeometry, lineMaterial);
    scene.add(line);
    // 设置相机位置
    camera.position.z = 5;
    // 创建 Raycaster
    const raycaster = new THREE.Raycaster();
    const mouse = new THREE.Vector2();
    // 处理鼠标点击
    window.addEventListener('click', (event) => {
        // 转换鼠标坐标为标准化设备坐标
        mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
        mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
        // 更新 Raycaster
        raycaster.setFromCamera(mouse, camera);
        // 计算与线段的交集
        const intersects = [];
        line.raycast(raycaster, intersects);
        // 如果有交集,处理交互
        if (intersects.length > 0) {
            console.log('Line intersected at:', intersects[0]);
            // 在这里可以执行一些交互,比如改变线的颜色
            line.material.color.set(Math.random() * 0xffffff);
        }
    });
  • updateMorphTargets () : undefined 更新 morphTargets 以对对象没有影响。重置 .morphTargetInfluences 和 .morphTargetDictionary 属性。

LineLoop 有一个属性 继承基类Line 属性与方法

属性

  • isLineLoop : Boolean 判断是环线

LineSegments 线段 有一个属性 继承基类Line 属性与方法

属性

  • isLineSegments : Boolean 判断是线段