亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

使用Three.js實現太陽系八大行星的自轉公轉示例代碼

2024-05-06 16:49:42
字體:
來源:轉載
供稿:網友

一. Three.js框架簡介

Three.js是用javascript編寫的WebGL第三方庫,運用three.js框架寫3D程序,就如同在現實生活中觀察一個3D場景一樣,讓人置身其中。介紹three.js必須提到它的三大組件,Scene,Camera,Render。它們是整個框架的基礎,有了這三個組件才能將物體渲染到網頁上,實現整個場景的搭建。

場景(scene)

顧名思義,就是用來放置所有的元素。

var scene = new THREE.Scene(); //建立場景

相機(camera)

相機,我們要在哪個位置,如何去看這些元素。

相機分為多種,不展開介紹,這里我們使用的是 透視相機

var camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 1, 10000); //設置相機為 角度60度,寬高比,最近端Z軸為1,最遠端Z軸為10000

我們可以通過一張來自three.js文檔中的圖片來了解這些屬性

Three.js,行星,代碼

渲染器(render)

當把場景中的所有內容準備好后,就可以對場景進行渲染,表示我們怎樣來繪制這些元素。

渲染器也分為多種,這里使用的是WebGLRenderer;

var renderer = new THREE.WebGLRenderer();

具體步驟:建立元素->定義相機->搭建場景->將元素和相機放入場景中->渲染場景

具體代碼我們會在后面介紹,然后讓我們先瞅一眼效果圖。

二. 基本初始化

這里直接在CDN上引入three.js

<script src="https://cdn.bootcss.com/three.js/r83/three.min.js"></script>

注:因為某些行星的大小,轉速,距離差距過大,所以進行了一些不平衡調整。

下面將一一分析這些元素是如何放入的。

1.canvas

我們沒有把場景直接掛載到body中,而是在body中放置了一個canvas畫布,在其上顯示。

2.背景

我們沒有做3D的旋轉背景,而是直接放了一張背景圖作為小太陽系的背景。這張背景圖是直接在canvas中放置的。

