threejs --本地坐标和世界坐标 --欧拉角和四元数

threejs中的本地坐标和世界坐标

本地(局部)坐标和世界坐标

// mesh的世界坐标就是mesh.position与group.position的累加
const mesh = new THREE.Mesh(geometry, material); 
mesh.position.set(50, 0, 0);
const group = new THREE.Group();
group.add(mesh);
group.position.set(50, 0, 0);

改变子对象的.position,子对象在3D空间中的坐标会发生改变。

改变父对象的.position,子对象在3D空间中的位置也会跟着变化,也就是说父对象.position和子对象.position叠加才是才是子对象的.position。

任何一个模型的本地坐标(局部坐标)就是模型的.position属性。

一个模型的世界坐标,说的是,模型自身.position和所有父对象.position累加的坐标。

.getWorldPosition()获取世界坐标

mesh.getWorldPosition(Vector3)读取一个模型的世界坐标,并把读取结果存储到参数Vector3中。

// 声明一个三维向量用来表示某个坐标
const worldPosition = new THREE.Vector3();
// 获取mesh的世界坐标,你会发现mesh的世界坐标受到父对象group的.position影响
mesh.getWorldPosition(worldPosition);
console.log('世界坐标',worldPosition);
console.log('本地坐标',mesh.position);

给子对象添加一个局部坐标系

mesh.add(坐标系)给mesh添加一个局部坐标系。

//可视化mesh的局部坐标系
const meshAxesHelper = new THREE.AxesHelper(50);
mesh.add(meshAxesHelper);

欧拉角(Euler angles)

欧拉角是用来描述一个坚硬物体在三维空间中的方向的一组角度。它是基于旋转定理,该定理表明任何旋转或朝向都可以通过围绕三个正交轴(通常是 X、Y 和 Z 轴)的顺序旋转来实现。
在刚体的问题上,xyz坐标系是全局坐标系, XYZ 坐标系是局部坐标系。全局坐标系是不动的;而局部坐标系牢嵌于刚体内。

一个物体的欧拉角通常定义为三个独立的角度,分别对应于沿着三个主轴的旋转:

  • Heading (偏航角): 通常表示围绕 Y 轴的旋转。
  • Attitude (俯仰角): 表示围绕横向轴的旋转,X 轴。
  • Bank (滚转角): 表示围绕纵轴的旋转,Z 轴。
    欧拉角的旋转顺序决定了旋转轴的使用方式和顺序,这在计算和解释角度时至关重要。在 Three.js 中默认的旋转顺序是“XYZ”,但也可以调整为其他顺序,如“YZX”、“ZXY”等。

欧拉角的范围可以根据具体定义有所不同。例如,在飞机的飞行动力学中:

  • 偏航角(heading)通常在 [0°, 360°) 或者 [-180°, 180°) 的范围内。
  • 俯仰角(attitude)一般在 [-90°, 90°] 的范围内,超过这个范围会导致万向节锁。
  • 滚转角(bank)通常在 [0°, 360°) 或者 [-180°, 180°) 的范围内。

在 Three.js 中,当使用 Object3D.rotation 进行设置或取值时,默认情况下,这些角度被表示成弧度而不是度数,并且通常它们的取值范围是:

  • X 轴(俯仰): [-π, π]
  • Y 轴(偏航): [-π, π]
  • Z 轴(滚转): [-π, π]

然而,由于内部使用四元数进行计算,Three.js 允许对象无限制地旋转超过这些范围,不会受到[-π, π]范围的限制。在将旋转展示给用户时,你可能需要考虑如何解释旋转超过 180° 或 -180° 的情况,因为这可能使得某些用户感到困惑。

四元数(Quaternion)

前言

Three.js 的 TransformControls 是一种用于在场景中交互式地变换对象的工具。它可以用来控制物体的位置(平移)、旋转和缩放。当使用 TransformControls 来旋转一个物体时,它实际上是通过修改物体的四元数 (quaternion) 来进行的。

四元数是一种避免万向节锁并能够表示任何 3D 方向的数学结构。由于它们不受旋转顺序的限制且可以提供平滑的连续旋转,因此它们非常适合用来实现交互式旋转控件。

当你激活 TransformControls 并选择旋转模式对物体进行旋转时,TransformControls 将会跟踪用户的鼠标或触摸动作,然后计算出相应的四元数旋转。这些计算基于用户操作控件的方式,包括他们围绕哪个轴旋转物体以及旋转的幅度。

然后,TransformControls 会将这个计算得出的四元数与物体当前的四元数相乘(取决于旋转是否发生在局部空间还是世界空间),从而更新物体的 quaternion 属性以反映新的方向。这样使得旋转看起来就像是连续流畅的,并且也保持了原有的旋转状态。

为了保持与内部四元数变换一致,TransformControls 还会更新对象的欧拉角(rotation 属性),所以即使你没有直接操作四元数,你仍然可以读取到欧拉角表示的旋转状态。但要注意,这里的欧拉角只是为了方便阅读和理解,真正的旋转变换是通过四元数完成的。

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值