数学小知识:

我们根据旋转角度θ可以计算出任意时刻的x,y

sinθ = y0/r; 因此y0= rsinθ,

cosθ = x0/r,因此x0= rcosθ,

小拓展: y0^ +x0^ - r^2*sinθ^2 + r^2*cosθ^2 = r^2*(sinθ^2 + cosθ^2) = r^2;

这也是为什么在极坐标方程中

y0= rsinθ,

x0= rcosθ,

可以代表一个圆的原因。

会极坐标方程的同学可以直接跳过该描述。

关键代码:

//创建一个光球
            const sphereMesh = new THREE.Mesh(
            new THREE.SphereBufferGeometry(1, 50, 50), 
            new THREE.MeshBasicMaterial({color:0xFF0000})
            );
            sphereMesh.position.set(10, 5, 10);
            //将光源加入球
            sphereMesh.add(directionalLight);

//渲染下一帧的时候就会调用回调函数
            const clock = new THREE.Clock();
            let renderFun = () => {
                let time = clock.getElapsedTime();
                sphereMesh.position.x = Math.sin(time)*10;
                sphereMesh.position.z = Math.cos(time)*10;
                //更新阻尼数据
                controls.update();
                //需要重新绘制canvas画布
                render.render(scene, camera);
                //监听屏幕刷新(60HZ,120HZ),每次刷新触发一次requestAnimationFrame回调函数
                //但是requestAnimationFrame的回调函数注册生命只有一次,因此需要循环注册,才能达到一直调用的效果
                window.requestAnimationFrame(renderFun);
            };

完整代码:

<template>
    <div id="three_div"></div>
</template>

