`THREE.LineBasicMaterial` 是 three.js 中用来创建用于绘制线条的基本材质。

demo案例

THREE.LineBasicMaterial 是 three.js 中用来创建用于绘制线条的基本材质。以下是它的入参、出参、方法和属性的详细说明。
在这里插入图片描述

入参 (Constructor Parameters)

THREE.LineBasicMaterial 构造函数可以接收一个包含多个属性的对象。常用属性如下:

const material = new THREE.LineBasicMaterial( {
    color: 0xffffff, // 颜色
    linewidth: 1, // 线宽(只有在WebGLRenderer中有效)
    linecap: 'round', // 线段端点样式,可选值:'butt', 'round', 'square'
    linejoin: 'round', // 线段连接处样式,可选值:'round', 'bevel', 'miter'
    opacity: 1.0, // 不透明度
    transparent: false, // 是否透明
    vertexColors: false, // 是否使用顶点颜色
    fog: true // 是否受雾影响
});

出参 (Return Value)

构造函数 new THREE.LineBasicMaterial 创建并返回一个 THREE.LineBasicMaterial 对象。

方法 (Methods)

THREE.LineBasicMaterial 继承自 THREE.Material,因此具有 THREE.Material 的所有方法。常用的方法包括:

  • .copy(source): 复制源材质的所有属性到当前材质。
  • .clone(): 克隆当前材质,返回一个新的材质实例。
  • .dispose(): 释放材质使用的资源。
  • .setValues(parameters): 设置材质的属性。

属性 (Properties)

THREE.LineBasicMaterial 继承自 THREE.Material,并有以下特有属性:

  • .color: THREE.Color 线条的颜色,默认为白色 (0xffffff)。
  • .linewidth: number 线条的宽度。注意,线宽的实际效果在不同平台和设备上可能有所不同。
  • .linecap: string 线段端点的样式,可选值为 'butt', 'round', 'square',默认值为 'round'
  • .linejoin: string 线段连接处的样式,可选值为 'round', 'bevel', 'miter',默认值为 'round'
  • .vertexColors: boolean 指定是否使用顶点颜色。可选值为 THREE.NoColors, THREE.VertexColors
  • .fog: boolean 指定材质是否受雾影响,默认值为 true
  • .opacity: number 不透明度,取值范围为 0.0 到 1.0,默认值为 1.0。
  • .transparent: boolean 指定材质是否透明,默认值为 false

示例

以下是一个使用 THREE.LineBasicMaterial 绘制线条的简单示例:

// 创建场景、相机和渲染器
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// 创建线条的几何体
const geometry = new THREE.BufferGeometry();
const vertices = new Float32Array([
    -1.0, -1.0,  0.0,
     1.0, -1.0,  0.0,
     0.0,  1.0,  0.0
]);
geometry.setAttribute('position', new THREE.BufferAttribute(vertices, 3));

// 创建线条的材质
const material = new THREE.LineBasicMaterial({ color: 0xff0000 });

// 创建线条对象
const line = new THREE.Line(geometry, material);
scene.add(line);

// 设置相机位置
camera.position.z = 5;

// 渲染函数
function animate() {
    requestAnimationFrame(animate);
    renderer.render(scene, camera);
}

