03.Three.js的入门教程(二)如何创建一个3D地球?

这篇具有很好参考价值的文章主要介绍了03.Three.js的入门教程(二)如何创建一个3D地球?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:通过上节课 02.Three.js的入门课程(一),我们了解了Three.js的最小案例DEMO,熟悉了几个重要组成部分。这节课带领大家编写一个3D地球。

一、通过纹理图渲染一个地球

1.1.创建一个纹理加载器对象TextureLoader,可以加载图片作为纹理贴图;

// 引入three.js
import * as THREE from '../../../three.js-r123/build/three.module.js';

// 创建地球mesh网格对象
// 地球半径
var R = 100;

var earth = createSphereMesh(R);

// R:地球半径
function createSphereMesh(R) {

    // 创建纹理加载器对象
    var textureLoader = new THREE.TextureLoader();

    // 加载纹理贴图
    var texture = textureLoader.load('earth.jpg');

    // 创建一个球体几何对象
    var geometry = new THREE.SphereBufferGeometry(R, 40, 40); 
  
    // 材质对象Material
    var material = new THREE.MeshLambertMaterial({
        // color: 0x00ffff,
        map: texture,//设置地球颜色贴图map
    });

    // 网格模型对象Mesh
    var mesh = new THREE.Mesh(geometry, material); 

    return mesh;
}

export { earth }

1.2.完整代码结构

threejs 3d地球,javascript,html5,前端

二、小球标注球面上一点

2.1.创建一个小球的网格模型

// 引入Three.js
import * as THREE from '../../../three.js-r123/build/three.module.js';

// 创建一个小球用于测试
function createSphereMesh(R,x,y,z) {
  // 创建一个球体几何对象  
  var geometry = new THREE.SphereGeometry(R, 25, 25); 
  
  // 材质对象Material
  var material = new THREE.MeshLambertMaterial({
      color: 0xff0000
  });

  // 网格模型对象Mesh
  var mesh = new THREE.Mesh(geometry, material);

  mesh.position.set(x,y,z);

  return mesh
}

export { createSphereMesh }

2.2.完整代码

html

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title></title>
  <style>
    body {
      margin: 0;
      overflow: hidden;
    }
  </style>
</head>

<body>
  <script type="module">
        
    /**
     * 01.创建地球
     */
    import { scene, renderer } from './scene.js'
    // Three.js渲染结果Canvas画布插入到body元素中
    document.body.appendChild(renderer.domElement); 
    
    /**
     * 02.创建小球mesh
     */
    // 地球半径
    var R = 100;
    import { createSphereMesh } from './help.js'
    // 北极球面上绘制一个小球标注
    scene.add(createSphereMesh(10,0,R,0));

  </script>
</body>

</html>

scene.js

/**
 * 01.引入第三方依赖
 */
// 引入Three.js
import * as THREE from '../../../three.js-r123/build/three.module.js';

// 引入Three.js扩展库
import { OrbitControls } from '../../../three.js-r123/examples/jsm/controls/OrbitControls.js';

// 引入地球
import { earth } from './earth.js'


/**
 * 02.创建场景对象Scene
 */
var scene = new THREE.Scene();
scene.add(earth);

/**
 * 03.光源设置
 */
// 平行光1
var directionalLight = new THREE.DirectionalLight(0xffffff, 0.6);
directionalLight.position.set(400, 200, 300);
scene.add(directionalLight);

// 平行光2
var directionalLight2 = new THREE.DirectionalLight(0xffffff, 0.6);
directionalLight2.position.set(-400, -200, -300);
scene.add(directionalLight2);

//环境光
var ambient = new THREE.AmbientLight(0xffffff, 0.6);
scene.add(ambient);

/**
 * 04.相机设置
 */
// width和height用来设置Three.js输出Canvas画布尺寸,同时用来辅助设置相机渲染范围
// 窗口文档显示区的宽度
var width = window.innerWidth; 
// 窗口文档显示区的高度
var height = window.innerHeight; 

