three.js之多线条组合

news2024/11/26 0:37:22

文章目录

  • 多线条组合
    • 例子

专栏目录请点击

多线条组合

我们可以通过CurvePath把多个曲线、直线等合并成一个曲线

例子

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <style>
        body {
            margin: 0;
            overflow: hidden;
            /* 隐藏body窗口区域滚动条 */
        }
    </style>
    <!--引入three.js三维引擎-->
    <script src="http://www.yanhuangxueyuan.com/versions/threejsR92/build/three.js"></script>
    <!-- 引入threejs扩展控件OrbitControls.js -->
    <script src="http://www.yanhuangxueyuan.com/versions/threejsR92/examples/js/controls/OrbitControls.js"></script>
</head>

<body>
    <script>
        /**
         * 创建场景对象Scene
         */
        var scene = new THREE.Scene();
        /**
         * 创建网格模型
         */
        var geometry = new THREE.Geometry(); //声明一个几何体对象Geometry
        // 绘制一个U型轮廓
        var R = 80;//圆弧半径
        var arc = new THREE.ArcCurve(0, 0, R, 0, Math.PI, true);
        // 半圆弧的一个端点作为直线的一个端点
        var line1 = new THREE.LineCurve(new THREE.Vector2(R, 200, 0), new THREE.Vector2(R, 0, 0));
        var line2 = new THREE.LineCurve(new THREE.Vector2(-R, 0, 0), new THREE.Vector2(-R, 200, 0));
        // 创建组合曲线对象CurvePath
        var CurvePath = new THREE.CurvePath();
        // 把多个线条插入到CurvePath中
        CurvePath.curves.push(line1, arc, line2);
        //分段数200
        var points = CurvePath.getPoints(200);
        // setFromPoints方法从points中提取数据改变几何体的顶点属性vertices
        geometry.setFromPoints(points);
        //材质对象
        var material = new THREE.LineBasicMaterial({
            color: 0x000000
        });
        //线条模型对象
        var line = new THREE.Line(geometry, material);
        scene.add(line); //线条对象添加到场景中
        /**
         * 光源设置
         */
        //点光源
        var point = new THREE.PointLight(0xffffff);
        point.position.set(400, 200, 300); //点光源位置
        scene.add(point); //点光源添加到场景中
        //环境光
        var ambient = new THREE.AmbientLight(0x444444);
        scene.add(ambient);
        /**
         * 相机设置
         */
        var width = window.innerWidth; //窗口宽度
        var height = window.innerHeight; //窗口高度
        var k = width / height; //窗口宽高比
        var s = 150; //三维场景显示范围控制系数,系数越大,显示的范围越大
        //创建相机对象
        var camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000);
        camera.position.set(200, 300, 200); //设置相机位置
        camera.lookAt(scene.position); //设置相机方向(指向的场景对象)
        /**
         * 创建渲染器对象
         */
        var renderer = new THREE.WebGLRenderer();
        renderer.setSize(width, height); //设置渲染区域尺寸
        renderer.setClearColor(0xb9d3ff, 1); //设置背景颜色
        document.body.appendChild(renderer.domElement); //body元素中插入canvas对象

        // 渲染函数
        function render() {
            renderer.render(scene, camera); //执行渲染操作
        }
        render();
        //创建控件对象  相机对象camera作为参数   控件可以监听鼠标的变化,改变相机对象的属性
        var controls = new THREE.OrbitControls(camera, renderer.domElement);
        //监听鼠标事件,触发渲染函数,更新canvas画布渲染效果
        controls.addEventListener('change', render);
    </script>
</body>

</html>

渲染如下

在这里插入图片描述

我们可以观察带代码中,我们一共设置了三条线

  1. 一个圆弧
var R = 80;//圆弧半径
var arc = new THREE.ArcCurve(0, 0, R, 0, Math.PI, true);
  1. 两条直线
// 半圆弧的一个端点作为直线的一个端点
var line1 = new THREE.LineCurve(new THREE.Vector2(R, 200, 0), new THREE.Vector2(R, 0, 0));
var line2 = new THREE.LineCurve(new THREE.Vector2(-R, 0, 0), new THREE.Vector2(-R, 200, 0));
  1. 然后我们创建了组合对象,并把三条线组合到了一起
// 创建组合曲线对象CurvePath
var CurvePath = new THREE.CurvePath();
// 把多个线条插入到CurvePath中
CurvePath.curves.push(line1, arc, line2);
  1. 然后分段设置点到结合体进行渲染
//分段数200
var points = CurvePath.getPoints(200);
// setFromPoints方法从points中提取数据改变几何体的顶点属性vertices
geometry.setFromPoints(points);

这样我们就得到了一条多条线条组合的曲线

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS习题解答

文章目录1.1 样式定义方式1.2 选择器1.3 颜色1.4 文本1.5 字体1.6 背景1.7 边框1.8 元素展示格式1.9 内边距与外边距1.10 盒子模型1.11 位置1.12 浮动实战&#xff1a;个人名片1.13 flex布局1.14 响应式布局作业01作业02作业03作业04作业05作业06作业07作业08作业09作业10其他1…

正则表达式学习

文章目录入门开始和结束字符组区间特殊字符转义取反快捷匹配数字和字母匹配空白任意字符重复次数和区间或者条件进阶分组非捕获分组分组的引用正向先行断言反向先行断言正向后行断言反向后行断言常用元字符整理相关网站在线测试网站题目练习网站其他笔记入门 开始和结束 正则…