animate();
<!DOCTYPE html>
<html lang="en">
	<head>
		<title>three.js webgl - buffergeometry - lines - indexed</title>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
		<link type="text/css" rel="stylesheet" href="main.css">
	</head>
	<body>

		<div id="container"></div> <!-- 容器元素 -->
		<div id="info"><a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> webgl - buffergeometry - lines - indexed</div> <!-- 信息栏 -->

		<script type="importmap">
			{
				"imports": {
					"three": "../build/three.module.js",
					"three/addons/": "./jsm/"
				}
			}
		</script>

		<script type="module">

			import * as THREE from 'three'; // 导入 three.js
			import Stats from 'three/addons/libs/stats.module.js'; // 导入 Stats 库

			let container, stats; // 定义容器和统计对象
			let camera, scene, renderer; // 定义相机、场景和渲染器
			let parent_node; // 定义父节点

			init(); // 初始化函数
			animate(); // 动画函数

			function init() {

				container = document.getElementById( 'container' ); // 获取容器元素

				camera = new THREE.PerspectiveCamera( 27, window.innerWidth / window.innerHeight, 1, 10000 ); // 创建透视相机
				camera.position.z = 9000; // 设置相机位置

				scene = new THREE.Scene(); // 创建场景

				const geometry = new THREE.BufferGeometry(); // 创建几何体
				const material = new THREE.LineBasicMaterial( { vertexColors: true } ); // 创建材质

				const indices = []; // 定义索引数组
				const positions = []; // 定义位置数组
				const colors = []; // 定义颜色数组

				let next_positions_index = 0; // 下一个顶点索引

				const iteration_count = 4; // 迭代次数
				const rangle = 60 * Math.PI / 180.0; // 角度

				function add_vertex( v ) {
					// 添加顶点
					positions.push( v.x, v.y, v.z );
					colors.push( Math.random() * 0.5 + 0.5, Math.random() * 0.5 + 0.5, 1 );
					return next_positions_index ++;
				}

				// 简单的 Koch 曲线迭代
				function snowflake_iteration( p0, p4, depth ) {
					if ( -- depth < 0 ) {
						const i = next_positions_index - 1; // p0 已经在数组中
						add_vertex( p4 );
						indices.push( i, i + 1 );
						return;
					}

					const v = p4.clone().sub( p0 );
					const v_tier = v.clone().multiplyScalar( 1 / 3 );
					const p1 = p0.clone().add( v_tier );

					const angle = Math.atan2( v.y, v.x ) + rangle;
					const length = v_tier.length();
					const p2 = p1.clone();
					p2.x += Math.cos( angle ) * length;
					p2.y += Math.sin( angle ) * length;

					const p3 = p0.clone().add( v_tier ).add( v_tier );

					snowflake_iteration( p0, p1, depth );
					snowflake_iteration( p1, p2, depth );
					snowflake_iteration( p2, p3, depth );
					snowflake_iteration( p3, p4, depth );
				}

				// 生成雪花
				function snowflake( points, loop, x_offset ) {
					for ( let iteration = 0; iteration != iteration_count; iteration ++ ) {
						add_vertex( points[ 0 ] );

						for ( let p_index = 0, p_count = points.length - 1; p_index != p_count; p_index ++ ) {
							snowflake_iteration( points[ p_index ], points[ p_index + 1 ], iteration );
						}

						if ( loop ) snowflake_iteration( points[ points.length - 1 ], points[ 0 ], iteration );

						// 平移输入曲线
						for ( let p_index = 0, p_count = points.length; p_index != p_count; p_index ++ ) {
							points[ p_index ].x += x_offset;
						}
					}
				}

				let y = 0;

				// 创建不同形状的雪花
				snowflake(
					[
						new THREE.Vector3( 0, y, 0 ),
						new THREE.Vector3( 500, y, 0 )
					],
					false, 600
				);

				y += 600;
				snowflake(
					[
						new THREE.Vector3( 0, y, 0 ),
						new THREE.Vector3( 250, y + 400, 0 ),
						new THREE.Vector3( 500, y, 0 )
					],
					true, 600
				);

				y += 600;
				snowflake(
					[
						new THREE.Vector3( 0, y, 0 ),
						new THREE.Vector3( 500, y, 0 ),
						new THREE.Vector3( 500, y + 500, 0 ),
						new THREE.Vector3( 0, y + 500, 0 )
					],
					true, 600
				);

				y += 1000;
				snowflake(
					[
						new THREE.Vector3( 250, y, 0 ),
						new THREE.Vector3( 500, y, 0 ),
						new THREE.Vector3( 250, y, 0 ),
						new THREE.Vector3( 250, y + 250, 0 ),
						new THREE.Vector3( 250, y, 0 ),
						new THREE.Vector3( 0, y, 0 ),
						new THREE.Vector3( 250, y, 0 ),
						new THREE.Vector3( 250, y - 250, 0 ),
						new THREE.Vector3( 250, y, 0 )
					],
					false, 600
				);

				geometry.setIndex( indices ); // 设置索引
				geometry.setAttribute( 'position', new THREE.Float32BufferAttribute( positions, 3 ) ); // 设置位置属性
				geometry.setAttribute( 'color', new THREE.Float32BufferAttribute( colors, 3 ) ); // 设置颜色属性
				geometry.computeBoundingSphere(); // 计算包围球

				const lineSegments = new THREE.LineSegments( geometry, material ); // 创建线段
				lineSegments.position.x -= 1200; // 平移位置
				lineSegments.position.y -= 1200; // 平移位置

				parent_node = new THREE.Object3D(); // 创建父节点
				parent_node.add( lineSegments ); // 添加线段到父节点

				scene.add( parent_node ); // 将父节点添加到场景

				renderer = new THREE.WebGLRenderer(); // 创建渲染器
				renderer.setPixelRatio( window.devicePixelRatio ); // 设置像素比
				renderer.setSize( window.innerWidth, window.innerHeight ); // 设置渲染器大小

				container.appendChild( renderer.domElement ); // 将渲染器添加到容器

				stats = new Stats(); // 创建统计对象
				container.appendChild( stats.dom ); // 将统计对象添加到容器

				window.addEventListener( 'resize', onWindowResize ); // 添加窗口大小改变事件监听

			}

			function onWindowResize() {

				camera.aspect = window.innerWidth / window.innerHeight; // 更新相机宽高比
				camera.updateProjectionMatrix(); // 更新相机投影矩阵

				renderer.setSize( window.innerWidth, window.innerHeight ); // 更新渲染器大小

			}

			function animate() {

				requestAnimationFrame( animate ); // 请求动画帧

				render(); // 渲染场景
				stats.update(); // 更新统计信息

			}

			function render() {

				const time = Date.now() * 0.001; // 获取当前时间

				parent_node.rotation.z = time * 0.5; // 旋转父节点

				renderer.render( scene, camera ); // 渲染场景

			}

		</script>

	</body>