<canvas id="webglcanvas"></canvas>renderer = new THREE.WebGLRenderer({ //定義渲染器   alpha: true, //讓背景透明,默認是黑色,以顯示我們自己的背景圖  });renderer.setClearAlpha(0);//css文件#webglcanvas {   background: url(./images/bg4.jpg) no-repeat;   background-size: cover;  }

但如果只是這樣簡單的操作是沒有用的,因為在添加渲染器后,會默認添加一個背景顏色為黑色。所以要在渲染器中設置它的alpha屬性(WebGL渲染器及屬性方法),讓背景透明,以顯示我們自己的背景圖

3.定義基本組件

定義場景

scene = new THREE.Scene(), //建立場景

定義照相機位置

camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 1,10000); //設置相機為 角度60度,寬高比,最近端Z軸為1,最遠端Z軸為10000  camera.position.z = 2000; //調整相機位置  camera.position.y = 500;

建立一個組

組可以看作是一些元素的容器,將某些有共同特征的元素放在一個組里。

group = new THREE.Group(), //建立一個組

我會在第三節解釋為什么要建立額外16個組。

 //下面這些組用來建立每個星球的父元素,以實現 八大行星不同速度的公轉與自轉  var group1 = new THREE.Group();   groupParent1 = new THREE.Group();   group2 = new THREE.Group();   groupParent2 = new THREE.Group();   group3 = new THREE.Group();   groupParent3 = new THREE.Group();   group4 = new THREE.Group();   groupParent4 = new THREE.Group();   group5 = new THREE.Group();   groupParent5 = new THREE.Group();   group6 = new THREE.Group();   groupParent6 = new THREE.Group();   group7 = new THREE.Group();   groupParent7 = new THREE.Group();   group8 = new THREE.Group();   groupParent8 = new THREE.Group();

定義渲染器

WebGLRenderer中有一個用來繪制輸出的canvas對象,現在獲取設置的canvas放入我們渲染器中的canvas對象中

var canvas = document.getElementById('webglcanvas'),renderer = new THREE.WebGLRenderer({ //定義渲染器   alpha: true, //讓背景透明,默認是黑色 以顯示我們自己的背景圖   canvas: canvas, //一個用來繪制輸出的Canvas對象   antialias: true //抗鋸齒  });renderer.setSize(window.innerWidth, window.innerHeight); //設置渲染器的寬高

4.初始化函數

在這個函數中進行一系列的初始化操作。

function init() {  //用來初始化的函數   scene.add(group); //把組都添加到場景里   scene.add(groupParent1);   scene.add(groupParent2);   scene.add(groupParent3);   scene.add(groupParent4);   scene.add(groupParent5);   scene.add(groupParent6);   scene.add(groupParent7);   scene.add(groupParent8);      var loader = new THREE.TextureLoader();/*材質 紋理加載器*/   // 太陽   loader.load('./images/sun1.jpg', function (texture) {      var geometry = new THREE.SphereGeometry(250, 20, 20) //球體模型     var material = new THREE.MeshBasicMaterial({ map: texture }) //材質 將圖片解構成THREE能理解的材質    var mesh = new THREE.Mesh(geometry, material);  //網孔對象 第一個參數是幾何模型(結構),第二參數是材料(外觀)    group.add(mesh);//添加到組里   })   // 水星   loader.load('./images/water.jpg', function (texture) {    var geometry = new THREE.SphereGeometry(25, 20, 20) //球型     var material = new THREE.MeshBasicMaterial({ map: texture }) //材質 將圖片解構成THREE能理解的材質    var mesh = new THREE.Mesh(geometry, material);    group1.position.x -= 300;    group1.add(mesh);    groupParent1.add(group1);   })   //其它7顆行星參數因為太長了在這里就不給出了,但參數的設置原理都是一樣的   }

簡要解釋一下:

var loader = new THREE.TextureLoader();是定義了一個材質紋理加載器。

var geometry = new THREE.SphereGeometry(250, 20, 20);建立一個球體模型,球體半徑為250,水平分割面的數量20,垂直分割面的數量20。

var mesh = new THREE.Mesh(geometry, material);網孔對象。

具體作用就是創建一個球體元素,先構建框架,在用行星的平面圖將它包裹起來,就形成了一顆行星,再把這顆行星添加到組里,之后再把組添加到場景里。這里就構建單個元素的過程。

那么為什么太陽直接添加到組里,而水星要用兩個組層級添加,且給它的位置設偏移呢。我們來到第三節。

三. 自轉同時公轉

旋轉方式:我們要實現旋轉功能有三種方式

1.旋轉照相機  2.旋轉整個場景(Scene)  3.旋轉單個元素。

因為我們這里每個行星的自轉速度,公轉速度都不一樣。所以設置整體旋轉并不可行,所以要給每個元素設置不同的旋轉屬性。

旋轉機制:這里介紹物體的rotation屬性,相對于自身旋轉。

例如:

scene.rotation.y += 0.04; //整個場景繞自身的Y軸逆時針旋轉

進入正題

Three.js,行星,代碼

Scene中的所有元素使用rotation.y屬性,默認旋轉軸都為這根Y軸,因為它們初始化Y軸就是這根軸。
所以讓太陽旋轉直接讓它的組旋轉就行了group.rotation.y += 0.04;

而其它行星需要讓它們圍繞著太陽轉,就要先給它們自身設置一個位置偏移。例如水星:group1.position.x -= 300;  而此時設置group1.rotation.y屬性,它就會實現自轉。因為它的Y軸位置已經改變了。

Three.js,行星,代碼

那么此時要想再實現公轉,在這個對象中是找不到默認Y軸這根線的。所以我們給group1再設置了一個“父元素”groupParent1。groupParent1.add(group1);

當我們移動了group1時,groupParent1的位置是沒有變的,自然它的Y軸也不會變,又因為groupParent1包含了group1,所以旋轉groupParent1時,group1也會繞著初始的默認Y軸旋轉。所以設置那么多組,是為了實現每顆行星不同的速度和公轉的同時自轉。

Three.js,行星,代碼

四. 其他實現函數

  function render() {   renderer.render(scene, camera);   camera.lookAt(scene.position); //讓相機盯著場景的位置 場景始終在中間  }  //設置公轉  function revolution(){   groupParent1.rotation.y += 0.15;   groupParent2.rotation.y += 0.065;   groupParent3.rotation.y += 0.05;   groupParent4.rotation.y += 0.03;   groupParent5.rotation.y += 0.001;    groupParent6.rotation.y += 0.02;   groupParent7.rotation.y += 0.0005;   groupParent8.rotation.y += 0.003;  }  //設置自轉  function selfRotation(){   group.rotation.y += 0.04;   group1.rotation.y += 0.02;   group2.rotation.y -= 0.005;   group3.rotation.y += 1;   group4.rotation.y += 1;   group5.rotation.y += 1.5;   group6.rotation.y += 1.5;   group7.rotation.y -= 1.5;   group8.rotation.y += 1.2;  }  function Animation() {   render();   selfRotation();   revolution();   requestAnimationFrame(Animation);   }

最后再調用一下 init()Animation()函數就OK了。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人精品av在线| 国产精品久久久久久久久免费看| 亚洲欧美精品一区| 亚洲国产精品999| 日韩在线国产精品| 欧美专区中文字幕| 亚洲欧美中文日韩在线v日本| 国内精品久久久久| 国内精品在线一区| 国产精品久久久久久婷婷天堂| 久久不射热爱视频精品| 欧美激情网站在线观看| 亚洲bt天天射| 久久久人成影片一区二区三区观看| 亚洲精品资源在线| 国产精品久久77777| 日韩黄在线观看| 91亚洲国产精品| 另类少妇人与禽zozz0性伦| 欧美激情aaaa| 1769国内精品视频在线播放| 日韩精品在线看| 欧美精品在线网站| 国外成人在线视频| 成人午夜在线视频一区| 欧美日韩一区二区免费视频| 亚洲色图综合久久| 欧美日韩亚洲成人| 青青草99啪国产免费| 国产精品嫩草影院久久久| 国产精品成人va在线观看| 成人精品久久av网站| 欧美国产日韩视频| 国产亚洲精品美女久久久久| 欧美www在线| 国产精品久久av| 欧美激情xxxx性bbbb| 成人字幕网zmw| 亚洲夜晚福利在线观看| 欧美日韩中文在线观看| 国产精品日韩欧美大师| 欧美成在线视频| 成人免费激情视频| 亚洲大胆美女视频| 国产精品久久久久7777婷婷| 96精品视频在线| 国产日本欧美一区二区三区在线| 日韩精品有码在线观看| 日韩男女性生活视频| 亚洲风情亚aⅴ在线发布| 97在线观看免费高清| 国产一区av在线| 国内精品免费午夜毛片| 在线亚洲国产精品网| 国产亚洲精品久久| 91国产一区在线| 色综合91久久精品中文字幕| 亚洲香蕉av在线一区二区三区| 色综合老司机第九色激情| 成人a免费视频| 欧美成人精品三级在线观看| 红桃av永久久久| 成人免费视频网| 粗暴蹂躏中文一区二区三区| 神马久久久久久| 日韩欧美在线一区| 久久久人成影片一区二区三区观看| 中国china体内裑精亚洲片| 久久久91精品国产一区不卡| 国产免费久久av| 国产精品久久久久久亚洲影视| 欧美国产日本高清在线| 国产一区视频在线播放| 亚洲视频在线播放| 伊人伊人伊人久久| 一级做a爰片久久毛片美女图片| 亚洲女同精品视频| 欧美人与性动交a欧美精品| 欧美极品少妇xxxxⅹ喷水| 国产偷国产偷亚洲清高网站| 黄色精品在线看| 亚洲国产精品一区二区三区| 中文字幕精品在线视频| 最近2019中文字幕第三页视频| 欧日韩在线观看| 欧美久久精品午夜青青大伊人| 久久777国产线看观看精品| 欧美xxxx18国产| 精品调教chinesegay| 免费99精品国产自在在线| 成人激情电影一区二区| 亚洲成**性毛茸茸| 国产精品www| 大胆欧美人体视频| 国产一区二区在线播放| 伊人久久久久久久久久久久久| 国色天香2019中文字幕在线观看| 午夜精品一区二区三区av| 91精品久久久久久久久久| 欧美性资源免费| 日韩高清电影免费观看完整版| 欧美成人激情在线| 一区二区欧美在线| 成人午夜一级二级三级| 国产精品久久久久久av福利| 亚洲精品二三区| 亚洲天堂网在线观看| 中日韩美女免费视频网站在线观看| 亚洲欧美成人在线| 中文字幕亚洲欧美日韩在线不卡| 国产亚洲精品91在线| 日韩美女在线播放| 欧美一级免费看| 中文字幕久热精品在线视频| 中日韩午夜理伦电影免费| 91丨九色丨国产在线| 欧美日韩中文字幕综合视频| 综合网日日天干夜夜久久| 欧美一级成年大片在线观看| 欧美国产极速在线| 亚洲欧美制服中文字幕| 国产日韩欧美一二三区| 日韩69视频在线观看| 不卡中文字幕av| 国产精品欧美一区二区| 97成人超碰免| 亚洲国产高清自拍| 国产一区私人高清影院| 日韩美女写真福利在线观看| 啊v视频在线一区二区三区| 亚洲经典中文字幕| 在线a欧美视频| 日韩中文字幕国产精品| 97在线视频免费观看| 亚洲一区亚洲二区亚洲三区| 久久久精品久久| 国语自产精品视频在线看一大j8| 国产精品久久久久久久9999| 亚洲国产精品推荐| 97精品视频在线| 中文国产成人精品久久一| 色系列之999| 国产精品吊钟奶在线| 伊人久久精品视频| 国产精品xxx视频| 欧美午夜电影在线| 亚洲乱码av中文一区二区| 日本国产精品视频| 亚洲第一精品福利| 在线日韩欧美视频| 2019精品视频| 亚洲日本成人女熟在线观看| 亚洲精品suv精品一区二区| 一区二区三区四区在线观看视频| 狠狠色噜噜狠狠狠狠97| 亚洲美女视频网站| www.亚洲男人天堂| 91亚洲一区精品| 亚洲精品国精品久久99热| 国产一区二区丝袜高跟鞋图片| 欧美精品一区二区三区国产精品| 久久久久久999| 欧美精品videos另类日本| 日韩高清欧美高清|