【Three.js】一、第一个Three.js项目

【Three.js】一、第一个Three.js项目

一、Three.js下载

Three.js github:https://github.com/mrdoob/three.js

一个WebGL程序包含三大基本对象:场景(sence)、摄像机(camera)、渲染器(renderer)。场景是一个容器,用来保存要渲染的物体与光源。射摄像机用来调整物体视角。渲染器的作用是基于摄像机定义的角度去渲染计算物体的位置。

二、一个Three简单例子

import './index.styl';
import * as THREE from 'three';
import Stats from 'stats-js'; // 检测动画运行时的帧数
import * as dat from 'dat.gui'; // 用于创建右上角控制器

window.onload = init();
var scence;
var camera;
var renderer;
function init() {
    var stats = initStats();
    var controls = new function () {
        this.rotationSpeed = 0.02;
        this.bouncingSpeed = 0.03;
    }
    var gui = new dat.GUI();
    gui.add(controls, 'rotationSpeed', 0, 0.5);
    gui.add(controls, 'bouncingSpeed', 0, 0.5);
    // 创建场景
    scence = new THREE.Scene();
    // 创建相机
    camera = new THREE.PerspectiveCamera(
        45,
        window.innerWidth/window.innerHeight,
        0.1,
        1000);
    // 创建渲染器
    renderer = new THREE.WebGLRenderer();
    renderer.setClearColor(0xEEEEEE, 1.0);
    renderer.setSize(window.innerWidth, window.innerHeight);
    renderer.shadowMapEnabled = true;
    // 轴
    var axes = new THREE.AxisHelper(20);
    scence.add(axes);
    var planeGeometry = new THREE.PlaneGeometry(60, 20, 1, 1);
    var planeMaterial = new THREE.MeshLambertMaterial({
        color: 0xffffff
    });
    var plane = new THREE.Mesh(planeGeometry, planeMaterial);

    plane.rotation.x = -0.5*Math.PI;
    plane.position.x = 15;
    plane.position.y = 0;
    plane.position.z = 0;
    plane.receiveShadow = true;

    var cubeGeometry = new THREE.BoxGeometry(4,4,4);
    var cubeMaterial = new THREE.MeshLambertMaterial({
        color: 0xff0000
    });
    var cube = new THREE.Mesh(cubeGeometry, cubeMaterial);
    cube.position.x = -4;
    cube.position.y = 5;
    cube.position.z = 0;
    cube.castShadow = true;

    var sphereGeometry = new THREE.SphereGeometry(4, 20, 20);
    var sphereMaterial = new THREE.MeshLambertMaterial({
        color: 0x7777ff
    });
    var sphere = new THREE.Mesh(sphereGeometry, sphereMaterial);
    sphere.position.x = 20;
    sphere.position.y = 4;
    sphere.position.z = 2;
    sphere.castShadow = true;


    var spotLight = new THREE.SpotLight(0xffffff);
    spotLight.position.set(-40, 40, -15);
    spotLight.castShadow = true;
    spotLight.shadow.mapSize = new THREE.Vector2(1024,1024);
    spotLight.shadow.camera.far = 130;
    spotLight.shadow.camera.near = 40;

    scence.add(plane);
    scence.add(cube);
    scence.add(sphere);
    scence.add(spotLight);

    var ambienLight = new THREE.AmbientLight(0x353535);
    scence.add(ambienLight);

    camera.position.x = -30;
    camera.position.y = 40;
    camera.position.z = 30;
    camera.lookAt(scence.position);
    document.getElementById('WebGL-output').appendChild(renderer.domElement);
    renderer.render(scence, camera);
}

function initStats(){
    var stats = new Stats();
    stats.showPanel(0);
    document.getElementById('Stats-output').appendChild(stats.domElement);
    return stats;
}

在这里插入图片描述
  上面代码创建了一个平面(plane)、一个立方体(cube)、一个球体(sphere),并建立了一个坐标轴(axes),spotLight是创建的光源,用来产生阴影,ambienLight用来定义环境光。关于坐标轴:红色是x轴,绿色是y轴、蓝色是z轴。
  为了让立方体与小球产生动画效果,添加如下代码:

var step = 0;
function renderScence() {
	stats.update();
	// 立方体旋转
	cube.rotation.x += controls.rotationSpeed;
	cube.rotation.y += controls.rotationSpeed;
	cube.rotation.z += controls.rotationSpeed;
	// 小球跳动
	step += controls.bouncingSpeed;
	sphere.position.x = 20 + (10 * Math.cos(step));
	sphere.position.y = 2 + (10* Math.abs(Math.sin(step)));
	requestAnimationFrame(renderScence);
	renderer.render(scence, camera);
}

renderer.render(scence, camera)改为renderScence(),小球会做一个循环的抛物运动而立方体则自动旋转:
在这里插入图片描述
完整示例:https://github.com/MAXLZ1/threejs_demo

  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

MAXLZ

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

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

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

打赏作者

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

抵扣说明:

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

余额充值