// Three.js输出的Cnavas画布宽高比
var k = width / height; 
// 控制相机渲染空间左右上下渲染范围,s越大,相机渲染范围越大
var s = 200; 
// THREE.OrthographicCamera()创建一个正投影相机对象
// -s * k, s * k, s, -s, 1, 1000定义了一个长方体渲染空间,渲染空间外的模型不会被渲染
var camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000);

// 相机在Three.js坐标系中的位置
camera.position.set(200, 300, 200); 
// 相机指向Three.js坐标系原点
camera.lookAt(0, 0, 0); 

/**
 * 05.创建渲染器对象
 */
var renderer = new THREE.WebGLRenderer({
  antialias: true, //开启锯齿
});

// 设置设备像素比率,防止Canvas画布输出模糊
renderer.setPixelRatio(window.devicePixelRatio);
// 设置渲染区域尺寸
renderer.setSize(width, height); 

// 设置背景颜色
// renderer.setClearColor(0xb9d3ff, 1); 
// renderer.domElement表示Three.js渲染结果,也就是一个HTML元素(Canvas画布)
// body元素中插入canvas对象
// document.body.appendChild(renderer.domElement); 

/**
 * 06.渲染循环
 */ 
function render() {
  // 地球绕y轴旋转动画
  // earth.rotateY(0.01);
  // 执行渲染操作
  renderer.render(scene, camera); 
  // 请求再次执行渲染函数render,渲染下一帧
  requestAnimationFrame(render); 
}
render();

/**
 * 07.Three.js三维坐标轴 三个坐标轴颜色RGB分别对应xyz轴
 */
var axesHelper = new THREE.AxesHelper(250);
scene.add(axesHelper);


/**
 * 08.创建控件对象  控件可以监听鼠标的变化,改变相机对象的属性
 */
// 旋转:拖动鼠标左键
// 缩放:滚动鼠标中键
// 平移:拖动鼠标右键
var controls = new OrbitControls(camera, renderer.domElement);

export { scene, renderer}

earth.js

// 引入three.js
import * as THREE from '../../../three.js-r123/build/three.module.js';

// 地球半径
var R = 100;
// 创建地球mesh
var earth = createSphereMesh(R);

function createSphereMesh(r) {
  // TextureLoader创建一个纹理加载器对象,可以加载图片作为纹理贴图
  var textureLoader = new THREE.TextureLoader();

  // 加载纹理贴图
  var texture = textureLoader.load('earth.jpg');

  // 创建一个球体几何对象
  var geometry = new THREE.SphereBufferGeometry(r, 40, 40); 

  // 材质对象Material
  var material = new THREE.MeshLambertMaterial({
    // color: 0x00ffff,
    // 设置地球颜色贴图map
    map: texture,
  });

  // 网格模型对象Mesh
  var mesh = new THREE.Mesh(geometry, material); 

  return mesh
}

export { earth }

help.js

// 引入Three.js
import * as THREE from '../../../three.js-r123/build/three.module.js';

// 创建一个小球用于测试
function createSphereMesh(R,x,y,z) {
  // 创建一个球体几何对象
  var geometry = new THREE.SphereGeometry(R, 25, 25); 

  // 材质对象Material
  var material = new THREE.MeshLambertMaterial({
    color: 0xff0000
  }); 

  // 网格模型对象Mesh
  var mesh = new THREE.Mesh(geometry, material);

  mesh.position.set(x,y,z);
  return mesh
}

export { createSphereMesh }

earth.png

threejs 3d地球,javascript,html5,前端

2.3.运行效果图

threejs 3d地球,javascript,html5,前端

说明:本文代码参考技术博客:www.yanhuangxueyuan.com,如有侵权,请私信作者,删除博文处理。 文章来源地址https://www.toymoban.com/news/detail-761143.html

