Ben*_*all 14 rotation three.js orbit
我正在尝试建立一个太阳能系统的比例模型.我想看看是否有人可以向我解释旋转速度的工作原理.这是重要的一部分:
objects[index].rotation.y += calculateRotationSpeed(value.radius,value.revolution) * delta;
Run Code Online (Sandbox Code Playgroud)
转速如何与实际时间相关?因此,如果您的速度为1,那么每毫秒的运动速度是1 px吗?或者,如果你的速度为0.1,那么每秒的px是否小于px?
基本上我正在尝试计算行星的正确旋转速度,考虑到它们的半径和一天中的小时数.因此,如果你在地球上,它将在24小时内完成1次旋转.这是我写的现在正在进行计算的函数:
/* In a day */
function calculateRotationSpeed(radius,hrs,delta) {
var cir = findCircumference(radius);
if(delta) {
var d = delta;
} else {
var d = 1;
}
var ms = hrs2ms(hrs) * d;
var pxPerMS = km2px(cir) / ms;
return pxPerMS;
}
Run Code Online (Sandbox Code Playgroud)
我试了一下它似乎仍然移动得太快了.我还需要类似于计算轨道速度的东西.
Cor*_*oss 65
Three.JS中的旋转以弧度为单位.对于那些完全不熟悉弧度的人(我的旧报纸中的一小段摘录):
与数学常数Pi一样,弧度(大约57.3度)是从圆的半径(或直径)与其圆周之间的关系导出的.一个弧度是一个角度,它总是跨越圆周上的圆弧,其长度等于同一圆的半径(对于任何圆都是如此,无论大小如何).类似地,Pi是圆周与直径的比率,使得单位圆的周长恰好是Pi.弧度和度数实际上不是真正的单位,实际上角度通常是无量纲的(如百分比和分数,我们不使用实际单位来描述它们).
然而,与程度不同,弧度没有任意定义,在大多数情况下使其成为更自然的选择; 通常比使用数学公式中的度数更容易,更优雅,更清晰,更简洁.巴比伦人可能给了我们度数,将他们的圆圈分成6个相等的部分(使用等边三角形的角度).考虑到它们的六十进制(基数60)数系统,这6个部分中的每一部分可能进一步细分为60个相等的部分.这也允许他们使用这样的系统进行天文学,因为一年中估计的天数在他们的时间内准确性要低得多,通常被认为是360天.
所以,现在,知道你在工作的弧度,如果你使用递增的第一下面的语句,一旦在你的anim函数(回调requestAnimFrame),您将递增的旋转mesh通过一个弧度在x轴上
mesh.rotation.x += 1; // Rotates 1 radian per frame
mesh.rotation.x += Math.PI / 180; // Rotates 1 degree per frame
mesh.rotation.x += 45 * Math.PI / 180 // Rotates 45 degrees per frame
Run Code Online (Sandbox Code Playgroud)
正如上面的最后两个陈述所示,Math.PI / 180如果我们希望使用度数,我们可以使用它在分配之前轻松地将度数转换为弧度.
在您的情况下,您需要考虑每帧经过多少时间.这是你的三角洲.你必须这样想:我们运行多少FPS?我们将声明一个全局clock变量,它将存储一个THREE.Clock对象,该对象具有我们需要的信息的接口.我们需要一个我们将调用的全局变量clock(需要在其他函数中可访问,特别是anim):
在其中init,创建一个实例THREE.Clock; 将它存储在外部声明的变量中init(具有更大的范围):
clock = new THREE.Clock();
Run Code Online (Sandbox Code Playgroud)
然后,在您的anim函数中,您将进行两次调用,以更新与clock以下内容关联的两个变量:
time (自实例化时钟以来经过的总时间(以毫秒为单位))delta (另外两个全局变量中的每帧之间的时间,以毫秒为单位):time = clock.getElapsedTime(); delta = clock.getDelta();
需要注意的是delta被意味着返回的各帧之间的时间量; 但是,当且仅当clock.getDelta在anim/ 内持续调用时,这将是真的render
以上条件是THREE.Clock实施的结果.getDelta最初返回自实例化时钟以来的时间量,之后返回的时间就是自上次调用之后的时间.如果它以某种方式被错误地或不一致地调用,它将会搞砸了.
现在,如果您的场景不会使处理器或GPU陷入困境,那么Three.JS及其包含的requestAnimationFrame shim将尝试(使用可用资源)以保持平稳运行每秒60帧.这意味着我们理想情况下1/60 = .016666每帧之间会有大约几秒钟,这是您delta可以从clock每个帧读取的值,并使用它来根据帧速率标准化您的速度,乘以如下所示.这样,您可以获得以秒为单位的值,而不管帧速率的微小变化,您可以每次乘以以获得以秒为单位的值.
因此,根据我们在anim函数开头的内容,您可以像这样使用它:
mesh.rotation.x += delta * 1; // Rotates 1 radian per second
mesh.rotation.x += delta * Math.PI / 180; // Rotates 1 degree per second
mesh.rotation.x += delta * 45 * Math.PI / 180; // Rotates 45 degrees per second
Run Code Online (Sandbox Code Playgroud)
因为我们对角度,弧度和度数的测量实际上不是单位,所以当我们查看单位的角速度时,我们会发现它只能用于时间(而不是像你在你的距离和时间的函数)码).
至于您的具体情况,您不需要半径来计算转速(角速度),而是可以使用一天中的小时数(完整旋转所需的时间,即2 * Math.PI 弧度)在它的轴上旋转).如果你有一个名为变量的变量,revolutionTime你可以像这样计算它.
secondsInAnHour = 3600;
rotationalSpeed = (2 * Math.PI) / revolutionTime;
Run Code Online (Sandbox Code Playgroud)
如果你假设地球24 hours = 24 * 60 * 60 = 86,400在一天之内(它没有).然后我们将得到rotationalSpeed = 2 * PI / 86,400,或大约0.0000727 每秒弧度.您应该能够找到比这更精确的教科书值(考虑到比我们的24小时平坦数字更准确的测量值,表明地球完成一次旋转所需的时间.
但是,我不担心确保行星的所有角速度完全正确.相反,一个更好的想法是弄清楚(行星的)每个角速度之间的比率是什么,并使用它.由于以下几个原因,这样可以更好地工作:您可能希望更快的转速,这将允许您使用任何转速效果良好; 重要的是,与任何模型一样(特别是当涉及到天文模型时),就是你要保持它的规模.
| 归档时间: |
|
| 查看次数: |
18160 次 |
| 最近记录: |