3.js - 运动曲线

news2024/11/18 19:30:48

这个球,绕着这个红色的线圈转

在这里插入图片描述

代码


import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'

let scene,
  camera,
  renderer,
  controls = null

let moon,
  earth = null

// 根据,一系列的点,创建曲线
let curve

const textureLoader = new THREE.TextureLoader()

const clock = new THREE.Clock()

const onWindowResize = () => {
	// 重置相机的宽高比
	camera.aspect = window.innerWidth / window.innerHeight
	// 更新相机的投影矩阵
	camera.updateProjectionMatrix()
	
	// 重置渲染器的宽高比
	renderer.setSize(window.innerWidth, window.innerHeight)
	// 更新渲染器的像素比
	renderer.setPixelRatio(window.devicePixelRatio)
}

const render = () => {
	requestAnimationFrame(render)
	
	const elapsed = clock.getElapsedTime()
	let time = (elapsed /10) % 1
	const point = curve.getPoint(time)
	// console.log('point=', point) // Vector3 {x: -10, y: 0, z: 10}
	
	// 情况一,moon绕着地球转
	// moon.position.set(Math.sin(elapsed) * 5, 0, Math.cos(elapsed) * 5)
	
	// 情况二,moon绕着咱画的线转
	moon.position.copy(point)
	
	// camera.position.copy(point)
	// camera.lookAt(earth.position)
	
	renderer.render(scene, camera)
}

const init = () => {
	const EARTH_RADIUS = 1
	const MOON_RADIUS = 0.27

	scene = new THREE.Scene()
	
	camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 200)
	// camera.position.set(0, 0, 3)
	camera.position.set(0, 5, -10)
	scene.add(camera)
	
	const directionLight = new THREE.DirectionalLight(0xffffff) // 平行光
	directionLight.position.set(0, 0, 1)
	scene.add(directionLight)
	const light = new THREE.AmbientLight(0xffffff, 0.5) // 环境光
	scene.add(light)

	// 添加地球
	const earthGeometry = new THREE.SphereGeometry(EARTH_RADIUS, 16, 16)
	const earthMaterial = new THREE.MeshPhongMaterial({
		map: textureLoader.load('../public/assets/texture/planets/earth_atmos_2048.jpg'),
		specularMap: textureLoader.load('../public/assets/texture/planets/earth_specular_2048.jpg'),
		specular: 0x333333, // 高光部分的颜色,默认值:0x111111(深灰色)
		shininess: 5, // 高光反射效果的锐利程度,该值越大,高光区域越小且更亮。默认值为30。
		normalMap: textureLoader.load('../public/assets/texture/planets/earth_normal_2048.jpg'),
		normalScale: new THREE.Vector2(0.85, 0.85)
	})
	earth = new THREE.Mesh(earthGeometry, earthMaterial)
	scene.add(earth)
	
	// 添加月球
	const moonGeometry = new THREE.SphereGeometry(MOON_RADIUS, 16, 16)
	const moonMaterial = new THREE.MeshPhongMaterial({
		map: textureLoader.load('../public/assets/texture/planets/moon_1024.jpg'),
		shininess: 5
	})
	moon = new THREE.Mesh(moonGeometry, moonMaterial)
	// moon.position.x = 3
	scene.add(moon)

	//-------------------------------------------------------------------------------

	// 根据,一系列的点,创建曲线【参数true:表示曲线是封闭的】
	curve = new THREE.CatmullRomCurve3([new THREE.Vector3(-10, 0, 10), new THREE.Vector3(-5, 5, 5), new THREE.Vector3(0, 0, 5), new THREE.Vector3(5, -5, 5), new THREE.Vector3(10, 0, 10)], true)
	
	// 在曲线里,使用`getPoints()`,获取51个点
	const points = curve.getPoints(600)
	// console.log('points=', points) // 一个,包含600个Vector3元素的数组
	const geometry = new THREE.BufferGeometry().setFromPoints(points)
	const material = new THREE.LineBasicMaterial({ color: 0xff0000 })
	const curveObject = new THREE.Line(geometry, material)
	scene.add(curveObject)
	
	//-------------------------------------------------------------------------------
	
	renderer = new THREE.WebGLRenderer()
	renderer.setSize(window.innerWidth, window.innerHeight)
	document.body.appendChild(renderer.domElement)
	
	controls = new OrbitControls(camera, renderer.domElement)
	controls.minDistance = 5 // 相机可以离目标对象的最小距离为5个单位(意味着,用户无法将相机拉得太近)
	controls.maxDistance = 100 // 相机可以离目标对象的最大距离为100个单位(意味着,限制了用户可以将相机拉远的最大距离)
	
	window.addEventListener('resize', onWindowResize)
}