到了这里,关于03.Three.js的入门教程(二)如何创建一个3D地球?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Three.js基础入门】:创建你的第一个3D场景

    Three.js是一种强大的JavaScript库,用于在Web浏览器中创建交互式的3D图形和动画。无需熟练的图形编程经验,你也可以通过Three.js轻松地构建令人惊叹的3D场景。 本文将带你逐步学习如何入门Three.js,从创建一个简单的3D场景开始。 我们将介绍如何使用Three.js创建你的第一个3D场景

    2024年02月16日
    浏览(163)
  • 【Golang入门教程】如何使用Goland创建并运行项目

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站: 人工智能 前言 在Go语言的开发过程中,选择一个合适的集成开发环境(IDE)是提高效率和编写可维护代码的关键一步。 JetBrains的Goland作为一款专门为Go语言开发的

    2024年01月25日
    浏览(67)
  • Django框架入门到精通(04)Django创建第一个项目 (黄菊华老师大学生毕业设计学习教程)

    博主介绍: 《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,免费 项目配有对应开发文档、开题报告、任务书、PPT、论文模版

    2024年02月06日
    浏览(52)
  • web自动化测试入门篇03——selenium使用教程_(2)在上述学习基础上,自行选择一个合适的网站,进一步在实践中去运用selenium webd(1)

    先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《2024年最新大数据全套学习资料》,

    2024年04月27日
    浏览(67)
  • three.js(一):认识three.js并创建第一个3D应用

    1-three.js 是什么? three.js是用JavaScript编写的WebGL第三方库; three.js 提供了非常多的3D显示和编辑功能; 具体而言,three.js 是一款运行在浏览器中的 3D 引擎,可以用three.js 创建各种三维场景,并对其进行编辑; 在three.js 的官网上看到许多精彩的演示和文档 three.js 官网:https://thre

    2024年02月11日
    浏览(97)
  • 跟着pink老师前端入门教程-day03

    6.1 表格的主要作用 主要用于 显示、展示数据 ,可以让数据显示的规整,可读性非常好,特别是后台展示数据时,能够熟练运用表格就显得很重要。 6.2 基本语法 6.3 表头单元格标签 一般表头单元格位于表格的 第一行或第一列 ,表头单元格里面的 文本内容加粗居中显示 ,突

    2024年01月18日
    浏览(45)
  • ESP8266入门教程03:点亮LED灯

    ESP8266默认是高电平工作,所以想要点亮LED只需要给相应的引脚设置低电平即可。  第11行:使用pinMode(pin, mode)来设置GPIO口工作模式,pin取值范围0 ~ 16,数字引脚0-15可设置为INPUT、OUTPUT、INPUT_PULLUP模式(输入、输出、上拉输入);数字引脚16可设置为INPUT、OUTPUT、INPUT_PULLDOWN_16模式

    2024年02月14日
    浏览(57)
  • 如何做一个快速粉的小红薯ai绘画号?        教程篇:零基础小白如何从入门到精通

    2.1 mewxai绘画教程 2.1.1 什么是mewxai? mewxai是一款微信小程序,打开你的微信,搜索\\\"mewxai\\\"就可以找到,意为\\\"我的微信ai\\\",由于读音不太习惯,加上它的头像酷似一个一个小海豚,所以ai绘画圈子一般称它为\\\"小海豚\\\"。 mewxai的开发者为知乎大v\\\"程序员秋风\\\",开发完成时间为2022年

    2023年04月09日
    浏览(50)
  • Apache Doris 入门教程03:使用Docker或Kubernetes部署Doris

    该文档主要介绍了如何通过 Dockerfile 来制作 Apache Doris 的运行镜像,以便于在容器化编排工具或者快速测试过程中可迅速拉取一个 Apache Doris Image 来完成集群的创建。 概述​ Docker 镜像在制作前要提前准备好制作机器,该机器的平台架构决定了制作以后的 Docker Image 适用的平台

    2024年02月07日
    浏览(47)
  • 【STM32零基础入门教程03】GPIO输入输出之GPIO框图分析

             本章节主要讲解点亮LED的基本原理,以及GPIO框图的讲解。         首先我们查看原理图,观察电路图中LED的连接情况,如下图可以看出我们的板子中LED一端通过限流电阻连接的PB0另一端连接的是高电平VCC,那么我们将PB0位置接地是不是灯就亮了,那我们就想

    2024年02月14日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包