JSFiddle - React, Tailwind, and code Playground

by j91157j91157

HTML

<title>Hello Three.js</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/84/three.min.js"></script>
<script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>
<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/stats.js/r16/Stats.min.js"></script>

<div>
  <input id='angle' type='text'>
  <button id='myButton'>顯示XYZ軸</button>
</div>

CSS

body {
  overflow: hidden;
}

div {
  position: absolute;
  top: 90vh;
  left: 43vw;
}

#angle {
  height: 20px;
  width: 45px
}

JavaScript

var renderer, camera, controls, scene;
var stats;
var cubeGeometry, cubeMaterial, cube;

init();
animate();
rotate();

function init() {
  renderer = new THREE.WebGLRenderer({ //renderer = 呈現,建立算圖引擎
    antialias: true //進行抗鋸齒算圖
  });
  renderer.setSize(window.innerWidth, window.innerHeight);
  renderer.setClearColor(0xAAAAAA); //背景顏色,用16進位色碼表示。
  document.body.appendChild(renderer.domElement);

  camera = new THREE.PerspectiveCamera(50, window.innerWidth / window.innerHeight, 1, 1000); //(相機平截鏡頭垂直視野,相機平截鏡頭縱橫比,離相機鏡頭最近,離相機鏡頭最遠)
  camera.position.z = 50; // important  可視為程式剛開始執行的時候camera所要呈現的視角,這裡我們視角座標為(0,0,50)。

  controls = new THREE.OrbitControls(camera, renderer.domElement); //控制視角遠近的 function

  scene = new THREE.Scene(); //創造場景的呈現樣貌 (XYZ軸以及方格子)

  let gridXZ = new THREE.GridHelper(100, 20, 'yellow', 'white'); //(大小, 每個邊格子劃分數, 中心線的顏色, 網格線條的顏色)
  scene.add(gridXZ); //顯示十字軸以及方格

  let axes = new THREE.AxisHelper(10); //(大小)
  scene.add(axes); //顯示XYZ軸 (紅,綠,藍)

  stats = new Stats(); //顯示FPS
  stats.domElement.style.position = 'absolute';
  stats.domElement.style.top = '0px';
  stats.domElement.style.left = '0px';
  stats.domElement.style.zIndex = 100;
  document.body.appendChild(stats.domElement);

  $('#myButton').click(function() { //切換軸的顯示
    axes.material.visible = !axes.material.visible; //顯示 = 不顯示
  });
  

  window.addEventListener('resize', onWindowResize, false);

  cubeGeometry = new THREE.BoxGeometry(100, 1, 1);
  cubeMaterial = new THREE.MeshNormalMaterial();
  cube = new THREE.Mesh(cubeGeometry, cubeMaterial);
  scene.add(cube);
}


function animate() {
  controls.update(); //更新控制視角遠近動畫
  stats.update(); //FPS隨時更新
  renderer.render(scene, camera); //算圖
  requestAnimationFrame(animate); //一種不斷對算圖更新的方法,當畫面有進行任何更動時可以不斷更新!!!
}

function onWindowResize() {
  var width = window.innerWidth;
  var height = window.innerHeight;
  camera.aspect = width / height;
  camera.updateProjectionMatrix();
  renderer.setSize(width, height);
}

function rotate() {
 ...