Three.js如何设置旋转轴心【PIVOT】

在使用Three.js开发3D应用时,经常碰到的一个问题就是如何自定义模型的旋转轴心(pivot)。例如下面的立方体,假设建模时的轴心在立方体的中心,但是如果希望立方体绕着某个指定的点旋转(例如图中标红的顶点)该怎么办?

本文将给出两种解决方案:使用Group对象、使用three.pivot.js开发包。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包

1、使用Group对象

一个简单的解决方案是创建一个组(Group)并将网格添加到组中,然后围绕该组旋转。让我们通过实例看一下如何实现。

首先创建网格并添加到场景中:

const geometry = new THREE.BoxGeometry();
const material = new THREE.MeshBasicMaterial({ color: 0xff0000 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube)

现在,它只会绕其中心旋转:

cube.rotation.z = Math.PI / 4

现在创建一个新的组对象并将立方体网格加入组对象:

const group = new THREE.Group();
group.add(cube)
scene.add(group)

此时我们又回到了起点。 现在移动网格:

cube.position.set(0.5,0.5,0)

然后移动组:

group.position.set(-0.5, -0.5, 0)

现在使用组对象进行旋转:

group.rotation.z = Math.PI / 4

搞定!

2、使用three.pivot开发包

使用组对象来调整3D模型的旋转轴心有点麻烦,尤其是当你的场景层级复杂时。更好的解决方案是使用three.pivot.js这个开发包,可以任意设置3D模型的旋转轴心,而且不会改变场景的层级结构:

https://tools.nsdt.cloud/three-pivot

three.pivot.js的使用很简单,导入后使用其 setPivotPoint() 方法设置轴心点即可:

import ThreePiovt from 'three.pivot.js';ThreePivot.setPivotPoint(mesh, new THREE.Vector(-0.5,-0.5,-0.5));

three.pivot.js开发包官方下载地址:NSDT three.pivot.js 。

下面是更完整的演示代码:

import * as THREE from 'three'
import ThreePiovt from './three.pivot.js';.... 省略 render 代码/**创建旋转立方体 cubeRota, 并且应用 three.pivot对立方体设置旋转轴心**/createBox() {// 创建参考立方体 位于原点位置const geometry = new THREE.BoxGeometry(1, 1, 1);const material = new THREE.MeshBasicMaterial({ color: 0xffffff });const cube = new THREE.Mesh(geometry, material);this.scene.add(cube)// 创建旋转立方体 const geometryRota = geometry.clone();const cubeMeaterial = new THREE.MeshStandardMaterial({color: 0xff0000})const cubeRota = new THREE.Mesh(geometryRota, cubeMeaterial);cubeRota.name = 'cubeRota'this.cubeRota = cubeRota;this.scene.add(cubeRota);// 设置旋转轴心const pivotPosition = new THREE.Vector3(-0.5,-0.5,-0.5);ThreePivot.setPivotPoint(cubeRota,pivotPosition);}/** 在animate函数中动态的调整立方体沿y轴的旋转角度**/animate() {this.angle += Math.PI / 180;this.cubeRota.rotation.y = this.anglerequestAnimationFrame(this.animate);if (this.stats) this.stats.update();if (this.controls) this.controls.update();this.renderer.render(this.scene, this.camera);}

原文链接:THREE.JS设置旋转轴心 - BimAnt

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

结构型设计模式——适配器模式

适配器模式 这个更加好理解,就是做适配功能的类,例如,现在手机没有了圆形耳机接口,只有Type-C接口,因此你如果还想要使用圆形耳机的话需要买个圆形接口转Type-C的转换器(适配器),这…

IntelliJ IDEA如何使用固定地址公网远程访问本地Mysql数据库

文章目录 1. 本地连接测试2. Windows安装Cpolar3. 配置Mysql公网地址4. IDEA远程连接Mysql小结 5. 固定连接公网地址6. 固定地址连接测试 IDEA作为Java开发最主力的工具,在开发过程中需要经常用到数据库,如Mysql数据库,但是在IDEA中只能连接本…

CPT203-Software Engineering 笔记

Week 1 -- Introduction failure reason professional software development*** maintain, security, efficiency, acceptability two kinds***: generic, customized software deterioration 软件退化 reduce changes/ side effects after changes software engineering …

Linux信号处理浅析

一、信号从发送到被处理经历的过程 1、常见概念 (1) 信号阻塞 阻塞,即被进程拉黑,信号被发送后,分为两种情况,一种是被阻塞了(被拉黑了),一种是没有被阻塞。 (2) 信号未决 在信号被进程处理…

AI教我学编程之C#入门程序详解与拓展

与AI肩并肩 前言一、一个简单的C#程序补充说明对话AI 二、标识符三、关键字四、Main五、空白1. 缩进2. 代码块的间距3. 操作符的空格4. 换行5. 一致性 六、语句七、从程序输出文本主题:从程序中输出文本1. Write 和 WriteLine 方法2. 格式字符串3. 多重标记和值4. 格…

TinyLog iOS v3.0接入文档

1.背景 为在线教育部提供高效、安全、易用的日志组件。 2.功能介绍 2.1 日志格式化 目前输出的日志格式如下: 日志级别/[YYYY-MM-DD HH:MM:SS MS] TinyLog-Tag: |线程| 代码文件名:行数|函数名|日志输出内容触发flush到文件的时机: 每15分钟定时触发…

CVE-2023-51385 OpenSSH ProxyCommand命令注入漏洞

一、背景介绍 ProxyCommand 是 OpenSSH ssh_config 文件中的一个配置选项,它允许通过代理服务器建立 SSH 连接,从而在没有直接网络访问权限的情况下访问目标服务器。这对于需要经过跳板机、堡垒机或代理服务器才能访问的目标主机非常有用。 二、漏洞简…

面试算法108:单词演变

题目 输入两个长度相同但内容不同的单词(beginWord和endWord)和一个单词列表,求从beginWord到endWord的演变序列的最短长度,要求每步只能改变单词中的一个字母,并且演变过程中每步得到的单词都必须在给定的单词列表中…

算法通关村番外篇-LeetCode编程从0到1系列六

大家好我是苏麟 , 今天带来LeetCode编程从0到1系列六 . 链表相关的题目 , 也是面试热题 . 大纲 21. 合并两个有序链表206. 反转链表 21. 合并两个有序链表 描述 : 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 题目 : Le…

Jetson Orin AGX 64GB更新 Jetpack6.0

Jetson Orin AGX 64GB更新 Jetpack6.0 注意: 1,如果你要向我一样为AGX更新Jetpack6.0的话,它还要求你的ubuntu版本必须是20.04 或22.04 2,安装完SDKmanager后,然后选择对应的设备,根据个人选择勾选是否安装…

深入浅出谈Python机器学习的概念及教学

机器学习学习起来并不复杂,下面我用简单的语言说一说: 1.机器学习的分类 常见的机器学习包括有监督和无监督的学习,有监督学习就是用一堆特征变量(也可以理解为解释变量、因子、自变量)去预测响应变量(也…

强化学习10——免模型控制Q-learning算法

Q-learning算法 主要思路 由于 V π ( s ) ∑ a ∈ A π ( a ∣ s ) Q π ( s , a ) V_\pi(s)\sum_{a\in A}\pi(a\mid s)Q_\pi(s,a) Vπ​(s)∑a∈A​π(a∣s)Qπ​(s,a) ,当我们直接预测动作价值函数,在决策中选择Q值最大即动作价值最大的动作&…