当前位置: 首页 > 面试题库 >

如何在Three.js轴上旋转3D对象?

支嘉祥
2023-03-14
问题内容

我对Three.js的旋转有很大的疑问,我想在自己的一款游戏中旋转3D立方体。

//init
geometry = new THREE.CubeGeometry grid, grid, grid
material = new THREE.MeshLambertMaterial {color:0xFFFFFF * Math.random(), shading:THREE.FlatShading, overdraw:true, transparent: true, opacity:0.8}
for i in [1...@shape.length]
    othergeo = new THREE.Mesh new THREE.CubeGeometry(grid, grid, grid)
    othergeo.position.x = grid * @shape[i][0]
    othergeo.position.y = grid * @shape[i][1]
    THREE.GeometryUtils.merge geometry, othergeo
@mesh = new THREE.Mesh geometry, material

//rotate
@mesh.rotation.y += y * Math.PI / 180
@mesh.rotation.x += x * Math.PI / 180
@mesh.rotation.z += z * Math.PI / 180

并且(x,y,z)可以是(1、0、0)

则多维数据集可以旋转,但是问题在于多维数据集绕其自身的轴旋转,因此,旋转后,它无法按预期旋转。

并且我尝试使用 matrixRotationWorld 作为

@mesh.matrixRotationWorld.x += x * Math.PI / 180
@mesh.matrixRotationWorld.y += y * Math.PI / 180
@mesh.matrixRotationWorld.z += z * Math.PI / 180

但它不起作用,我不以错误的方式使用它,还是有其他方法。

因此,如何让3D立方体绕世界轴旋转???


问题答案:

这是我使用的两个功能。它们基于矩阵旋转。并可以绕任意轴旋转。要使用世界上的轴旋转,您需要使用第二个函数rotateAroundWorldAxis()。

// Rotate an object around an arbitrary axis in object space
var rotObjectMatrix;
function rotateAroundObjectAxis(object, axis, radians) {
    rotObjectMatrix = new THREE.Matrix4();
    rotObjectMatrix.makeRotationAxis(axis.normalize(), radians);

    // old code for Three.JS pre r54:
    // object.matrix.multiplySelf(rotObjectMatrix);      // post-multiply
    // new code for Three.JS r55+:
    object.matrix.multiply(rotObjectMatrix);

    // old code for Three.js pre r49:
    // object.rotation.getRotationFromMatrix(object.matrix, object.scale);
    // old code for Three.js r50-r58:
    // object.rotation.setEulerFromRotationMatrix(object.matrix);
    // new code for Three.js r59+:
    object.rotation.setFromRotationMatrix(object.matrix);
}

var rotWorldMatrix;
// Rotate an object around an arbitrary axis in world space       
function rotateAroundWorldAxis(object, axis, radians) {
    rotWorldMatrix = new THREE.Matrix4();
    rotWorldMatrix.makeRotationAxis(axis.normalize(), radians);

    // old code for Three.JS pre r54:
    //  rotWorldMatrix.multiply(object.matrix);
    // new code for Three.JS r55+:
    rotWorldMatrix.multiply(object.matrix);                // pre-multiply

    object.matrix = rotWorldMatrix;

    // old code for Three.js pre r49:
    // object.rotation.getRotationFromMatrix(object.matrix, object.scale);
    // old code for Three.js pre r59:
    // object.rotation.setEulerFromRotationMatrix(object.matrix);
    // code for r59+:
    object.rotation.setFromRotationMatrix(object.matrix);
}

因此,您应该在anim函数中调用这些函数(requestAnimFrame回调),从而在x轴上旋转90度:

var xAxis = new THREE.Vector3(1,0,0);
rotateAroundWorldAxis(mesh, xAxis, Math.PI / 180);


 类似资料:
  • 我是XNA的新手。我只是陷入了某种困境——我必须在游戏中倾斜/翻转角色,这意味着围绕X轴和Z轴旋转(不是同时旋转!)我可以做旋转-这意味着绕Y轴旋转。我有旋转矩阵,角色的当前位置向量(也是可以从旋转矩阵中获得的朝向/方向向量)我通过将朝向向量围绕Y轴旋转R弧度来实现旋转,即围绕Y轴旋转。比如说,如果我现在绕X轴旋转,那么方法是什么?例如,从站立姿势改为“超人飞行”姿势需要角色倾斜。。。y旋转不涉及

  • 问题内容: 试图绕任何轴旋转对象。 例如,像门铰链(在物体边缘)或围绕太阳的行星(在物体外部)。 问题似乎在定义轴。下面的单位向量导致轴保留在对象的原点(中心)上,与标准旋转相同: 编辑: 寻找一种无需使用嵌套子项即可绕枢轴旋转的方法。旋转孩子的父母可以方便地操作孩子的枢轴点,但是修改枢轴点是不可行的。 在下面的示例中,如果您想以图8的运动旋转立方体,则可以通过更改父对象来使用此方法来实现。但是,

  • 我想知道如何围绕它的Y轴旋转一个物体。 例如,我想旋转谷歌示例应用程序hello\u ar\u java的droid机器人https://github.com/google-ar/arcore-android-sdk/tree/master/samples/hello_ar_java围绕其Y轴,角度为alpha。

  • 我的屏幕上有一个旋转和平移的对象,但是我有两个关于z轴旋转的问题。解释起来有点棘手,所以我上传了两个视频来描述每个问题。 1) 反向旋转:在绕x轴旋转对象后,z轴旋转将被反向,并且应该如此。 2)错误的Z轴旋转:同样,在围绕x轴旋转物体后,我试图围绕z轴旋转物体,旋转导致不同的轴旋转。 我相信视频很好地描述了这些问题。 编辑:更新#1 好的,我想我找到了解决方案,就是只绕Z轴旋转相机,然后对模型本

  • 我问了一个以前被问过一百万次的问题,但在浏览了这些问题并求助于其他网站之后,我仍然没有找到一个好的答案: 如何在全局轴上旋转图形,而不是本地轴? opengl中的旋转对象 如何像OpenGL中的glRotatef()一样旋转顶点? 在OpenGL中围绕3个轴旋转对象 在OpenGL中沿对象自身的轴旋转对象 有没有可能让一个物体绕着它自己的轴旋转,而不是绕着基坐标轴旋转? OpenGL旋转-局部轴与

  • 所以我有一个立方体,我想绕着它的三个轴(立方体的轴,而不是窗口)旋转。正如许多其他类似的问题所指出的,只要我只朝一个方向旋转,我的旋转就会起作用,但当我开始混合它们时,我会得到奇怪的结果。特别是,无论立方体如何旋转,围绕y轴的旋转始终围绕窗口的y轴旋转。 我的绘图代码如下: 这个问题似乎非常准确地描述了我想做什么,公认的答案似乎是我想做什么,但是他提供的链接已经死了。 从我在链接问题中收集到的信息