【问题标题】:How do i rotate an object so that it faces away from a sphere given its position in longitude and latitude给定经度和纬度的位置,如何旋转对象使其背向球体
【发布时间】:2019-06-29 16:41:24
【问题描述】:

我有一个球体和盒子,它们应该是上面的建筑物。我想旋转盒子(围绕 x y 和 z 轴),使它们远离球体,就像普通建筑物会给出盒子的经度和纬度(也是 x、y、z 位置)。

我希望你能帮助我解决我的问题,任何帮助将不胜感激:)

我尝试了很多使用经度和纬度的旋转,但都没有奏效。 我也想过使用从球体中心到建筑物位置的向量来找出旋转但无法提出解决方案。

  var lat = i; //-90 to 90
  var lon = j; //-180 to 180


  var height = 10;
  var width = 10;
  var length = 10;

  var xyz = getXYZ(lat, lon, sphereradius, height);

  var boxE3 = document.createElement('a-box');

  boxE3.setAttribute('material', {
    color: getRandomColor()
  });

  boxE3.setAttribute('rotation', {
    x: 0, 
    y: lat, //Rotation that needs to be correctly set.
    z: lon
  });

  boxE3.setAttribute('position', {
    x: xyz[0],
    y: xyz[1],
    z: xyz[2]
  });

  boxE3.setAttribute('scale', {
    x: length,
    y: height,
    z: width
  });
  sceneEl.appendChild(boxE3);
}

实际结果:

想要的结果:

【问题讨论】:

    标签: javascript aframe


    【解决方案1】:

    旋转一个对象使其背向另一个对象。

    我会重用look-at 组件逻辑,其中“查看”是通过一种简单的方法进行的:

    object3D.lookAt(THREE.Vector3())
    

    有一个盒子和一个球体,只需将盒子lookAt 变成球体,然后旋转它。

    box.object3D.lookAt(spherePosition)
    box.rotation.y += Math.Pi
    

    this fiddle 中查看。但我会做的有点不同。

    围绕球体旋转参考系

    假设我们有以下设置。

    <a-sphere id="earth" position="1 1 -2" radius="1.5"></a-sphere>
    <a-entity id="frameOfReference" position="1 1 -2>
       <a-box position="0 0 -1.5></a-box>
    </a-entity>
    

    现在,行星和框架处于相同的位置。方框位置对应于行星半径。无论我们如何旋转参考系,它实际上都背对着地球。

    为什么有用?因为现在您可以使用纬度和经度来旋转参考系:

        let x = latitude
        let y = longitude + 180 // 180deg shift because z is negative
        frame.setAttribute("rotation", x + " " + y + " " + 0)
    

    this fiddle 中查看,使用this API 跟踪国际空间站。

    【讨论】:

    • 首先非常感谢您的回答,我已经尝试过了,这正是我所需要的^^
    • @RezarakSL 很高兴我能提供帮助,如果一切都清楚,请随时标记答案 :)
    • 我对lookat函数有另一个问题,当我在html文件中初始化框时它可以工作,但是当我尝试在js文件中动态生成框时它不再工作了。它本身不会引发错误,但“box.rotation.y += Math.Pi”会。它说:“无法读取 null 的属性 'y'”。我猜在创建后没有属性轮换,这也可能是为什么lookat 函数没有做任何事情?再次感谢您的所有帮助,这对我非常有用:)。
    • @RezarakSL 你可能需要参考box.object3D.rotation.y 就像我做here 一样
    • 既然你回答了我的最后一个问题,我想问你是否可以帮助我解决我的另一个问题:stackoverflow.com/questions/56307260/…。这背后的想法是为球体添加街道,但不幸的是我不知道如何去做。我尝试了很多东西,但无法想出一个好的解决方案。再次感谢您的帮助:)
    猜你喜欢
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    相关资源
    最近更新 更多