threejs (三) 几何体

定义:用来表示物体的形状,可以定义物体的大小,可以被缩放、旋转和平移
内置几何体:

  • 二维几何体:PlaneGeometry矩形平面、CircleGeometry圆形平面、RingGeometry环形平面、ShapeGeometry二维图形
  • 三维几何体:BoxGeometry立方体、TetrahedronGeometry多面体、SphereGeometry球体、ConeGeometry圆锥、CylinderGeometry圆柱、TorusGeometry圆环
  • 路径合成几何体:TubeGeometry管道、LatheGeometry车削、ExtrudeGeometry挤压
  • 线性几何体:WireframeGeometry网格几何体、EdgesGeometry边缘几何体

创建几何体

const plane = new THREE.PlaneGeometry(2, 2); // 创建长宽为2x2的平面

const material = new THREE.MeshLambertMaterial({
  color: '#1890ff',
});
// 生成物体对象
const mesh = new THREE.Mesh(plane, material);

BufferGeometry

const geometry = new THREE.BufferGeometry();
// 创建简单的矩形. 在这里我们左上和右下顶点被复制了两次。
const vertices = new Float32Array([
  -1.0, -1.0,  1.0, // 第1个顶点 (xyz)
  1.0, -1.0,  1.0, // 第2个顶点 (xyz)
  1.0,  1.0,  1.0, // 第3个顶点 (xyz)

  1.0,  1.0,  1.0, // 第4个...
  -1.0,  1.0,  1.0,
  -1.0, -1.0,  1.0,
]);

// 第二个参数 3 表示每个顶点都是三个值构成。
geometry.setAttribute('position', new THREE.BufferAttribute(vertices, 3)); // 这里是告诉几何体这组数据就是顶点的坐标信息

// 设置表面颜色
const material = new THREE.MeshBasicMaterial({
  color: '#1890ff',
  // wireframe: true,
});

合并几何体

		// 把小车变成一个整体,方法一:group 存mesh对象 方便操作各个对象
        const group = new THREE.Group();
        group.add(car, wheel1, wheel2, wheel3, wheel4, light1, light2);
        group.position.y = 0.2;
        this.group = group;

        // 把小车变成一个整体,方法二:合并为一个Geometry
        // const geometry = mergeBufferGeometries([carGeometry, wheelGeometry]);
        // const mesh = new THREE.Mesh(geometry,material);
        this.scene.add(group);

小车行驶动画

createObjects() {
        const carGeometry = new THREE.BoxGeometry(2, 0.2, 1);
        const material = new THREE.MeshLambertMaterial({ color: 0x1890ff });
        const car = new THREE.Mesh(carGeometry, material);

        // 车轮
        const wheelGeometry = new THREE.CylinderGeometry(0.2, 0.2, 0.3, 10);
        const wheelMaterial = new THREE.MeshBasicMaterial({ color: 0xff00ff });
        const wheel1 = new THREE.Mesh(wheelGeometry, wheelMaterial);
        const wheel2 = new THREE.Mesh(wheelGeometry, wheelMaterial);
        const wheel3 = new THREE.Mesh(wheelGeometry, wheelMaterial);
        const wheel4 = new THREE.Mesh(wheelGeometry, wheelMaterial);
        wheel1.name = 'wheel';
        wheel2.name = 'wheel';
        wheel3.name = 'wheel';
        wheel4.name = 'wheel';
        wheel1.position.set(-0.5, 0, 0.4);
        wheel1.rotation.x = -Math.PI / 2;
        wheel2.position.set(0.5, 0, 0.4);
        wheel2.rotation.x = -Math.PI / 2;
        wheel3.position.set(-0.5, 0, -0.4);
        wheel3.rotation.x = -Math.PI / 2;
        wheel4.position.set(0.5, 0, -0.4);
        wheel4.rotation.x = -Math.PI / 2;

        const lightGeometry = new THREE.BoxGeometry(0.1, 0.1, 0.1);
        const lightMaterial = new THREE.MeshBasicMaterial({
          color: 0xffff00,
        });
        const light1 = new THREE.Mesh(lightGeometry, lightMaterial);
        const light2 = new THREE.Mesh(lightGeometry, lightMaterial);
        light1.position.set(-1.05, 0, 0.2);
        light2.position.set(-1.05, 0, -0.2);

        // 把小车变成一个整体,方法一:group 存mesh对象 方便操作各个对象
        const group = new THREE.Group();
        group.add(car, wheel1, wheel2, wheel3, wheel4, light1, light2);
        group.position.y = 0.2;
        this.group = group;

        // 把小车变成一个整体,方法二:合并为一个Geometry
        // const geometry = mergeBufferGeometries([carGeometry, wheelGeometry]);
        // const mesh = new THREE.Mesh(geometry,material);
        this.scene.add(group);
      },
       runCar() {
        // console.log(this.group.children);
        const { children } = this.group;
        const delta = 4;
        // 假设一帧走delta度  一周的长度:2 * Math.PI * 0.2
        const speed = ((2 * Math.PI * 0.2) / 360) * delta;
        for (const i in children) {
          const mesh = children[i];
          if (mesh.name === 'wheel') {
            // 把度数转为弧度
            mesh.rotation.y += THREE.MathUtils.radToDeg(delta);
          }
        }
        this.group.position.x -= speed;
        if (this.group.position.x < -10) {
          this.group.position.x = 10;
        }
      },

