当前位置: 首页 > 知识库问答 >
问题:

什么是正确的方法来旋转一个对象围绕一个点three.js?

巫晋鹏
2023-03-14

大多数关于three.js的教程/问题建议使用three.js围绕一个点旋转一个对象的方法是在你想要旋转的位置创建一个父对象,附加你的对象,然后移动孩子。然后,当父旋转时,子旋转点。例如;

//Make a pivot
var pivot = new THREE.Object3D();
//Make an object
var object = new THREE.Mesh( new THREE.BoxGeometry(2,2,2), new THREE.MeshBasicMaterial() );
//Add object to pivot
pivot.add(object);

//Move object away from pivot
object.position.set(new THREE.Vector3(5,0,0));

//rotate the object 90 degrees around pivot
pivot.rotation.y = Math.PI / 2;

这是可行的,但它的限制是难以置信的——如果你想围绕一个不同的点旋转一个对象,你不能,因为一个对象不能有两个父对象。

下一个有效的方法是将旋转矩阵应用于对象的位置,例如。;

//Make an object
var object = new THREE.Mesh( new THREE.BoxGeometry(2,2,2), new THREE.MeshBasicMaterial() );
//Move the object
object.position.set(new THREE.Vector3(5,0,0);

//Create a matrix
var matrix = new THREE.Matrix4();
//Rotate the matrix
matrix.makeRotationY(Math.PI / 2);

//rotate the object using the matrix
object.position.applyMatrix4(matrix);

同样,这是有效的,但是似乎没有办法设置旋转点。它总是世界的起源。

另一个选项是sceneUtils中用于将子对象与父对象分离的实用方法,以及用于附加新父对象的另一个方法,但相关文档警告不要使用它,并且从未在任何示例代码中使用过。

最终,我希望能够使立方体沿着S形路径移动,但如果没有这个(看似)基本的东西,我会发现这相当困难。

我想围绕一系列不同的点旋转一个three.js物体。什么是解决这个问题的好方法?

共有3个答案

赖鸿羲
2023-03-14

这是可行的,但它的限制是难以置信的——如果你想围绕一个不同的点旋转一个对象,你不能,因为一个对象不能有两个父对象。

这是真的,但我想知道你对双亲的默认行为有什么期待。你可以把东西嵌套起来——比如,一个女人在车里拿着一个摄像头,它有两层育儿功能:摄像头-

如果要在父对象之间进行更改,始终可以拆离对象,然后将其附着到另一个对象。它警告您不要手动分离,因为对象将从位于本地空间的对象转到其父对象的世界空间/其新父对象的本地空间。

幸运的是,场景中有些东西的用意正是如此:即连接和分离。因此,当您想要传递一个对象而不从本地坐标到世界坐标并将其传送到奇怪的地方时,您可以使用附加/分离功能。

温嘉赐
2023-03-14

简单的解决方案:移动到锚定点,旋转,然后向后移动。

让我们假设您想旋转一个摄像机围绕一个anchorPoint摄像机THREE. Camera的一个实例,而anchorPointTHREE. Vector3的一个实例):

/// step 1: calculate move direction and move distance:
let moveDir = new THREE.Vector3(
    anchorPoint.x - camera.position.x,
    anchorPoint.y - camera.position.y,
    anchorPoint.z - camera.position.z
);
moveDir.normalize();
let moveDist = camera.position.distanceTo(anchorPoint);
/// step 2: move camera to anchor point
camera.translateOnAxis(moveDir, moveDist);
/// step 3: rotate camera
camera.rotateX(valX);
camera.rotateY(valY);
camera.rotateZ(valZ);
/// step4: move camera along the opposite direction
moveDir.multiplyScalar(-1);
camera.translateOnAxis(moveDir, moveDist);
王凌
2023-03-14

这个答案可能会有所帮助:三个JS支点

有几种方法可以解决这个问题。正如您所提到的,您可以在父系方法中交换轴心点,但要将对象位置转换为不同的坐标系或从不同的坐标系转换对象位置,这需要大量的工作。

