国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

ThreeJS-3D教學(xué)五-材質(zhì)

這篇具有很好參考價值的文章主要介紹了ThreeJS-3D教學(xué)五-材質(zhì)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

我們在ThreeJS-3D教學(xué)二:基礎(chǔ)形狀展示中有簡單介紹過一些常用的材質(zhì),這次我們舉例來具體看下效果:
ThreeJS-3D教學(xué)五-材質(zhì),three,3d,材質(zhì),javascript,前端
代碼是這樣的:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <style>
    body {
      width: 100%;
      height: 100%;
    }
    * {
      margin: 0;
      padding: 0;
    }
    .label {
      font-size: 20px;
      color: #000;
      font-weight: 700;
    }
  </style>
</head>
<body>
<div id="container"></div>
<script type="importmap">
  {
    "imports": {
      "three": "../three-155/build/three.module.js",
      "three/addons/": "../three-155/examples/jsm/"
    }
  }
</script>
<script type="module">
import * as THREE from 'three';
import Stats from 'three/addons/libs/stats.module.js';
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
import { GPUStatsPanel } from 'three/addons/utils/GPUStatsPanel.js';
import { CSS2DRenderer, CSS2DObject } from 'three/addons/renderers/CSS2DRenderer.js';
let stats, labelRenderer, gpuPanel, spotLight;
let camera, scene, renderer, controls, earth;
const group = new THREE.Group();
let widthImg = 200;
let heightImg = 200;
let time = 0;
init();
initHelp();
initLight();
axesHelperWord();
animate();
// 添加平面
addPlane();
addBox();

function addBox() {
  /**
   * 凹凸貼圖可以使紋理也有厚度,看起來更立體。凹凸貼圖一般使用一張灰度圖,設(shè)置成材料的bumpMap屬性
   * */
  const loader = new THREE.TextureLoader();
  loader.load("../materials/line_images/stone.jpg", texture => {
    loader.load("../materials/line_images/stone-bump.jpg",bumpTexture => {
      const boxGeo = new THREE.BoxGeometry(60, 60, 2);
      const material = new THREE.MeshStandardMaterial({
        map: texture,
        bumpMap: bumpTexture,
        bumpScale: 1
      });
      const box = new THREE.Mesh(boxGeo,material);
      box.position.set(-45, 10, 0);
      box.castShadow = true;
      scene.add(box);
    });
  });
  /**
   * 法向貼圖使用一張法向圖來表示紋理圖片某個點的法向量。即用一張圖片保存另一張圖片的法向量信息,
   * 然后再在threejs中將這兩個圖片的信息合在一起,就形成了一個細節(jié)豐富的立體紋理
   * 設(shè)置材質(zhì)的 normalMap 屬性
   * */
  loader.load("../materials/line_images/normal2.jpg", texture => {
    loader.load("../materials/line_images/normal1.jpg", bumpTexture => {
      const boxGeo = new THREE.BoxGeometry(60, 60, 2);
      const material = new THREE.MeshStandardMaterial({
        map: texture,
        normalMap: bumpTexture
      });
      // material.normalScale.set(1, 1)
      const box = new THREE.Mesh(boxGeo,material);
      box.position.set(45, 10, 0);
      box.castShadow = true;
      scene.add(box);
    });
  });

  // 高光貼圖
  loader.load("../materials/line_images/earth.jpg",textureNormal => {
    loader.load("../materials/line_images/earthSpec.png", textureSpec => {
      const meterial = new THREE.MeshPhongMaterial({
        shininess: 5, //高光部分的亮度,默認30
        map: textureNormal, // 普通紋理貼圖
        specularMap: textureSpec, // 高光貼圖
        specular: '#fff' // 高光部分的顏色
      });
      /**
       SphereGeometry(radius:浮點,widthSegments:整數(shù),heightSegments:整數(shù))
          radius——球體半徑。默認值為1。
          widthSegments—水平線段的數(shù)量。最小值為3,默認值為32。
          heightSegments—垂直線段的數(shù)量。最小值為2,默認值為16。
       */
      const earthGeo = new THREE.SphereGeometry(15, 50, 50);
      earth = new THREE.Mesh(earthGeo, meterial);
      earth.position.set(0, 15, 70);
      earth.castShadow = true;
      scene.add(earth);
    });
  });
}