<script>
    import * as dat from 'dat.gui' //界面控制
    import * as THREE from "three";
    import {
        OrbitControls
    } from "three/examples/jsm/controls/OrbitControls";
    import {
        RGBELoader
    } from "three/examples/jsm/loaders/RGBELoader"
    export default {
        name: "HOME",
        components: {
            // vueQr,
            // glHome,
        },
        data() {
            return {};
        },
        mounted() {
            //使用控制器控制3D拖动旋转OrbitControls
            //控制3D物体移动

//1.创建场景
            const scene = new THREE.Scene();
            console.log(scene);

//2.创建相机
            const camera = new THREE.PerspectiveCamera(
                75,
                window.innerWidth / window.innerHeight,
                0.1,
                1000
            );
            //设置相机位置
            camera.position.set(0, 0, 10);
            //将相机添加到场景
            scene.add(camera);
            //添加物体
            //创建一个半径为1,经纬度分段数位20的球
            const cubeGeometry = new THREE.SphereBufferGeometry(2, 100, 100);
            //纹理加载器加载图片
            const cubeMaterial = new THREE.MeshStandardMaterial({
                //side: THREE.DoubleSide,
            });
            //根据几何体和材质创建物体
            const mesh = new THREE.Mesh(cubeGeometry, cubeMaterial);
            //将物体加入到场景
            scene.add(mesh);

//创建平面几何体
            const planeGeometry = new THREE.PlaneBufferGeometry(50, 50);
            //创建平面物体
            const planeMesh = new THREE.Mesh(planeGeometry, cubeMaterial);
            planeMesh.position.set(0, -2, 0);
            planeMesh.rotation.x = -Math.PI / 2;
            //场景添加平面物体
            scene.add(planeMesh);

//给场景所有的物体添加默认的环境贴图
            //添加坐标轴辅助器
            const axesHepler = new THREE.AxesHelper(5);
            scene.add(axesHepler);
            //标准材质需要借助灯光

//添加周围环境灯光(由物体发出的灯光)参数(灯色,强度0-1)
            // const light = new THREE.AmbientLight(0xFFFFFF, 0.7);
            // scene.add(light);
            //创建点光源
            const directionalLight = new THREE.PointLight(0xFF0000, 0.7);
            // directionalLight.position.set(10, 10, 10);
            
            //创建一个光球
            const sphereMesh = new THREE.Mesh(
            new THREE.SphereBufferGeometry(1, 50, 50), 
            new THREE.MeshBasicMaterial({color:0xFF0000})
            );
            sphereMesh.position.set(10, 5, 10);
            //将光源加入球
            sphereMesh.add(directionalLight);
            //将光源球加入到场景
            scene.add(sphereMesh);
            //初始化渲染器
            const render = new THREE.WebGLRenderer();
            //设置渲染器的尺寸
            render.setSize(window.innerWidth, window.innerHeight);
            //使用渲染器,通过相机将场景渲染进来

//创建轨道控制器,可以拖动,控制的是摄像头
            const controls = new OrbitControls(camera, render.domElement);
            //设置控制阻尼,让控制器有更真实的效果
            controls.enableDamping = true;

//开启投影
            //开启渲染器投影
            render.shadowMap.enabled = true;
            //开启灯光动态投影
            directionalLight.castShadow = true;
            //开启物体投影
            mesh.castShadow = true;
            //开启平面接受投影
            planeMesh.receiveShadow = true;
            //投影模糊度
            directionalLight.shadow.radius = 10;
            //设置投影的宽度和高度
            directionalLight.shadow.mapSize.set(1024, 1024);

//directionalLight.angle = Math.PI/10;
            //创建gui
            const gui = new dat.GUI();
            // gui.add(directionalLight.shadow.camera, 'near').min(1).max(25).step(1).name("相机近距离").onChange( () => {
            //     directionalLight.shadow.camera.updateProjectionMatrix();
            // })
            gui.add(mesh.position, 'x').min(-30).max(30).step(1).name("移动位置");
            //灯光有效距离,默认0表示不衰减
            directionalLight.distance = 0;
            gui.add(directionalLight, 'distance').min(0).max(100).step(1).name("灯光有效距离");
            //灯光衰减量控制
            directionalLight.decay = 2;
            gui.add(directionalLight, 'decay').min(-5).max(5).step(1).name("灯光衰减量");
            //控制灯光强度
            gui.add(directionalLight, 'intensity').min(0).max(30).step(1).name("灯光强度");
            
            //需要渲染器开启物理渲染
            render.physicallyCorrectLights =true;

//将webgl渲染的canvas内容添加到body上
            document.getElementById("three_div").appendChild(render.domElement);

//渲染下一帧的时候就会调用回调函数
            const clock = new THREE.Clock();
            let renderFun = () => {
                let time = clock.getElapsedTime();
                sphereMesh.position.x = Math.sin(time)*10;
                sphereMesh.position.z = Math.cos(time)*10;
                //更新阻尼数据
                controls.update();
                //需要重新绘制canvas画布
                render.render(scene, camera);
                //监听屏幕刷新(60HZ,120HZ),每次刷新触发一次requestAnimationFrame回调函数
                //但是requestAnimationFrame的回调函数注册生命只有一次,因此需要循环注册,才能达到一直调用的效果
                window.requestAnimationFrame(renderFun);
            };
            // window.requestAnimationFrame(renderFun);
            renderFun();

//画布全屏
            window.addEventListener("dblclick", () => {
                if (document.fullscreenElement) {
                    document.exitFullscreen();
                } else {
                    //document.documentElement.requestFullscreen();
                    render.domElement.requestFullscreen();
                }
            });

//监听画面变化,更新渲染画面,(自适应的大小)
            window.addEventListener("resize", () => {
                //更新摄像机的宽高比
                camera.aspect = window.innerWidth / window.innerHeight;
                //更新摄像机的投影矩阵
                camera.updateProjectionMatrix();
                //更新渲染器宽度和高度
                render.setSize(window.innerWidth, window.innerHeight);
                //设置渲染器的像素比
                render.setPixelRatio(window.devicePixelRatio);
                console.log("画面变化了");
            });
        },
        methods: {
            paush(animate) {
                animate.pause();
            },
        },
    };
</script>

<style scoped lang="scss">
</style>

效果图:

