javascript - 在世界空间中保持局部旋转相同

标签 javascript three.js

我有一个网格物体,它是 Object3D 的子物体,而 Object3D 又是场景的子物体。

Object3D 已旋转,假设沿 X 轴旋转 90 度。

子级没有应用旋转,并在其局部空间中保持 Y 向上和 Z 向前方向。

作为 THREE.js API 的菜鸟,我的问题是:保持 child 的旋转与世界 Y 轴对齐的最有效方法(就计算而言)是什么?

也就是说,如果其父级已沿 X 轴旋转 90 度,则应更新其子级的局部旋转,使其向上向量仍指向全局 Y 轴?

我可以获取对象的世界四元数来获取局部旋转和全局旋转之间的差异,然后进行局部调整吗?

嗯,我发现的最简单的技巧是反转父级的四元数并将其应用于子级,以便其局部旋转在世界空间中保持相同:

        var inv = mesh.parent.quaternion.clone(); 
        inv.conjugate();
        mesh.quaternion.copy(inv);

最佳答案

您希望子网格体保持正面朝上并与坐标轴对齐 - 即使网格体的父级旋转。

有几种方法可以做到这一点。什么是最好的,取决于您的用例或个人喜好。

您提出的解决方案无需克隆即可实现,如下所示:

mesh.quaternion.copy( mesh.parent.quaternion ).conjugate();

另一种方法是定义一个 onBeforeRender() 方法来修改网格的世界矩阵:

var func = function() {

    var v = new THREE.Vector3();

    return function func() {

        v.setFromMatrixPosition( this.matrixWorld );
        this.matrixWorld.makeTranslation( v.x, v.y, v.z );

        // or you could do this, instead
        //this.quaternion.copy( this.parent.quaternion ).conjugate();
        //this.updateMatrixWorld();

    };

}();

mesh.onBeforeRender = func;

三.js r.94

关于javascript - 在世界空间中保持局部旋转相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51287488/

相关文章:

javascript - 向 HTML 样式添加隐藏/显示功能(不在 CSS 文档中)

javascript - ThreeJS,获取指向点击方向的向量

three.js - 如何在三个js中切换渲染目标的纹理?

javascript - 使用 THREE.JS 转换阴影时遇到问题

three.js - 使用three.js实时进行漫画着色器(cel着色)

javascript - 嵌套函数调用nodejs

javascript - ExpressJS中如何在一段时间后从字典中删除对象

javascript - Jquery-在句子中查找单词并添加跨度

javascript - 如何动态地从 Angular 应用程序添加/删除/更新元标记

javascript - 在 Three.js 中将相机聚焦在对象的中心