</html>

压图地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/764315.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c++ 构造,析构,拷贝,移动构造函数

文章目录 概述1.构造函数2. 拷贝构造函数3.移动构造函数4.析构函数 例子QTUE4/5 c 小结 概述 对于c来说&#xff0c;最基础的是类。对于一个类来说&#xff0c;主要由以下函数构成。如下&#xff1a; 构造函数拷贝构造函数移动构造函数析构函数 当然&#xff0c;还有一个操作…

做测试/爬虫 selenium 元素定位 谷歌浏览器 插件推荐,提高元素定位效率

注:插件均在谷歌应用商店 下载 1.XPath Helper 插件 作用&#xff1a;用于Html中对目标字段或者属性值进行匹配 快捷启动&#xff1a;ctrl shift x 示例图如下&#xff1a; 2. ChroPath 插件 作用&#xff1a; 提高元素定位效率 启动&#xff1a;谷歌浏览器 按 F12 -&g…

Query Rewriting for Retrieval-Augmented Large Language Models

文章目录 题目摘要方法实验 题目 检索增强大语言模型的查询重写 论文地址&#xff1a;https://arxiv.org/abs/2305.14283 项目地址&#xff1a;https://github.com/xbmxb/RAG-query-rewriting 摘要 大语言模型&#xff08;LLM&#xff09;在检索--然后阅读&#xff08;retriev…

使用 Amazon Bedrock Converse API 简化大语言模型交互

本文将介绍如何使用 Amazon Bedrock 最新推出的 Converse API&#xff0c;来简化与各种大型语言模型的交互。该 API 提供了一致的接口&#xff0c;可以无缝调用各种大型模型&#xff0c;从而消除了需要自己编写复杂辅助功能函数的重复性工作。文中示例将展示它相比于以前针对每…

「ETL趋势」分区支持PostgreSQL、Greenplum、Gauss200, 定时任务支持Kettle

FineDataLink作为一款市场上的顶尖ETL工具&#xff0c;集实时数据同步、ELT/ETL数据处理、数据服务和系统管理于一体的数据集成工具&#xff0c;进行了新的维护迭代。本文把FDL4.1.9最新功能作了介绍&#xff0c;方便大家对比&#xff1a;&#xff08;产品更新详情&#xff1a;…

学习记录之数学表达式(6)

目录 十二、图与网络12.1 有向图12.2 元组与对象12.3 二元关系与有向图12.4 无向图12.5 有向网络12.6 作业 十三、树13.1 例子13.2 定义13.3 Java代码13.4 作业 十四、 m \mathbf{m} m叉树14.1 预备知识&#xff1a;字符串14.2 m \mathbf{m} m-叉树的定义14.3 Java代码14.4 作…

mysql-sql-第十三周

学习目标&#xff1a; sql 学习内容&#xff1a; 37.查询各科成绩最高分、最低分和平均分&#xff1a; 以如下形式显示&#xff1a;课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 及格为>60,中等为&#xff1a;70-80,优良为&#xff1a;80-90,优秀…

2024 年江西省研究生数学建模竞赛A题:交通信号灯管理问题分析、实现代码及参考论文

2024 年江西省研究生数学建模竞赛题目交通信号灯管理 1 题目 交通信号灯是指挥车辆通行的重要标志&#xff0c;由红灯、绿灯、 黄灯组成。红灯停、绿灯行&#xff0c;而黄灯则起到警示作用。交通 信号灯分为机动车信号灯、非机动车信号灯、人行横道信号 灯、方向指示灯等。 一…