function addPlane() {
  // 創(chuàng)建一個平面 PlaneGeometry(width, height, widthSegments, heightSegments)
  const planeGeometry = new THREE.PlaneGeometry(widthImg, heightImg, 1, 1);
  // 創(chuàng)建 Lambert 材質(zhì):會對場景中的光源作出反應(yīng),但表現(xiàn)為暗淡,而不光亮。
  const planeMaterial = new THREE.MeshPhongMaterial({
    color: 0xb2d3e6,
    side: THREE.DoubleSide
  });
  const plane = new THREE.Mesh(planeGeometry, planeMaterial);
  // 以自身中心為旋轉(zhuǎn)軸,繞 x 軸順時針旋轉(zhuǎn) 45 度
  plane.rotation.x = -0.5 * Math.PI;
  plane.position.set(0, -4, 0);
  plane.castShadow = true;
  plane.receiveShadow = true;
  scene.add(plane);
}

function init() {

  camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 10, 1000 );
  camera.up.set(0, 1, 0);
  camera.position.set(60, 40, 60);
  camera.lookAt(0, 0, 0);

  scene = new THREE.Scene();
  scene.background = new THREE.Color( '#ccc' );

  renderer = new THREE.WebGLRenderer( { antialias: true } );
  renderer.setPixelRatio( window.devicePixelRatio );
  renderer.setSize( window.innerWidth, window.innerHeight );

  renderer.shadowMap.enabled = true;
  renderer.shadowMap.type = THREE.PCFSoftShadowMap;
  renderer.toneMapping = THREE.ACESFilmicToneMapping;
  // 色調(diào)映射的曝光級別
  renderer.toneMappingExposure = 1;

  document.body.appendChild( renderer.domElement );

  labelRenderer = new CSS2DRenderer();
  labelRenderer.setSize( window.innerWidth, window.innerHeight );
  labelRenderer.domElement.style.position = 'absolute';
  labelRenderer.domElement.style.top = '0px';
  labelRenderer.domElement.style.pointerEvents = 'none';
  document.getElementById( 'container' ).appendChild( labelRenderer.domElement );

  controls = new OrbitControls( camera, renderer.domElement );

  // 設(shè)置最大最小視距
  controls.minDistance = 20;
  controls.maxDistance = 1000;

  window.addEventListener( 'resize', onWindowResize );

  stats = new Stats();
  stats.setMode(1); // 0: fps, 1: ms
  document.body.appendChild( stats.dom );

  gpuPanel = new GPUStatsPanel( renderer.getContext() );
  stats.addPanel( gpuPanel );
  stats.showPanel( 0 );

  scene.add( group );
}

function initLight() {

  const targetObject = new THREE.Object3D();
  targetObject.position.set(0, 0, 0);
  scene.add(targetObject);

  spotLight = new THREE.SpotLight(0xffffff);
  spotLight.position.set(0, 80, 150);
  spotLight.target = targetObject;
  spotLight.angle = Math.PI / 4;
  spotLight.intensity = 500;
  spotLight.penumbra = 1;
  spotLight.decay = 1;
  spotLight.distance = 300;
  // spotLight.map = textures['uv_grid_opengl.jpg'];

  spotLight.castShadow = true;
  spotLight.shadow.mapSize.width = 1024;
  spotLight.shadow.mapSize.height = 1024;
  spotLight.shadow.camera.near = 1;
  spotLight.shadow.camera.far = 200;
  spotLight.shadow.focus = 1;
  scene.add(spotLight);
  const lightHelper = new THREE.SpotLightHelper(spotLight);
  scene.add(lightHelper);

  const AmbientLight = new THREE.AmbientLight(new THREE.Color('rgb(255, 255, 255)'));
  scene.add( AmbientLight );
}

function initHelp() {
  // const size = 100;
  // const divisions = 5;
  // const gridHelper = new THREE.GridHelper( size, divisions );
  // scene.add( gridHelper );

  // The X axis is red. The Y axis is green. The Z axis is blue.
  const axesHelper = new THREE.AxesHelper( 100 );
  scene.add( axesHelper );
}

