31. Three.js案例-创建并旋转地球模型

31. Three.js案例-创建并旋转地球模型

实现效果

效果

知识点

WebGLRenderer (WebGL渲染器)

用于创建一个WebGL渲染器,负责将3D场景渲染到网页上。

构造器

THREE.WebGLRenderer(parameters : Object)

参数类型描述
parametersObject渲染器的配置参数。

常用参数:

  • antialias:布尔值,是否开启抗锯齿,默认为false
  • alpha:布尔值,是否允许透明背景,默认为false
  • preserveDrawingBuffer:布尔值,是否保留绘图缓冲区,默认为false
方法
  • setPixelRatio(value : Number):设置设备像素比。
  • setSize(width : Number, height : Number, updateStyle : Boolean):设置渲染器的尺寸。

Clock (时钟)

用于获取时间差,常用于动画循环中。

构造器

THREE.Clock(autoStart : Boolean)

参数类型描述
autoStartBoolean是否自动开始计时,默认为true
方法
  • getDelta():返回自上次调用此方法以来的时间差(以秒为单位)。
  • getElapsedTime():返回自时钟启动以来的总时间(以秒为单位)。

PerspectiveCamera (透视相机)

用于创建一个透视相机,模拟人眼观察3D场景的效果。

构造器

THREE.PerspectiveCamera(fov : Number, aspect : Number, near : Number, far : Number)

参数类型描述
fovNumber视野角度(垂直方向)。
aspectNumber宽高比。
nearNumber近裁剪面距离。
farNumber远裁剪面距离。
方法
  • position.set(x : Number, y : Number, z : Number):设置相机的位置。
  • lookAt(vector : Vector3):使相机看向指定的点。

Scene (场景)

用于存储和管理3D对象、光源等。

构造器

THREE.Scene()

方法
  • add(object : Object3D):将对象添加到场景中。
  • background:设置场景的背景颜色或纹理。

AmbientLight (环境光)

用于创建一个环境光源,照亮整个场景。

构造器

THREE.AmbientLight(color : Color, intensity : Number)

参数类型描述
colorColor光源颜色。
intensityNumber光源强度,默认为1。

SphereBufferGeometry (球体几何体)

用于创建一个球体几何体。

构造器

THREE.SphereBufferGeometry(radius : Number, widthSegments : Number, heightSegments : Number, phiStart : Number, phiLength : Number, thetaStart : Number, thetaLength : Number)

参数类型描述
radiusNumber球体半径。
widthSegmentsNumber经度方向的分段数,默认为8。
heightSegmentsNumber纬度方向的分段数,默认为6。
phiStartNumber起始经度,默认为0。
phiLengthNumber经度范围,默认为2π。
thetaStartNumber起始纬度,默认为0。
thetaLengthNumber纬度范围,默认为π。

TextureLoader (纹理加载器)

用于加载纹理图像。

构造器

THREE.TextureLoader()

方法
  • load(url : String, onLoad : Function, onProgress : Function, onError : Function):加载纹理图像。

MeshPhongMaterial (网格Phong材质)

用于创建一个Phong材质,支持光照效果。

构造器

THREE.MeshPhongMaterial(parameters : Object)

参数类型描述
mapTexture纹理贴图。
colorColor材质颜色。
shininessNumber高光强度,默认为30。

Mesh (网格对象)

用于创建一个网格对象,结合几何体和材质。

构造器

THREE.Mesh(geometry : Geometry, material : Material)

参数类型描述
geometryGeometry几何体。
materialMaterial材质。
方法
  • rotation.set(x : Number, y : Number, z : Number):设置网格对象的旋转角度。

动画循环

使用requestAnimationFrame实现动画循环,不断更新场景并渲染。

function animate() {
    requestAnimationFrame(animate);
    var delta = myClock.getDelta();
    myRenderer.render(myScene, myCamera);
    myMesh.rotation.y += delta / 5;
}

代码

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <script src="ThreeJS/three.js"></script>
    <script src="ThreeJS/jquery.js"></script>
</head>
<body>
<center id="myContainer"></center>
<script>
    // 创建渲染器
    var myRenderer = new THREE.WebGLRenderer({antialias: true});
    myRenderer.setPixelRatio(window.devicePixelRatio);
    myRenderer.setSize(window.innerWidth, window.innerHeight);
    $("#myContainer").append(myRenderer.domElement);

    // 创建时钟
    var myClock = new THREE.Clock();

    // 创建透视相机
    var myCamera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 1, 10000);
    myCamera.position.set(0, 100, 300);
    myCamera.lookAt(new THREE.Vector3(0, 0, 0));

    // 创建场景
    var myScene = new THREE.Scene();
    myScene.background = new THREE.Color('white');

    // 添加环境光
    myScene.add(new THREE.AmbientLight('lightgreen'));

    // 创建球体(地球)
    var myGeometry = new THREE.SphereBufferGeometry(120, 64, 64);
    var myMap = new THREE.TextureLoader().load('images/img007.png');
    var myMaterial = new THREE.MeshPhongMaterial({map: myMap});
    var myMesh = new THREE.Mesh(myGeometry, myMaterial);
    myScene.add(myMesh);

    // 渲染(旋转)球体(地球)
    animate();

    function animate() {
        requestAnimationFrame(animate);
        var delta = myClock.getDelta();
        myRenderer.render(myScene, myCamera);
        myMesh.rotation.y += delta / 5;
    }
</script>
</body>
</html>

演示链接

示例链接

Three.js 中,你可以使用球体的经纬度来转换为三维坐标。下面是一个示例代码片段,展示了如何将经纬度转换为 Three.js 中的坐标: ```javascript // 创建一个场景 const scene = new THREE.Scene(); // 创建一个相机 const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); camera.position.z = 5; // 创建一个渲染器 const renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); // 创建一个球体 const geometry = new THREE.SphereGeometry(1, 32, 32); // 半径为1,分段数为32 const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 }); const earth = new THREE.Mesh(geometry, material); scene.add(earth); // 将经纬度转换为 Three.js 中的坐标 function latLonToVector3(lat, lon, radius) { const phi = (lat * Math.PI) / 180; const theta = ((lon - 180) * Math.PI) / 180; const x = -(radius * Math.cos(phi) * Math.cos(theta)); const y = radius * Math.sin(phi); const z = radius * Math.cos(phi) * Math.sin(theta); return new THREE.Vector3(x, y, z); } // 设置地球的位置 const lat = 40; // 纬度 const lon = -100; // 经度 const radius = 5; // 球体半径 earth.position.copy(latLonToVector3(lat, lon, radius)); // 动画循环 function animate() { requestAnimationFrame(animate); // 使地球旋转 earth.rotation.y += 0.01; // 渲染场景 renderer.render(scene, camera); } // 开始动画循环 animate(); ``` 在这个代码中,我们创建了一个场景、相机和渲染器,创建了一个球体表示地球。然后,我们定义了一个 `latLonToVector3` 函数,用于将经纬度转换为 Three.js 中的坐标。通过调用这个函数设置地球的位置,我们可以将地球放置在指定的经纬度位置上。在动画循环中,我们让地球旋转使用渲染器来渲染场景。 你可以根据需要自定义代码,例如改变球体的材质、调整相机位置或调整地球的半径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MossGrower

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值