在这里插入图片描述

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

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

相关文章

阿里云通用算力型u1服务器和e实例有什么区别?选择攻略

阿里云服务器ECS经济型e实例和通用算力型u1实例有什么区别&#xff1f;如何选择&#xff1f;ECS经济型e实例是共享型云服务器&#xff0c;通用算力型u实例是企业级独享型云服务器&#xff0c;e实例性价比高&#xff0c;现在2核2G3M带宽一年99元&#xff0c;云服务器u1价格相对要…

腾讯云新用户优惠服务器汇总,腾讯云新用户值得买的云服务器推荐

在双11期间&#xff0c;市面上出现了各种云服务器活动机型&#xff0c;价格低廉&#xff0c;适合刚需或囤货用户。这些云服务器不仅拥有高性能和稳定性&#xff0c;还具备弹性扩展能力&#xff0c;能够满足各类用户的需求。 腾讯云作为国内领先的云计算服务提供商&#xff0c;…

Sonatype Nexus部署docker安装nexus3

Nexus是一个强大的Maven仓库管理器&#xff0c;它极大地简化了自己内部仓库的维护和外部仓库的访问。 1、查看可用的 Nexus3版本 可以通过 Sort by 查看其他版本的 nexus3&#xff0c;默认是最新版本 sonatype/nexus3:latest。 https://hub.docker.com/r/sonatype/nexus3/tags…

社交媒体可持续性挑战:TikTok的危机与应对

随着社交媒体的全球普及&#xff0c;TikTok已成为一个备受欢迎的短视频平台&#xff0c;吸引了数以亿计的用户。然而&#xff0c;在其增长和成功背后&#xff0c;也伴随着一系列可持续性挑战。本文将深入探讨TikTok面临的可持续性问题&#xff0c;以及它如何应对这些挑战&#…

Linux编译器---gcc/g++的使用

一、背景知识 在Linux系统中&#xff0c;GCC是一个非常重要的工具&#xff0c;因为它使得开发者可以使用C和C等语言编写高性能的程序。它主要包括四个方面&#xff1a; 预处理&#xff08;进行宏替换) 编译&#xff08;生成汇编) 汇编&#xff08;生成机器可识别代码&#xff0…

springboot vue mysql的在线竞拍拍卖系统

基于SpringBoot的在线拍卖系统,springboot vue mysql (毕业论文10168字以上,共34页,程序代码,MySQL数据库) 【运行环境】 IDEA, JDK1.8, Mysql, Node, Vue 【技术栈】 Java, SpringBoot, Jquery, Layui, MYSQL, HTML, CSS, JAVASCRIPT, Ajax 7707 java毕业设计 springboot v…

JTS: 19 IndexedPointInAreaLocator 判断是否在点在面的内部

文章目录 版本代码 版本 org.locationtech.jts:jts-core:1.19.0 链接: github 代码 package pers.stu.algorithm;import org.locationtech.jts.algorithm.locate.IndexedPointInAreaLocator; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom…

web 自动化测试,这8 个核心知识点,你一定得掌握

使用 cypress 进行端对端测试&#xff0c;和其他的一些框架有一个显著不同的地方&#xff0c;它使用 JavaScript 作为编程语言。 传统主流的 selenium 框架是支持多语言的&#xff0c;大多数 QA 会的 python 和 Java 语言都可以编写 selenium 代码&#xff0c;遇到需要编写 js…

一文详解进销存管理系统!

