代码之家  ›  专栏  ›  技术社区  ›  nnyby

三.js:查找距鼠标光标最近的网格点

  •  1
  • nnyby  · 技术社区  · 7 年前

    Picture of three.js globe scene

    当用户拖动黄色光碟(表示太阳)时,光碟需要沿其黄色圆圈移动以响应此操作。这是另一个角度的场景,所以你可以看到完整的黄色圆圈:

    Another angle of the three.js scene

    我在用 THREE.Raycaster 要确定某些鼠标悬停事件,请使用 intersectObjects() 函数,但我不清楚如何用这个光线投射器找到单个物体的最近点。我猜在把鼠标的位置转换成世界坐标后,我可以做一些简单的计算。有人能帮我吗?是三.jsRaycaster在这里有用吗?如果不是,如何确定该网格的最近点?

    完整的源代码在这里,如果有帮助的话: https://github.com/ccnmtl/astro-interactives/blob/master/sun-motion-simulator/src/HorizonView.jsx 搜索 this.sunDeclination ,对应于黄色圆的网格对象。

    https://ccnmtl.github.io/astro-interactives/sun-motion-simulator/

    作为参考,太阳的行为应该是这样的: https://cse.unl.edu/~astrodev/flashdev2/sunMotions/sunMotions068.html (需要闪光灯)

    2 回复  |  直到 7 年前
        1
  •  1
  •   stdob--    7 年前

    • 已知圆的半径,计算矢量乘以标量的乘数

    var point = res.point.clone();
    point.z = 0; // Project on circle plane
    var scale = circleRadius / point.length();
    point.multiplyScalar(circleRadius / point.length())
    

    [ https://jsfiddle.net/c4m3o7ht/

        2
  •  0
  •   manthrax    7 年前

    光线投射器返回所有被光线击中的物体。。世界空间的所有生命点。。(可以通过object3d.worldToLocal和localToWorld与模型空间进行转换)

    它返回命中距离。。你可以根据你需要的启发来排序。。。

    我通常做的是投在老鼠镇上。。记录物体和点。。然后在mouseMove上获取相同的对象命中点,并使用这两个点之间的差异应用我的编辑操作。

    这就是你说的吗?