zoukankan      html  css  js  c++  java
  • 三角函数在Three.js中的点的移动轨迹应用

    在学习2D文字的时候,看到官网有这样一个示例:
    https://threejs.org/examples/#css2d_label

    ![](https://img2018.cnblogs.com/blog/1735896/201912/1735896-20191227112947468-1562608290.gif)

    月球的运动轨迹,在刷新函数中是这样写的: ```javascript function animate() {
    requestAnimationFrame(animate);
    
    var elapsed = clock.getElapsedTime();
    
    moon.position.set(Math.sin(elapsed) * 5, 0, Math.cos(elapsed) * 10);
    console.log(moon.position)
        
    renderer.render(scene, camera);
    labelRenderer.render(scene, camera);
    

    }

    其中
    ```javascript
    var clock = new THREE.Clock();
    

    月球的运动轨迹就是通过修改月球在三维坐标系中的x和z值来实现的。 也就是这行关键代码: ```javascript moon.position.set(Math.sin(elapsed) * 5, 0, Math.cos(elapsed) * 5); ```
    x轴坐标:`Math.sin(elapsed)*5` y轴坐标:`Math.cos(elapsed)*5`

    其中elapsed作为相同参数即clock.getElapsedTime(),指的是保存时钟运行的总时长。即从页面刷新开始从0一直计时。


    我们通过打印elapsed值和对应的坐标值加以观察:

    
    function animate() {
    
        requestAnimationFrame(animate);
    
        var elapsed = clock.getElapsedTime();
        console.log(elapsed)
        moon.position.set(Math.sin(elapsed) * 5, 0, Math.cos(elapsed) * 5);
        console.log(moon.position)
    
        renderer.render(scene, camera);
        labelRenderer.render(scene, camera);
    
    }
    

    截取部分结果如下:

    可以看个大概,随着elapsed值增加,x,z值大概呈现正弦变化。 不过并不直观,因为点太密集了,一个周期很多点。看不全。
    通过Excel模拟一组数据来观察以下规律:

    ![](https://img2018.cnblogs.com/blog/1735896/201912/1735896-20191227141128715-1848866384.jpg)
    ![](https://img2018.cnblogs.com/blog/1735896/201912/1735896-20191227141235203-1177815670.jpg)

    月球的运动轨迹,是围绕y轴,在xoz形成的平面内画圆。通过以上观察,在运动轨迹上,任一点的坐标x,z坐标满足以下规律:

    ![](https://img2018.cnblogs.com/blog/1735896/201912/1735896-20191227142516448-1773147661.png)

    也就是三角函数的正弦余弦平方和为1。
    即半径为1:

    ![](https://img2018.cnblogs.com/blog/1735896/201912/1735896-20191227143110891-751001843.png)

    ```javascript moon.position.set(Math.sin(elapsed) * 5, 0, Math.cos(elapsed) * 5); ``` x,z坐标仅在系数相同时,轨道为一正圆。即下面的n=m `Math.sin(elapsed)*n` `Math.cos(elapsed)*m` 此时,运动轨迹半径即是n=m 如果n不等于m,那么运动轨迹将呈椭圆。

    这只是一种运动轨迹,可以通过更为复杂的数学公式,实现更多不同的运动轨迹。

  • 相关阅读:
    bzoj4598: [Sdoi2016]模式字符串
    bzoj3156: 防御准备
    bzoj1966: [Ahoi2005]VIRUS 病毒检测
    bzoj3170: [Tjoi2013]松鼠聚会
    bzoj3171: [Tjoi2013]循环格
    POJ1068Parencodings
    2013年山东省第四届ACM大学生程序设计竞赛 Alice and Bob
    POJ2632Crashing Robots
    POJ1328Radar Installation
    POJ2586Y2K Accounting Bug
  • 原文地址:https://www.cnblogs.com/jaycethanks/p/12107227.html
Copyright © 2011-2022 走看看