相反,您可以始终这样看待它(伪代码):

>

1.1. 从对象的原始位置减去轴心点

应用你的旋转

将对象按相同的位置向量向后移动

1.1.将枢轴点添加到对象的新位置

注意:所有内容都在世界坐标中,因此您可能需要进行适当的转换。

 类似资料:
  • 下面是java中的一个代码段,用于将坐标为a(10,10),B(20,10),C(20,20),D(10,20)的顶点围绕正方形的中心点旋转一个角度。正方形的边是10分。旋转角度为90度。理想情况下,旋转后A必须变成B,B必须变成C,C必须变成D,D必须变成A。 所取得的结果是不正确的 > 点A(10,10)旋转到(20,10)---正确 点B(20,10)旋转到(30,10)----不正确 nu

  • 我目前正在尝试绕世界x轴旋转一个位置向量(0,0,1),然后将其旋转回其原始位置(只是尝试使其工作)。我阅读了旋转矩阵,并使它工作(排序),但我现在相当卡住了。 如图和代码所示,我在起点(0,0,1)处创建了一个立方体,并将其向下旋转30度。但顺时针旋转时,它的旋转角度似乎超过30度。但是,当我逆时针(30度)旋转它时,它确实旋转了适当的量。这导致它没有在它应该(0,0,1)的起点处结束。 我想知

  • 本文向大家介绍C#实现计算一个点围绕另一个点旋转指定弧度后坐标值的方法,包括了C#实现计算一个点围绕另一个点旋转指定弧度后坐标值的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现计算一个点围绕另一个点旋转指定弧度后坐标值的方法。分享给大家供大家参考。具体如下: 1.示例图 P(x1,y1)以点A(a,b)为圆心,旋转弧度为θ,求旋转后点Q(x2,y2)的坐标 2.实现方法 先将

  • 我有两个矩形:红色和绿色。对于它们中的每一个,我有以下信息: 中心点( 和 坐标)。 旋转角度 宽度和高度 矩形将始终以正坐标移动。编辑:没有坐标可以是负的:矩形总是位于正坐标。因此,中心永远不会是(0,0)。 问题 我有一个起始位置。为了简化示例,假设我的红色和绿色矩形的位置如下: 现在,我使用0º和90º之间的角度φ旋转红色矩形。但是,绿色矩形需要旋转并保持其相对于红色矩形的位置。绿色矩形不仅

  • 问题内容: 我正在尝试使三个对象绕一个圆旋转。到目前为止,我已经能够使一个对象绕圆旋转。如果不弄乱代码,我将一无所获。谁能建议最好的方法来做到这一点?这是代码的一部分。谢谢! 问题答案: jQuery解决方案,适用于任意数量的外部项目。

  • 我试图比较两个对象,看看它们是否相同,使用hamcrest for flex-Unit,但是当对象有子对象时,它只是抛出一个错误: 我希望它做一个资产(…,hasProperties(…);在子对象上。 有没有办法得到,或者我应该创建一个自定义匹配器? 编辑 我要测试的对象结构的一个示例: 由于expected和objectUnderTest具有相同的结构,测试应该通过,但返回错误: 另外,如果有

  • 问题内容: 我看到lambda的类是,但是我认为对于代理类而言可能同样如此。 当然,我可以检查一下并应用于类名。 但是我想知道是否有一个更优雅,更强大的选项来确定给定的对象是否为lambda。 问题答案: 设计上没有官方的方法可以做到这一点。Lambda是语言的一部分;并通过功能接口集成到类型系统中。无需区分以lambda,命名类或内部类开头的生命,它们都是Runnable。如果您认为必须拆开类文

  • 我想在x、y和z方向旋转我的模型Matix,但它以一种意想不到的方式旋转。我用Qt。 第一次旋转后,后续旋转围绕新模型矩阵的基础旋转,而我希望后续旋转围绕原点旋转。