计算机毕设Python+Vue学生量化考核系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Python中groupby函数详解(非常容易懂)

目录&#xff1a;Python中的groupby函数一、groupby 能做什么&#xff1f;二、单类分组2.1 创建数据集三、多类分组一、groupby 能做什么&#xff1f; groupby函数主要的作用是进行数据的分组以及分组后地组内运算&#xff01; 于数据的分组和分组运算主要是指groupby函数的应…

网络安全等级保护十问十答

网络安全等级保护十问十答1.什么是等级保护&#xff1f;2.为什么需要等级保护&#xff1f;3.目标客户是&#xff1f;4.等保工作步骤包括什么&#xff1f;5.等保测评结论有几种结果&#xff1f;6.等保如何定级&#xff1f;7. 定级对象在哪备案&#xff1f;8. 等级保护都测评什么…

[附源码]计算机毕业设计Node.js宠物商店网站(程序+LW)

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

Opencv(C++)笔记--Sobel算子

1--Sobel算子 1-1--原理 Sobel算子的构成如下图所示&#xff1a; 基于 Sobel 算子可以实现对图像的边缘检测&#xff0c;Gx常用于提取纵向边缘&#xff0c;Gy则常用于提取横向边缘&#xff1b; 1-2--Opencv API 在 ddeth 参数上&#xff0c;使用 cv::CV_16S 处理 8 位原图像&…

jsp+ssm计算机毕业设计高校班主任班级管理系统【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

跨模态检索的简单实现(pytorch)

目录说明说明往期文章和专栏代码及数据集下载什么是跨模态检索代码导入需要的库构建图像、文本子网络加载数据集计算mAP损失函数构建总损失函数训练部分主函数参数设置查看结果说明 说明 还是读研时候剩下的代码&#xff0c;是我从几篇论文里面摘出来的代码做了简单的拼装&am…

SCN时间序列预测模型详解(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 SCN&#xff08;System Change Number 简称 SCN&#xff09;是当Oracle数据库更新后&#xff0c;由DBMS自动维护去累积递增的一…

数据结构链式栈

上一节我们学习了顺序栈 我们了解到栈就是特殊的线性表 我们之前用过顺序表实现了栈 那么我们也可以用单链表的方式来实现一个链式栈 我们可以回顾一下单链表的结构 基础数据结构链表_iccoke的博客-CSDN博客 我们可以看到简单的对尾部进行操作 很难实现时间复杂度达到O&am…

JdbcTemplate

JdbcTemplateJdbcTemplate &#xff08;概念和准备&#xff09;1. 什么是 JdbcTemplate&#xff08;1&#xff09; Spring 框架对 JDBC 进行封装&#xff0c;使用 JdbcTemplate 方便实现对数据库操作2. 准备工作&#xff08;1&#xff09;配置文件的准备&#xff08;2&#xff…

100份PDF合并还不到3分钟,这2个方法非常简单,请低调使用

PDF文件作为我们工作中最为常见的“文件格式”之一。似乎哪里都有它的身影&#xff0c;有时我们还需要对PDF文件进行编辑和处理。那么&#xff0c;在众多PDF编辑和处理操作上&#xff0c;PDF合并可以算得上使用频率很高的存在。不过大多数小伙伴们并不清楚具体的操作方式是怎样…

Feign的另一种玩法-动态Feign

1.Feign传统方式的不足 ①.在微服务架构中,当我们使用Feign传统方式进行服务调用的时候,需要在每个服务消费者中添加FeignClient接口,编写对应的方法,而且当服务生产者Handler新增方法之后,服务消费者也要在FeignClient接口中添加方法,这样的话,会有些累赘. 那么能不能在调用服…

[附源码]计算机毕业设计Node.js畅玩电竞网咖购物点餐网站(程序+LW)

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

R语言 线性混合效应模型实战案例

介绍 最近我们被客户要求撰写关于性混合效应模型的研究报告&#xff0c;包括一些图形和统计输出。首先&#xff0c;请注意&#xff0c;围绕多层次模型的术语有很大的不一致性。例如&#xff0c;多层次模型本身可能被称为分层线性模型、随机效应模型、多层次模型、随机截距模型…

web大学生网页作业成品 蛋糕店美食餐饮网站设计与实现(HTML+CSS+JavaScript)

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

代码随想录训练营第54天|LeetCode 392.判断子序列、115.不同的子序列

参考 代码随想录 题目一&#xff1a;LeetCode 392.判断子序列 确定dp数组及其下标的含义 dp[i][j]&#xff1a;s字符串中0&#xff5e;i字符构成的子串和t字符串中0&#xff5e;j字符构成的子串的最长公共子序列的长度。 确定递推公式 dp[i][j]有两个可能的来源&#xff1a;…

内点法求最优潮流和微电网调度(风、光、蓄电池、燃油机)(Matlab实现)

目录 1 概述 2 案例 2.1算例描述 2.2 数据 3 一点小知识 4 Matlab代码实现 1 概述 由于电力系统本身的复杂性,电力潮流优化具有规模大,约束条件多和非线性的特点。通过对最优潮流的求解,最终达到优化已有资源、降低发电厂耗量成本、减少电网线路损耗、提高电力系统输电…

JSON的定义、基本使用、以及和对象之间的相互转换

json的定义与基本使用 <script>//定义jsonvar json{"name" : "张三","age" : "18岁","addr" : ["北京","上海","天津"]}//获取数据console.log(json.age)console.log(json.name)consol…