OpenSSH漏洞扫描(CVE-2024-6387、CVE-2006-5051、CVE-2008-4109)

目录 POC&#xff1a;ssh_poc.py 使用方法 github CVE-2024-6387 漏洞信息 补丁 POC&#xff1a;ssh_poc.py import sys import socket import argparse import threading import queue import os from datetime import datetime from urllib.parse import urlparse from…

LinuxRT启动Veristand项目的配置文件

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

FreeRTOS的任务理论

文章目录 2 FreeRTOS的任务理论2.1 任务及任务优先级2.2 任务状态理论2.2.1 任务状态的转换2.2.2 任务状态改变相关函数2.2.3 调度器相关函数 2.3 FreeRTOS延时2.3.1 vTaskDelay延时2.3.2 vTaskDelayUntil延时2.3.3 pdMS_TO_TICKS&#xff08;x&#xff09;宏 2.4 TCB任务控制块…

kafka 实现精确一次性语义实践总结

文章目录 前言幂等生产者幂等生产者的工作原理幂等生产者的局限性如何使用幂等生产者 事务事务的应用场景事务可以解决哪些问题事务是如何保证精确一次性的使用事物 API事物的工作原理 事务的性能 前言 Kafka的精确一次性语义与国际象棋正好相反&#xff1a;要理解它不容易&am…

怎么分区,新买的电脑只有一个C盘

C盘在大多数默认情况下是一台电脑的系统盘&#xff0c;也是创建硬盘分区时&#xff0c;最先被创建的盘。不过在一些特殊情况下&#xff0c;电脑上只有一个C盘。 为什么会出现只有一个C盘这种情况&#xff1f;当我们发现电脑只有一个C盘时&#xff0c;能通过哪些方法去创建其他硬…

Redis 7.x 系列【8】数据类型之哈希(Hash)

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 常用命令2.1 HSET2.2 HGET2.3 HDEL2.4 HEXISTS2.5 HGETALL2.6 HKEYS2.7 HLE…

SMS多表面同步透镜设计

SMS多表面同步透镜设计 一、设计原理 1、Snell定律的矢量形式 折射定律又称Snell定律&#xff0c;主要包括两个方面&#xff1a;一是入射光线、法线和折射光线共面&#xff0c;二是入射角和折射角满足以下关系&#xff1a; n 1 s i n θ 1 n 2 s i n θ 2 n_1 sin{\theta_1…

arm-linux-gnueabihf-gcc:Command not found 解决办法

问题描述 使用虚拟机交叉编译程序&#xff0c;当使用了sudo去编译, 出现arm-linux-gnueabihf-gcc&#xff1a;Command not found的问题。明明已经安装并配置好环境了&#xff0c;发现还是提示找不到编译器。 原因分析&#xff1a; 特意去查了一下sudo方法&#xff0c;我们在sud…

linux中的进程以及进程管理

程序和进程的区别和联系 程序&#xff08;Program&#xff09;&#xff1a; 程序是一组指令的集合&#xff0c;通常存储在磁盘或其他存储设备上&#xff0c;是一种静态的概念。程序本身并没有运行&#xff0c;它只是一个可执行的文件或脚本&#xff0c;包含了一系列的指令和数…

Listary:文件搜索,一键即达

名人说&#xff1a;莫道谗言如浪深&#xff0c;莫言迁客似沙沉。 ——刘禹锡《浪淘沙》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、软件介绍1、Listary2、核心功能 二、下载安装1、下载2、安装 三、使用方…

mysql8.0.19安装zip版本

下载地址https://downloads.mysql.com/archives/community/ 下载版本 下载后解压&#xff0c;不包括data 和my.ini文件。其中data 文件是自动生成的【mysqld --initialize --console】&#xff0c;my.ini需要自己编写设置。 新建my.ini文件 需要自己设置 basedirG:\soft\mysql…

Hubstudio指纹浏览器:海外代理IP新选择,IPXProxy为何备受推崇?

许多人都会把Hubstudio指纹浏览器和代理IP进行搭配使用&#xff0c;为了保证网络操作的顺利进行&#xff0c;例如亚马逊的多账号管理。那有没有好用的海外代理IP呢&#xff0c;如何在Hubstudio指纹浏览器中使用代理IP呢&#xff1f; 下面就给大家推荐好用的一家海外IP代理&…
最新文章