Как динамически обновлять Line2 в Three.js

напиши впереди

В Three.js вы хотите создать модель линии. Если вы используете Line и свойство ширины линии lineWidth соответствующего материала LineBasicMaterial, это недопустимо, и вы не можете получить линию с шириной.

Чтобы реализовать линию шириной в Three.js, рекомендуется использовать Line2. следующее:

import {
    
     Line2 } from 'three/examples/jsm/lines/Line2.js'
import {
    
     LineMaterial } from 'three/examples/jsm/lines/LineMaterial.js'
import {
    
     LineGeometry } from 'three/examples/jsm/lines/LineGeometry.js'


const geometry = new LineGeometry()
geometry.setPositions([0, 0, 0, 10, 10, 10, 20, 20, 10])
const material = new LineMaterial({
    
    
  // 设置分辨率
  resolution: new THREE.Vector2(window.innerWidth, window.innerHeight),
  // 颜色
  color: 0xff0000,
  // 线宽度
  linewidth: 2
})

let line2 = new Line2(geometry, material)

scene.add(line2)

Как динамически обновлять эту строку?

Как после использования Line2 для реализации линии с шириной динамически изменять или обновлять линию?

Здесь возможны две ситуации: 1. Измените только цвет или ширину 2. Измените длину или форму линии.

Измените только цвет или ширину

line2.material.linewidth = 5
line2.material.color.set(0xffff00)
line2.material.needsUpdate = true

Изменение длины или формы линии

Эта ситуация немного сложнее, и ее нельзя достичь путем прямого изменения атрибута геометрии.

Способ 1: динамически изменить начальную и конечную точку определенного сегмента в Line2.

При создании Line2 можно передать несколько точек, но реализация Line2 заключается в формировании небольшого сегмента линии между двумя соседними точками, поэтому первый метод выглядит следующим образом:

line2.geometry.attributes.instanceStart.setY(0, 50); // 修改第1个小线段的起点点位的Y值
line2.geometry.attributes.instanceEnd.setY(0, 50); // 修改第1个小线段的终点点位的Y值
line2.geometry.attributes.instanceStart.needsUpdate = true;
line2.geometry.attributes.instanceEnd.needsUpdate = true;

Способ 2. Передайте новый массив точек и обновите всю строку Line2.

Однако длина вновь переданного массива точек должна соответствовать длине массива точек, переданного при создании Line2. Передавать больше бесполезно.

// 传多了也没用
let points2 = [ // 创建line2时,传入的是3个点,所以这里也传入3个点
  -10,10,0,
  -10,0,0,
  0,10,0
]
line2.geometry.setPositions(points2);

Способ 3. Настройте и обновите Line2 по своему усмотрению.

Таким образом, первоначально созданную линию 2 можно изменить и обновить в любой форме и положении точки.

line2.geometry.dispose() // 销毁原来的集合体
let newPositions = [
  -10,10,0,
  -10,0,0,
  0,10,0,
  10,0,0,
  10,10,0,
  15,0,0,
  20,0,0
]

// 创建新的几何体替换原来的,实现任意更新
line2.geometry = new LineGeometry().setPositions(newPositions)

—————————— [Конец текста] ——————————

Группа обмена фронт-энд-обучением. Если вы хотите прийти на очное собеседование, вы можете присоединиться к группе: 832485817 , 685486827 ;

В конце написано: Соглашение лучше конфигурации — принцип простоты разработки программного обеспечения.

---------- 【над】 ----------

Мой:
Персональный сайт: https://neveryu.github.io/neveryu/
Github: https://github.com/Neveryu
WeChat: чудо421354532

Чтобы получить дополнительные учебные ресурсы, подпишитесь на мой WeChat... хорошо?

рекомендация

отblog.csdn.net/csdn_yudong/article/details/134841527