【问题标题】:Three.js position objects on curve - rotate towards center of circleThree.js 在曲线上定位对象 - 向圆心旋转
【发布时间】:2018-08-19 13:52:36
【问题描述】:

我正在尝试创建一个时髦的 VR 菜单,以便当用户向下看时,菜单项位于相机下方的一列中,围绕圆形弯曲,因此它们看起来相同并朝向相机旋转。

这是我迄今为止的尝试

还有一个带有示例的 CodePen http://codepen.io/bknill/pen/BLOwLj?editors=0010

我正在使用我发现的一些代码来计算位置

   var radius = 60; // radius of the circle
  var height = 60,
      angle = 0,
      step = (Math.PI /2 ) /  menuItems.length;

menuItems.forEach(function(item,index){

    var menuItem = createMenuItem(item.title);
       menuItem.position.y = - Math.round(height/2 + radius * Math.sin(angle));
       menuItem.position.z =  Math.round(height/2 + radius * Math.sin(angle));
      // menuItem.rotation.x =  -Math.round(Math.PI * Math.sin(angle));
    angle += step;
    menu.add(menuItem);

})

这几乎是正确的,下一阶段是让它们以均匀的方式朝向相机旋转。使用 menuItem.lookAt(camera.position) 不起作用 - 它们不是均匀旋转。

child.lookAt(camera.position.normalize()) 这样做

谁让我知道我需要的巧妙数学运算来获得项目的旋转,以使它们面向相机并看起来像是在曲线上?

【问题讨论】:

    标签: javascript math three.js


    【解决方案1】:

    让一个对象面向另一个对象的最简单方法是使用lookAt

    请注意,此方法需要一个方向向量,而不是您希望它查看的点。

    (你想看的位置 - 你的对象的位置).normalize();

    在你的情况下:

    var dirToLookAt = new THREE.Vector3();
    dirToLookAt.subVectors(menuItem.position, camera.position);
    // could be: dirToLookAt.subVectors(camera.position, menuItem.position);
    dirToLookAt.normalize();
    

    基于Vector3 documentation的操作。

    更多信息你可以阅读the last discussion I had about this method

    【讨论】:

    • 我正在努力实现这一点并获得预期的结果。请您指出您将如何在代码中使用它?
    • 只要给我一个你想面对镜头的物体的名字:)
    • 每个 menuItem 对象
    • 我用一些代码完成了答案。 var dirToLookAt 应该为您提供 menuItem.lookAt 需要的方向。为什么使用 child 来设置外观?
    • 感谢它与lookAt(camera.position) 的作用相同,我已经更新了CodePen codepen.io/bknill/pen/BLOwLj?editors=0010
    猜你喜欢
    • 2022-01-01
    • 2013-08-06
    • 2013-08-01
    • 2014-10-24
    • 2013-06-17
    • 2015-04-28
    • 2018-10-24
    • 2012-02-20
    • 2015-02-06
    相关资源
    最近更新 更多