ThreeJS-太阳球围绕旋转(二十四)相关推荐

  1. 智课雅思词汇---二十四、形容词后缀-al-ial-ar-ary-ic-id-ish-ile-ine-oid-ory

    智课雅思词汇---二十四.形容词后缀-al-ial-ar-ary-ic-id-ish-ile-ine-oid-ory 一.总结 一句话总结: 1.形容词后缀-al? autumnal 英 [ɔː'tʌ ...

  2. matlab火星漫游车转向控制,OSG开发笔记(二十四):OSG漫游之平移与转向

    若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 本文章博客地址:https://blog.csdn.net/qq21497936/ ...

  3. 数字图像处理领域的二十四个典型算法及vc实现、第一章

    数字图像处理领域的二十四个典型算法及vc实现.第一章 作者:July   二零一一年二月二十六日. 参考:百度百科.维基百科.vc数字图像处理. --------------------------- ...

  4. [系统安全] 二十四.逆向分析之OllyDbg调试INT3断点、反调试、硬件断点与内存断点

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  5. 数字图像处理领域的二十四个典型算法

    数字图像处理领域的二十四个典型算法及vc实现.第一章 一.256色转灰度图 二.Walsh变换 三.二值化变换 四.阈值变换 五.傅立叶变换 六.离散余弦变换 数字图像处理领域的二十四个典型算法及vc ...

  6. 噢~已二十四了。。。

    鱼跃龙门恨难敌,潜龙困兽终是迷.又是一篇章-- 二十四,已二十四了.     二十四,就这么二十四了.     二十四,我记住了很多.     二十四,我忘记了很多.     二十四,算是什么概念呢? ...

  7. 二十四、Struts2中的UI标签

    二十四.Struts2中的UI标签 Struts2中UI标签的优势: 数据回显 页面布局和排版(Freemark),struts2提供了一些常用的排版(主题:xhtml默认 simple ajax) ...

  8. python 分数序列求和公式_Python分数序列求和,编程练习题实例二十四

    本文是关于Python分数序列求和的应用练习,适合菜鸟练习使用,python大牛绕行哦. Python练习题问题如下: 问题简述:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13 要 ...

  9. 异常处理程序和软件异常——Windows核心编程学习手札之二十四

    异常处理程序和软件异常 --Windows核心编程学习手札之二十四 CPU负责捕捉无效内存访问和用0除一个数值这种错误,并相应引发一个异常作为对错误的反应,CPU引发的异常称为硬件异常(hardwar ...

  10. 山海演武传·黄道·第一卷 雏龙惊蛰 第二十二 ~ 二十四章 真龙之剑·星墟列将...

    山海演武传·黄道·第一卷 雏龙惊蛰 第二十二 ~ 二十四章 真龙之剑·星墟列将 "我是第一次--请你,请你温柔一点--"少女一边娇喘着,一边将稚嫩的红唇紧贴在男子耳边,樱桃小嘴盈溢 ...

最新文章

  1. 直接对梯度下手,阿里达摩院提出新型优化方法,一行代码即可替换现有优化器...
  2. YOLO训练Pedestrain
  3. extern的关键字用法(C# 参考)
  4. Qt动态库的链接问题
  5. 爱的十个秘密--2.思想的力量
  6. 10个CSS简写/优化技巧
  7. 马拉车(manacher)算法——最长回文(hdu3068)
  8. 【紫书第八章】算法的时间优化设计
  9. 【PS技能+】简单几步教会你使用PS制作GIF动图
  10. Vue中使用地图平台MapboxGL
  11. jQuery插件库链接
  12. 专访 | 宋星 10 年启示录:数字营销如何觐见下一个 10 年?
  13. 说一下浏览器垃圾回收机制?
  14. web前端开发浏览器兼容性 - 持续更新
  15. idea 设置编辑器 table 全部显示
  16. 相片尺寸规格像素一览
  17. ufo未来的计算机,人工智能、现代科学证明:宇宙是虚拟的,真实世界是超级计算计...
  18. cas的service管理
  19. 《在网页中实现手机验证码登陆代码》
  20. 华为最新全面屏手机鸿蒙系统,华为P50pro最新确认:麒麟1020+立体全面屏+鸿蒙系统,这才是华为...

热门文章

  1. 微信公众号如何上传附件(Word、Excel、Pdf、PPT),三步轻松实现
  2. 成功解决raise TypeError(‘Unexpected feature_names type‘)TypeError: Unexpected feature_names type
  3. 我的世界java版如何装mod_我的世界MOD安装详解教程 全方位介绍MOD
  4. 5G系统新型网络架构
  5. 软件基础原理——程序运行原理
  6. html 中渐变方向,CSS3渐变,就是这么玩
  7. [源码、文档、分享] iOS/iPhone学习系列、代码教程(转)
  8. 安卓和苹果对于https域名下的引用http域的文件
  9. 清华同方主机装系统过程中进不去bios
  10. 搭建文字转语音(TTS)服务器