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

用threejs在球体表面创建一个环

  •  0
  • Djave  · 技术社区  · 4 年前

    我有一个三js中的球体,我想在它的顶部设置一个环形动画。

    我有以下进展:

    https://codepen.io/EightArmsHQ/pen/zYRdQOw/2919f1a1bdcd2643390efc33bd4b73c9?editors=0010

    在animate函数中,我调用:

    const scale = Math.cos((circlePos / this.globeRadius) * Math.PI * 0.5);
    console.log(scale);
    this.ring.scale.set(scale, scale, 1);
    

    我的理解是 sin cos 函数正是我需要计算的环绕圆有多远。然而,动画实际上显示了环落入球体内部,然后最终达到球体外部的0比例。

    理想情况下,我也想只改变球体的半径,但我也不知道如何做到这一点,所以我认为这可能是使用 scale 作用

    如何将环保持在球体的表面上?

    0 回复  |  直到 4 年前
        1
  •  3
  •   Berthur Sercan    4 年前

    不完全是。考虑一下:

    你有一个直角三角形,它的底是你的 x y ,斜边为 r=地球半径 因此,根据毕达哥拉斯定理,我们得到:

    x 2. +y 2. =r 2.

    因此,如果我们求解高度, y ,我们得到:

    y=(r 2. -x 2. )

    因此,在你的代码中,你可以这样写:

    const scale = Math.sqrt(this.globeRadius * this.globeRadius - circlePos * circlePos);
    

    但是,这是以世界单位表示的比例,而不是相对于对象。因此,为了实现这一点,你需要再次除以你的半径,或者用半径1初始化你的环:

    this.ringGeometry = new THREE.RingGeometry(1, 1.03, 32);
    

    在这里,我给了它一个0.03的任意环宽——你当然可以根据自己的需要进行调整。