function axesHelperWord() {
  let xP = addWord('X軸');
  let yP = addWord('Y軸');
  let zP = addWord('Z軸');
  xP.position.set(50, 0, 0);
  yP.position.set(0, 50, 0);
  zP.position.set(0, 0, 50);
}

function addWord(word) {
  let name = `<span>${word}</span>`;
  let moonDiv = document.createElement( 'div' );
  moonDiv.className = 'label';
  // moonDiv.textContent = 'Moon';
  // moonDiv.style.marginTop = '-1em';
  moonDiv.innerHTML = name;
  const label = new CSS2DObject( moonDiv );
  group.add( label );
  return label;
}

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

function animate() {
  requestAnimationFrame( animate );

  if (earth) {
    time += 0.00005;
    earth.rotateY(time);
  }

  stats.update();
  controls.update();
  labelRenderer.render( scene, camera );
  renderer.render( scene, camera );
}
</script>
</body>
</html>

圖片我依次放進來,方便大家本地看效果

stone.jpg

ThreeJS-3D教學(xué)五-材質(zhì),three,3d,材質(zhì),javascript,前端

stone-bump.jpg

ThreeJS-3D教學(xué)五-材質(zhì),three,3d,材質(zhì),javascript,前端

normal2.jpg

ThreeJS-3D教學(xué)五-材質(zhì),three,3d,材質(zhì),javascript,前端

normal1.jpg

ThreeJS-3D教學(xué)五-材質(zhì),three,3d,材質(zhì),javascript,前端

earth.jpg

ThreeJS-3D教學(xué)五-材質(zhì),three,3d,材質(zhì),javascript,前端

earthSpec.png

ThreeJS-3D教學(xué)五-材質(zhì),three,3d,材質(zhì),javascript,前端
具體的注釋也都放代碼里了!感覺不錯的點個贊,光白嫖可還行!文章來源地址http://www.zghlxwxcb.cn/news/detail-733753.html