一、什么是进销存管理系统&#xff1f; 进销存软件是一种针对制造业企业设计的管理软件系统&#xff0c;旨在协调和优化企业的生产、采购、销售以及库存管理等方面的活动。该系统的主要目标是提高企业的生产效率、降低库存成本、优化供应链&#xff0c;并增强企业的整体运营效…

【中间件篇-Redis缓存数据库08】Redis设计、实现、redisobject对象设计、多线程、缓存淘汰算法

Redis的设计、实现 数据结构和内部编码 type命令实际返回的就是当前键的数据结构类型&#xff0c;它们分别是&#xff1a;string(字符串)hash(哈希)、list(列表)、set(集合)、zset (有序集合)&#xff0c;但这些只是Redis对外的数据结构。 实际上每种数据结构都有自己底层的…

<MySQL> MySQL中查询(retrieve)数据的基础操作

目录 一、查询&#xff08;retrieve&#xff09; 1.1 查询数据的方式概述 二、全列查询 2.1 语法 2.2 操作演示 2.3 全列查询需要慎重使用 三、指定列查询 3.1 语法 3.2 操作演示 四、表达式查询 4.1 语法 4.2 操作演示 4.3 null 参与表达式计算 4.3 表达式查询存…

【Proteus仿真】【Arduino单片机】简易计算器设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用PCF8574、LCD1602液晶、4*4矩阵键盘等。 主要功能&#xff1a; 系统运行后&#xff0c;操作矩阵按键可实现简单四则运算。 二、软件设计 /* …

JDK并发修改异常的一个“BUG“

很多电商公司早期的架构都是基于PHP&#xff0c;所以我身边会有很多很厉害的PHP老哥&#xff0c;但现在都在写Java。昨天看到他在看Java的并发修改异常&#xff0c;正打算秀一波操作&#xff0c;却被他的一个问题难住了&#xff1a; public class ForeachTest {public static …

高防IP可以抵御哪些恶意攻击

高防IP协议可以隐藏用户的站点&#xff0c;使得攻击者无法发现恶意攻击的目标网络资源&#xff0c;从而提高了源站的安全性。能够有效抵御常见的恶意攻击类型ICMPFlood、UDPFlood、 TCPFlood、SYNFlood、ACKFlood等&#xff0c;帮助游戏、金 融、电子商务、互联网、政企等行业抵…

centos7 在线安装python3

在线安装命令 yum install -y python3 输入命令之后等待安装完成 查看版本 查看版本3 输入命令 python3 看到版本号为3.6.8 查看版本2 输入命令 python2 看到版本号为2.7.5

Java基础——方法参数值的传递机制

方法必须由其所在类或对象调用才有意义。 形参&#xff1a;方法声明时的参数。实参&#xff1a;方法调用时实际传给形参的参数值。 Java中方法的参数传递方式只有一种&#xff1a;值传递&#xff08;即将实际参数值得副本传入方法内&#xff09; 形参是基本数据类型&#xf…

「我在淘天做技术」假如你五行属商家,如何算好账?

给讲讲大家淘天淘工厂财务开发的相关内容。 财务开发好陌生&#xff0c;是什么&#xff1f;好了&#xff0c;现在假如你五行属商家&#xff0c;并且就在淘宝上卖东西。当消费者买了你的东西&#xff0c;淘宝是不是需要给你结算这笔交易订单的钱&#xff0c;另外淘宝是不是还要收…

阿里全系产品崩上了热搜,我是有些失望的

双十一刚刚过&#xff0c;没想到阿里巴巴全系产品却又崩上热搜了。看来阿里的不少程序员同学今天又是在加班中度过了&#xff0c;心疼&#xff0c;希望你们把班加了就可以了&#xff0c;锅就别背了。 据了解&#xff0c;截至目前&#xff0c;本次修复进展如下&#xff1a; 17:…

7.现代卷积神经网络3-GPT版

#pic_center R 1 R_1 R1​ R 2 R^2 R2 目录 知识框架No.1 深度卷积神经网络 AlexNet一、AlexNet1、AlexNet2、机器学习3、几何学4、特征工程5、HardWare6、数据集7、AlexNet的改进的地方8、AlexNet架构-卷积池化9、AlexNet架构-卷积池化10、AlexNet架构-全连接层11、更多改变细…

React Native简介 说明为什么要学习React Native

首先 什么是 React Native &#xff1f; React Native 是 Facebook 在 React.js Conf 2015 上推出了开源框架 React Native (简称 RN)是 React 的一个原生 (Native) 扩展 它允许我们通过 React 语法&#xff0c;来开发ios 和Android 原生应用 简单说 由Facebook发布 是一种Re…