init()
render()



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

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

相关文章

活动报名丨智源Workshop,从o1出发探索LLM推理与思维链

近期o1模型的发布,预示着AI在处理高度复杂问题上再次迈出一大步。大规模强化学习算法在一个数据极高的训练过程中,教会了模型如何利用其思维链进行富有成效的思考。 北京时间9月19日(本周四)晚7点,智源社区将组织「智源…

响应式布局-媒体查询父级布局容器

1.响应式布局容器 父局作为布局容器,配合自己元素实现变化效果,原理:在不通过屏幕下面吗,通过媒体查询来改变子元素的排列方式和大小,从而实现不同尺寸屏幕下看到不同的效果。 2.响应尺寸布局容器常见宽度划分 手机-…

Vue 中 watch 的使用方法及注意事项

前言 Vue 的 Watch 是一个非常有用的功能,它能够监听 Vue 实例数据的变化并执行相应的操作。本篇文章将详细介绍 Vue Watch 的使用方法和注意事项,让你能够充分利用 Watch 来解决 Vue 开发中的各种问题。 1. Watch 是什么? 1.1 Watch 的作…

[js逆向学习] fastmoss电商网站——店铺排名

逆向目标 网站:https://www.fastmoss.com/shop-marketing/tiktok接口:https://www.fastmoss.com/api/shop/shopList/参数:fm-sign 逆向分析 我们今天要分析的是店铺排名,先分析网络请求,找到目标接口 按照上图操作…

Redis: 特点,优势,与其他产品的区别以及高并发原理

入门Redis概述 1 )选择Redis是因为其高性能 因为 Redis 它数据存储的机制是存在内存中的,减少了传统关系数据库的磁盘IO它是单线程的保证了原子性,它还提供了事务,锁等相关的机制 2 )Redis 环境安装配置 linux 或 d…

STM32 map 文件浅析

目录 一、概述二、Section Cross References三、Removing Unused input sections from the image四、Memory Map of the image1、Local Symbols2、全局符号(Global Symbols) 五、Image Symbol Table六、Image component sizes 一、概述 .map 文件是编译…

Shader Graph Create Node---Input

四、Input 1、Basic 一些基础的变量节点 2、Geometry 1)、Bitangent Vector(双切线向量) 通常与顶点位置、法线向量和切线向量一起使用。 法线向量(Normal Vector):垂直于表面的向量。 切线向量(Tangent Vector)…

Vue3项目开发——新闻发布管理系统(八)

文章目录 十、新闻管理模块设计开发1、新闻管理主页面设计1.1 基本架构搭建1.1.1 搜索表单1.1.2 新闻主表格样式(静态数据模拟渲染)1.2 新闻分类选择框1.2.1 新建组件1.2.2 页面中导入渲染1.2.3 调用接口,动态渲染下拉分类,设计成 v-model 的使用方式1.2.4 父组件定义参数绑定…

共建智能座舱AI应用生态 夸克合作斑马智行开拓AI搜索新场景

近日,在2024云栖大会上,夸克与斑马智行达成合作,将面向汽车座舱场景,为用户打造专属AI新体验。夸克以AI搜索为中心的一站式AI服务融入座舱数字化生态,进一步拓展使用场景和能力边界。 9月20日,斑马智行发布…

【Geoserver使用】REST API调用(工作空间部分)