到了這里,關(guān)于ThreeJS-3D教學(xué)五-材質(zhì)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • ThreeJS-3D教學(xué)十-有寬度的line

    ThreeJS-3D教學(xué)十-有寬度的line

    webgl中線是沒有寬度的,現(xiàn)實的應(yīng)用中一般做法都是將線拓寬成面來繪制。默認threejs的線寬是無法調(diào)節(jié)的,需要用有厚度的線 THREE.Line2。 先看效果圖: 看下代碼:

    2024年02月07日
    瀏覽(23)
  • ThreeJS-3D教學(xué)八-OBJLoader模型加載+動畫

    ThreeJS-3D教學(xué)八-OBJLoader模型加載+動畫

    先看效果圖: 本篇給大家介紹下模型加載的知識,用到了OBJLoader對應(yīng)的模型,為了增加趣味性,花了些時間,利用new THREE.Points獲取到模型上的點,做了一個動畫效果,其實就是操作 Y軸上的點,先降低上0,然后再還原,代碼如下: 如果有同學(xué)從我第一篇文章開始學(xué)到現(xiàn)在,

    2024年04月24日
    瀏覽(21)
  • ThreeJS-3D教學(xué)三:平移縮放+物體沿軌跡運動

    ThreeJS-3D教學(xué)三:平移縮放+物體沿軌跡運動

    我們在項目中會有一些這樣的需求,我們可視化一個場景,需要俯視、平移、縮放,方便觀察場景中的數(shù)據(jù)或者模型,之所以把這個案例拿出來 1、這是個很實用的需求,我相信很多人會用到 2、我自己認為在實際案例中我們可以學(xué)習(xí)相關(guān)知識點更易吸收些 為了豐富本篇文章

    2024年02月03日
    瀏覽(21)
  • 【js&threeJS】入門three,并實現(xiàn)3D汽車展示廳,附帶全碼

    【js&threeJS】入門three,并實現(xiàn)3D汽車展示廳,附帶全碼

    首先放個最終效果圖: ? 三維(3D)概念: 三維(3D)是一個描述物體在三個空間坐標(biāo)軸上的位置和形態(tài)的概念。相比于二維(2D)只有長度和寬度的平面,三維增加了高度或深度這一維度 在三維空間中,我們使用三個獨立的坐標(biāo)軸來描述物體的位置。通常使用笛卡爾坐標(biāo)系

    2024年02月11日
    瀏覽(703)
  • ThreeJS-3D教學(xué)十一:屏幕坐標(biāo)和世界坐標(biāo)轉(zhuǎn)換

    ThreeJS-3D教學(xué)十一:屏幕坐標(biāo)和世界坐標(biāo)轉(zhuǎn)換

    直接復(fù)制上面的代碼,將three資源路徑修改后,啟動即可看到效果 上面是代碼實現(xiàn),以下我們看下一些理論知識點: 坐標(biāo)系之間的轉(zhuǎn)換關(guān)系大致為: 因此坐標(biāo)轉(zhuǎn)換過程就變成了: 原本世界坐標(biāo)轉(zhuǎn)換到觀察空間坐標(biāo)需要乘上視圖矩陣 CameraMatrixWorldInverse(ViewMatrix) 隨后,觀察空

    2024年01月17日
    瀏覽(20)
  • Three.JS教程5 threejs中的材質(zhì)

    Three.JS教程5 threejs中的材質(zhì)

    Three.js中的材質(zhì)(Material)是實現(xiàn)引人注目的3D效果的關(guān)鍵組件之一。本篇博客中,我們將深入探討Three.js中的材質(zhì)類型、屬性和用法。 在Three.js中,材質(zhì)是應(yīng)用于幾何體(Geometry)的外觀和紋理的規(guī)則。它們決定了對象在場景中如何反射光線、顯示顏色、反射環(huán)境等。 Three.j

    2024年02月21日
    瀏覽(95)
  • 前端前沿web 3d可視化技術(shù) ThreeJS學(xué)習(xí)全記錄

    前端前沿web 3d可視化技術(shù) ThreeJS學(xué)習(xí)全記錄

    完整案例與項目代碼: gitee開源項目地址 https://gitee.com/jumping-world-line/01_threeJS_basic 隨著瀏覽器性能和網(wǎng)絡(luò)帶寬的提升 使得3D技術(shù)不再是桌面的專利 打破傳統(tǒng)平面展示模式 前端方向主要流向的3D圖形庫包括Three.js和WebGL WebGL靈活高性能,但代碼量大,難度大,需要掌握很多底層

    2024年02月01日
    瀏覽(150)
  • 除了three.js,還有許多其他前端開發(fā)語言和庫可以用于創(chuàng)建3D可視化大屏

    除了three.js,還有許多其他前端開發(fā)語言和庫可以用于創(chuàng)建3D可視化大屏

    hello老鐵們...本人熟悉html5,vue對bootsrap,uniapp,layui,element,vite,antd,echarts,jq響應(yīng)式尤其擅長,ui設(shè)計等技能,如果ui前端工作中有遇到煩惱可私信關(guān)注評論我們共同交流進步!謝謝?? ? ? 隨著前端技術(shù)的飛速發(fā)展,3D可視化已經(jīng)成為許多應(yīng)用場景中不可或缺的一部分。在

    2024年03月15日
    瀏覽(97)
  • 19個Web前端交互式3D JavaScript框架和庫

    19個Web前端交互式3D JavaScript框架和庫

    JavaScript (JS) 是一種輕量級的解釋(或即時編譯)編程語言,是世界上最流行的編程語言。JavaScript 是一種基于原型的多范式、單線程的動態(tài)語言,支持面向?qū)ο?、命令式和聲明式(例如函?shù)式編程)風(fēng)格。JavaScript 幾乎可以做任何事情,更可以在包括物聯(lián)網(wǎng)在內(nèi)的多個平臺

    2024年02月22日
    瀏覽(21)
  • Threejs開發(fā)3D展館 | 大帥老猿threejs特訓(xùn)

    Threejs開發(fā)3D展館 | 大帥老猿threejs特訓(xùn)

    本文將介紹如果使用Threejs開發(fā)制作一個3D展館,效果如圖: ?首先,我們需要一個展館模型。我是通過Blender做出來的,在Blender中將模型導(dǎo)出為glb格式。 接下來,我們通過代碼將模型加載到網(wǎng)頁中。 在3D圖形開發(fā)中,最基本的概念就是場景、相機和光源。這三個是構(gòu)成3D世界

    2024年02月11日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包