文章目录 前言一、Geoserver REST API(GeoServer Workspace)二、GeoServer Workspace接口使用1.GET请求 /workspaces2.POST请求 /workspaces3.GET请求 /workspaces/{workspaceName}4.PUT /workspaces/{workspaceName}5.DELETE /workspaces/{workspaceName} 总结 前言 根据Geos…

【Day20240924】联邦学习中的方法 改进

文章目录 前言一、FedAvg二、FedProx三、MOON四、FedDyn五、FedAsync六、PORT七、ASO-Fed八、FedBuff九、FedSA 前言 几种异步的方法: FedAsync PORT ASO-Fed FedBuff FedSA 几种同步的方法: FedAvg FedProx MOON FedDyn 一、FedAvg FedAvg基本步骤&a…

MySQL 中存储过程参数的设置与使用

《MySQL 中存储过程参数的设置与使用》 在 MySQL 数据库中,存储过程是一组预先编译好的 SQL 语句集合,可以接受参数并返回结果。使用存储过程可以提高数据库的性能和可维护性,同时也可以减少网络流量和代码重复。那么,如何在 MyS…

UEFI EDK2框架学习 (一)

01 Shell界面打印 执行qemu指令后 qemu-system-x86_64 -drive ifpflash,formatraw,fileOVMF.fd -nographic -net none出现shell界面 02 在UEFI shell中创建APP 创建SimplestApp文件夹以及SimplestApp.c、SimplestApp.inf cd edk2 mkdir SimplestAppuuidgen // generate …

ABB 机器人与 Profinet 转 EthernetIP 网关的高效连接

Profinet转EthernetIP网关在工业自动化领域发挥着至关重要的作用。它主要的功能就是实现不同网络协议之间的数据交互,为各种设备的连接与协同工作搭建了桥梁。 以连接ABB机器人为例,Profinet转EthernetIP网关能够将ABB机器人高效地接入到不同的网络系统…

transformer模型写诗词

加入会员社群,免费获取本项目数据集和代码:点击进入>> 1. 项目简介 该项目是基于A035-transformer模型的诗词生成系统,旨在通过深度学习技术实现古诗词的自动化创作。项目的背景源自当前自然语言处理领域的迅速发展,特别是…

工业交换机故障快速排查的方法有哪些

在现代工业自动化的环境中,工业交换机作为网络连接的重要设备,其稳定性和可靠性至关重要。然而,实际使用过程中难免会遇到各种故障,这对生产线和系统的正常运作造成了影响。为了有效应对这些问题,下面将介绍一些工业交…

第P8周:YOLOv5-C3模块实现

本文为🔗365天深度学习训练营 中的学习记录博客原作者:K同学啊 本次将利用YOLOv5算法中的C3模块搭建网络。 我的环境: ●操作系统:ubuntu 22.04 ●GPU显卡:RTX 3090(24GB) * 1 ●语言环境:python 3.12.3 ●编译器&…

鸿蒙开发的基本技术栈及学习路线

随着智能终端设备的不断普及与技术的进步,华为推出的鸿蒙操作系统(HarmonyOS)迅速引起了全球的关注。作为一个面向多种设备的分布式操作系统,鸿蒙不仅支持手机、平板、智能穿戴设备等,还支持IoT(物联网&…

python安装本地的.whl文件报错:Neither ‘setup.py’ nor ‘pyproject.toml’ found

前言 本文章所说的是笔者安装时遇到了报错,查阅相关资料后解决了这个问题,不一定会解决大家的问题。 正文 我参考了这篇文章,但还是没有解决问题。之后我尝试把该.whl文件放到anaconda文件夹中(D:\Anaconda\envs)&a…

干货 | 图像分割概述 ENet 实例

本文为 AI 研习社编译的技术博客,原标题 : Image Segmentation Overview & ENet Implementation 作者 | Aviv Shamsian 翻译 | sherry3255、alexchung 校对 | 邓普斯杰弗 审核 | 酱番梨 整理 | 立鱼王 原文链接: https://medium.com/mist…